习题36、设计和调试
If 语句的规则
- 每一个
if 语句
必须包含一个else
. - 如果这个
else
永远都不应该被执行到,因为它本身没有任何意义,那你必须在 else 语句后面使用一个叫做die
的函数,让它打印出错误信息并且死给你看,这和上一节的习题类似,这样你可以找到很多的错误。 if 语句
的嵌套不要超过 2 层,最好尽量保持只有 1 层。 这意味着如果你在 if 里边又有了一个if
,那你就需要把第二个 if 移到另一个函数里面。- 将
if 语句
当做段落来对待,其中的每一个if
,elif
,else
组合就跟一个段落的句子组合一样。在这种组合的最前面和最后面留一个空行以作区分。 - 你的布尔测试应该很简单,如果它们很复杂的话,你需要将它们的运算事先放到一个变量里,并
且为变量取一个好名字。
循环的规则
- 只有在循环永不停止时使用
while 循环
,这意味着你可能永远都用不到。这条只有 Python中成立,其他的语言另当别论。 - 其他类型的循环都使用
for 循环
,尤其是在循环的对象数量固定或者有限的情况下。
调试(debug)的小技巧
- 不要使用
debugger
。Debugger
所作的相当于对病人的全身扫描。你并不会得到某方面的有用信息,而且你会发现它输出的信息态度,而且大部分没有用,或者只会让你更困惑。 - 最好的调试程序的方法是使用
print
在各个你想要检查的关键环节将关键变量打印出来,从而检查哪里是否有错。 - 让程序一部分一部分地运行起来。不要等一个很长的脚本写完后才去运行它。写一点,运行一点,再修改一点。
习题37、复习各种符号
Keywords(关键字)
- and
- del
- from
- not
- while
- as
- elif
- global
- or
- with
- assert
- else
- if
- pass
- yield
- break
- except
- import
- 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
小结
- 你不是说别用
while-loop
吗?
是的。你要记住,有时候如果你有很好的理由,那么规则也是可以打破的。死守着规则不放的人是白痴。stuff[3:5]
实现了什么功能?
这是一个列表切片动作,它会从 stuff 列表的第 3 个元素开始取值,直到第 5 个元素。注意,这里并不包含第 5 个元素,这跟range(3,5)
的情况是一样的。- 为什么
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()
小结
- 列表和字典有何不同?
列表是有序排列的一些物件,而字典是将一些物件(keys)对应到另外一些物件(values)的数据结构。- 字典能用在哪里?
各种你需要通过某个值去查看另一个值的场合。其实你可以把字典当做一个“查询表”。- 列表能用在哪里?
列表是专供有序排列的数据使用的。你只要知道索引就能查到对应的值了。- 有没有办法弄一个可以排序的字典?
看看 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()
小结
- 为什么创建
_init__
或者别的类函数时需要多加一个 self 变量?
如果你不加self
,cheese = 'Frank'
这样的代码意义就不明确了,它指的既可能是实例的 cheese 属性,或者一个叫做cheese
的局部变量。有了self.cheese ='Frank'
你就清楚地知道了这指的是实例的属性self.cheese
。