一.
更简明的条件表达式
>>> x, y = 4, 3
>>> smaller = x if x < y else y
>>> smaller
3
二 .
xrange() 内建函数
xrange() 类似 range() , 不过当你有一个很大的范围列表时, xrange() 可能更为适合, 因为
它不会在内存里创建列表的完整拷贝. 它只被用在 for 循环中, 在 for 循环外使用它没有意义。
同样地, 你可以想到, 它的性能远高出 range(), 因为它不生成整个列表。
三迭代器和生成器
1.什么是迭代器?
迭代器就是有一个 next() 方法的对象,
而不是通过索引来计数. 当你或是一个循
环机制(例如 for 语句)需要下一个项时, 调用迭代器的 next() 方法就可以获得它. 条目全部取
出后, 会引发一个 StopIteration 异常, 这并不表示错误发生, 只是告诉外部调用者, 迭代完成.
2.
使用迭代器
>>> myTuple = (123, 'xyz', 45.67)
>>> i = iter(myTuple) #创建迭代器
>>> i.next() #获取序列的元素
123
>>> i.next()
'xyz'
>>> i.next()
45.67
>>> i.next()
Traceback (most recent call last): #迭代完成,引发异常
File "", line 1, in ?
StopIteration
除列表外的其他序列都是不可变的, 所以危险就发生在这里. 一个序列的迭代器只是记录你
当前到达第多少个元素, 所以如果你在迭代时改变了元素, 更新会立即反映到你所迭代的条目上.
在迭代字典的 key 时, 你绝对不能改变这个字典. 使用字典的 keys() 方法是可以的, 因为
keys() 返回一个独立于字典的列表.
四
列表解析
1.列表
解析的语法:
[expr for iter_var in iterable]
2.map函数和lambda函数结合
>>> map(lambda x: x ** 2, range(6))
[0, 1, 4, 9, 16, 25]
3filter函数与lambda函数结合
>>> seq = [11, 10, 9, 9, 10, 10, 9, 8, 23, 9, 7, 18, 12, 11, 12]
>>> filter(lambda x: x % 2, seq)
[11, 9, 9, 9, 23, 9, 7, 11]
4.列表解析与if语句的结合
>>> [x for x in seq if x % 2]
[11, 9, 9, 9, 23, 9, 7, 11]
5.双重for循环列表解析
>>> [(x+1,y+1) for x in range(3) for y in range(5)]
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2,
3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]