读书笔记--Python基础教程 001
name = raw_input('please enter your name: ') or '<unknown>'
换句话说,如果raw_input语句的返回值为真(不是空字符串),那么他的值就会赋给name,否则将默认的‘<unknown>’赋值给name。
这类短路逻辑可以用来实现C和Java中所谓的‘三元运算符’(或条件运算符)。
a if b else c
如果b为真,返回a,否则,返回c。(注意,这个运算符不用引入临时变量,就可以直接使用,从而得到与raw_input例子中同样的结果。)
while 循环
name = ''
while not name: #改为while not name.strip(): 是不是更合理呢?!
name = raw_input('please enter your name: ')
print 'Hello, %s!' %name
这个简单的while循环,让输入name,但是没有考虑到name 是空格的情况,是空格了虽然不报错,你也不知道名字啊啊啊啊,嘿嘿
for 循环
words = ['this', 'is', 'an', 'ex', 'parrot']
for word in words:
print word
因为迭代(循环的另外一种说法)某范围的数字是常见的,所以有个内建的范围函数供使用:
>>> range(0,10) #话说此函数又下限(即0),但不包含上限()
[0,1,2,3,4,5,6,7,8,9]
_____________________________________________________
提示:如果能使用for循环,就尽量不要使用while 循环。
当然还有个xrange 函数,当迭代一个巨大的序列时 xrange函数 会更高效,不过一般就算了。
一些迭代工具:
并行迭代
names = ['anne', 'beth', 'george', 'damon']
ages = [12, 34,23,103]
如果想打印名字和对应的年龄,可以向下面这样做:
for i in range(len(names)):
print names[i], 'is', ages[i], 'years old'
而内建的 zip 函数就可以用来进行并行迭代,可以把两个序列‘压缩’在一起,然后返回一个元组的列表:
>>>zip(names, ages)
[('anne', 12), ('beth', 34), ('george', 23), ('damon', 103)]
现在我可以在循环中解包元组:
for name, age in zip(names, ages):
print name , 'is', age, 'years old'
zip 函数也可以作用于任意多的序列。 关于它很重要的一点是zip可以处理不等长的序列,当最短的序列 “用完” 的时候就会停止。
for example #(容我卖弄风骚一下,呵呵)
>>>zip(range(5), xrange(10000000))
[(0,0), (1,1), (2,2), (3,3), (4,4)]
在上面的代码中,不推荐使用range 替换xrange ——尽管只需要前5个数字, 但是range会计算所有的数字,这要花费很长的时间。
而使用xrange就没有这个问题了,它只计算前5个数字。
for index, string in enumerate(strings):
if 'xxx' in string:
string[index] = '[censored]'
enumerate这个函数可以在提供索引的地方迭代 “索引-值” 对。
循环中的else子句
from math import sqrt
for n in range(99,81, -1):
root = sqrt(n)
if root == int(root):
print n
break
else:
print 'Didnt find it !'
列表推导式——轻量级循环
列表推导式(list comprehension)是利用其它列表创建新列表(类似数学术语中的集合推导式)的一种方法。
>>>[x*x for x in range(10)]
[0,1,4,9,16,25,36,49,64,81]
>>>[x*x for x in range(10) if x%3 == 0 ]
[0,9,36,81]
也可以增加更多for 语句的部分:
>>>[(x,y) for x in range(3) for y in range(3)]
[(0,0), (0,1), (0,2), (1,0), (1,1), ……]
作为对比,下面的代码使用两个for 语句创建了相同的列表:
result = []
for x in range(3):
for y in range(3):
result.append((x,y))
pass、del、exec