笨方法学Python(36-40)

习题36、设计和调试

If 语句的规则

  1. 每一个if 语句必须包含一个else.
  2. 如果这个else永远都不应该被执行到,因为它本身没有任何意义,那你必须在 else 语句后面使用一个叫做 die的函数,让它打印出错误信息并且死给你看,这和上一节的习题类似,这样你可以找到很多的错误。
  3. if 语句的嵌套不要超过 2 层,最好尽量保持只有 1 层。 这意味着如果你在 if 里边又有了一个if,那你就需要把第二个 if 移到另一个函数里面。
  4. if 语句当做段落来对待,其中的每一个if,elif,else组合就跟一个段落的句子组合一样。在这种组合的最前面和最后面留一个空行以作区分。
  5. 你的布尔测试应该很简单,如果它们很复杂的话,你需要将它们的运算事先放到一个变量里,并
    且为变量取一个好名字。

循环的规则

  1. 只有在循环永不停止时使用while 循环,这意味着你可能永远都用不到。这条只有 Python中成立,其他的语言另当别论。
  2. 其他类型的循环都使用for 循环,尤其是在循环的对象数量固定或者有限的情况下。

调试(debug)的小技巧

  1. 不要使用 debuggerDebugger所作的相当于对病人的全身扫描。你并不会得到某方面的有用信息,而且你会发现它输出的信息态度,而且大部分没有用,或者只会让你更困惑。
  2. 最好的调试程序的方法是使用print在各个你想要检查的关键环节将关键变量打印出来,从而检查哪里是否有错。
  3. 让程序一部分一部分地运行起来。不要等一个很长的脚本写完后才去运行它。写一点,运行一点,再修改一点。

习题37、复习各种符号

Keywords(关键字)

  • and
  • del
  • from
  • not
  • while
  • as
  • elif
  • global
  • or
  • with
  • assert
  • else
  • if
  • pass
  • yield
  • break
  • except
  • import
  • print
  • class
  • exec
  • in
  • raise
  • continue
  • finally
  • is
  • return
  • def
  • for
  • lambda
  • try

数据类型

  • True
  • False
  • None
  • strings
  • numbers
  • floats
  • lists

字符串转义序列(Escape Sequences)

  • \
  • \’
  • \”
  • \a
  • \b
  • \f
  • \n
  • \r
  • \t
  • \v

字符串格式化(String Formats)

  • %d
  • %i
  • %o
  • %u
  • %x
  • %X
  • %e
  • %E
  • %f
  • %F
  • %g
  • %G
  • %c
  • %r
  • %s
  • %%

操作符

习题38、列表的操作

#!/usr/bin/python
# -*- coding:utf-8 -*-

states = {
    'Oregon': 'OR',
    'Florida': 'FL',
    'California': 'CA',
    'New York': 'NY',
    'Michigan': 'MI'
}

cities = {
    'CA': 'San Francisco',
    'MI': 'Detorit',
    'FL': 'Jacksonville'
}

cities['NY'] = 'New York'
cities['OR'] = 'Protland'

print '-' * 10
print "NY State has: ", cities['NY']
print "OR State has: ", cities['OR']

print '-' * 10
print "Michigan's abreviation is: ", states['Michigan'] 
print "Florida's abbreviation is: ", states['Florida']

print '-' * 10
for state, abbrev in states.items():
    print "%s has the city %s" % (state, abbrev)

print '-' * 10
for state, abbrev in states.items():
    print "%s state is abbreviated %s and has city %s" % (
        state, abbrev, cities[abbrev])

print '-' * 10
state = states.get('Texas', None)

if not state:
    print "Sorry, no Texas."

city = cities.get('TX', 'Does Not Exist')
print "The city for the state 'TX' is: %s" % city   

小结

  1. 你不是说别用while-loop吗?
    是的。你要记住,有时候如果你有很好的理由,那么规则也是可以打破的。死守着规则不放的人是白痴。
  2. stuff[3:5] 实现了什么功能?
    这是一个列表切片动作,它会从 stuff 列表的第 3 个元素开始取值,直到第 5 个元素。注意,这里并不包含第 5 个元素,这跟range(3,5)的情况是一样的。
  3. 为什么join(' ', stuff)不灵?
    join 的文档写得有问题。其实它不是这么工作的,其实它是你要插入的字符串的一个方法函数,函数的参数是你要连接的字符串构成的数组,所以应该写作' '.join(stuff)

习题39、字典,可爱的字典

字典 可以将一个物件和另外一个东西关联,不管它们的类型是什么。

#!/usr/bin/python
# -*- coding:utf-8 -*-

class Song(object):

    def __init__(self, lyrics):
        self.lyrics = lyrics

    def sing_me_a_song(self):
        for line in self.lyrics:
            print line

happy_bady = Song(["Happey birthday to you",
                   "I don't want to get sued",
                   "So I'll stop right there"])

bulls_on_parade = Song(["They rally around the family",
                       "With pockets full of shells"])

happy_bady.sing_me_a_song()

bulls_on_parade.sing_me_a_song()

小结

  1. 列表和字典有何不同?
    列表是有序排列的一些物件,而字典是将一些物件(keys)对应到另外一些物件(values)的数据结构。
  2. 字典能用在哪里?
    各种你需要通过某个值去查看另一个值的场合。其实你可以把字典当做一个“查询表”。
  3. 列表能用在哪里?
    列表是专供有序排列的数据使用的。你只要知道索引就能查到对应的值了。
  4. 有没有办法弄一个可以排序的字典?
    看看 Python 里的collections.OrderedDict数据结构。上网搜索一下文档和用法。

习题40、模块,类,对象

对于字典来说,key是一个字符串,获得值的语法是[key]。对于模块来说,key是函数或者变量的名称,而语法是.key。除了这个,它们基本上就没什么区别了。

#!/usr/bin/python
# -*- coding:utf-8 -*-

class Song(object):

    def __init__(self, lyrics):
        self.lyrics = lyrics

    def sing_me_a_song(self):
        for line in self.lyrics:
            print line

happy_bady = Song(["Happey birthday to you",
                   "I don't want to get sued",
                   "So I'll stop right there"])

bulls_on_parade = Song(["They rally around the family",
                       "With pockets full of shells"])

happy_bady.sing_me_a_song()

bulls_on_parade.sing_me_a_song()

小结

  1. 为什么创建 _init__或者别的类函数时需要多加一个 self 变量?
    如果你不加 selfcheese = 'Frank'这样的代码意义就不明确了,它指的既可能是实例的 cheese 属性,或者一个叫做cheese的局部变量。有了self.cheese ='Frank'你就清楚地知道了这指的是实例的属性self.cheese
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章