chap 8 条件、循环
1. 序列相关的内建函数:
sorted() 返回一个列表
reversed() 返回反序访问的迭代器
enumerate() 返回迭代器
zip() 返回一个列表
2. python可以在 while 和 for 循环中使用 else 语句. 它们是怎么工作的呢? 在循环中使用时, else子句只在循环完成后执行, 也就是说 break 语句也会跳过 else 块.eg.
3. 迭代器:
提供了可扩展的迭代器接口.
对列表迭代带来了性能上的增强.
在字典迭代中性能提升.
创建真正的迭代接口, 而不是原来的随机对象访问.
与所有已经存在的用户定义的类以及扩展的模拟序列和映射的对象向后兼容
迭代非序列集合(例如映射和文件)时, 可以创建更简洁可读的代码.
4. 使用迭代器:
序列:iter(collection) -> iterator
字典的迭代器会遍历它的键(keys).语句 for eachKey in myDict.keys() 可以缩写为 for eachKey in myDict
文件对象生成的迭代器会自动调用 readline() 方法. 这样, 循环就可以访问文本文件的所有行 . 程 序 员 可 以 使 用 更 简 单 的 for eachLine in myFile 替 换 for eachLine inmyFile.readlines()
5. 创建迭代器:
对一个对象调用 iter() 就可以得到它的迭代器.如果你传递一个参数给 iter() , 它会检查你传递的是不是一个序列, 如果是, 那么很简单:根据索引从 0 一直迭代到序列结束. 另一个创建迭代器的方法是使用类, 我们将在第 13 章详细介绍, 一个实现了 __iter__() 和 next() 方法的类可以作为迭代器使用.如果是传递两个参数给iter(),它会重复地调用func,直到迭代器的下个值等于sentinel
iter(obj)
iter(func, sentinel)
6. 列表解析:
map(lambda x : x**2, range(6)) ---> [x**2 for x in range(6)]
filter(lambda x : x%2, seq) ---> [x for x in seq if x%2] #输出所有x%2为真的元素,即x%2=1,输出所有奇数
矩阵表示:[(x+1,y+1) for x in range(3) for y in range(5)]
文件表示:[word for line in f for word in line.split()]
7. 生成器:列表解析的一个不足就是必要生成所有的数据, 用以创建整个列表. 这可能对有大量数据的迭代器有负面效应. 生成器表达式通过结合列表解析和生成器解决了这个问题.生成器表达式在 Python 2.4 被引入, 它与列表解析非常相似,而且它们的基本语法基本相同;不过它并不真正创建数字列表, 而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目“产生”(yield)出来. 生成器表达式使用了"延迟计算"(lazy evaluation), 所以它在使用内存上更有效.
eg. return max(len(x.strip()) for x in open('/etc/motd')) 寻找文件最长的行
1. 序列相关的内建函数:
sorted() 返回一个列表
reversed() 返回反序访问的迭代器
enumerate() 返回迭代器
zip() 返回一个列表
2. python可以在 while 和 for 循环中使用 else 语句. 它们是怎么工作的呢? 在循环中使用时, else子句只在循环完成后执行, 也就是说 break 语句也会跳过 else 块.eg.
#!/usr/bin/env python
def showMaxFactor(num):
count = num / 2
while count > 1:
if num % count == 0:
print 'largest factor of %d is %d' %(num, count)
break
count -= 1
else:
print num, "is prime"
for eachNum in range(10, 21):
showMaxFactor(eachNum)
3. 迭代器:
提供了可扩展的迭代器接口.
对列表迭代带来了性能上的增强.
在字典迭代中性能提升.
创建真正的迭代接口, 而不是原来的随机对象访问.
与所有已经存在的用户定义的类以及扩展的模拟序列和映射的对象向后兼容
迭代非序列集合(例如映射和文件)时, 可以创建更简洁可读的代码.
4. 使用迭代器:
序列:iter(collection) -> iterator
字典的迭代器会遍历它的键(keys).语句 for eachKey in myDict.keys() 可以缩写为 for eachKey in myDict
文件对象生成的迭代器会自动调用 readline() 方法. 这样, 循环就可以访问文本文件的所有行 . 程 序 员 可 以 使 用 更 简 单 的 for eachLine in myFile 替 换 for eachLine inmyFile.readlines()
5. 创建迭代器:
对一个对象调用 iter() 就可以得到它的迭代器.如果你传递一个参数给 iter() , 它会检查你传递的是不是一个序列, 如果是, 那么很简单:根据索引从 0 一直迭代到序列结束. 另一个创建迭代器的方法是使用类, 我们将在第 13 章详细介绍, 一个实现了 __iter__() 和 next() 方法的类可以作为迭代器使用.如果是传递两个参数给iter(),它会重复地调用func,直到迭代器的下个值等于sentinel
iter(obj)
iter(func, sentinel)
6. 列表解析:
map(lambda x : x**2, range(6)) ---> [x**2 for x in range(6)]
filter(lambda x : x%2, seq) ---> [x for x in seq if x%2] #输出所有x%2为真的元素,即x%2=1,输出所有奇数
矩阵表示:[(x+1,y+1) for x in range(3) for y in range(5)]
文件表示:[word for line in f for word in line.split()]
7. 生成器:列表解析的一个不足就是必要生成所有的数据, 用以创建整个列表. 这可能对有大量数据的迭代器有负面效应. 生成器表达式通过结合列表解析和生成器解决了这个问题.生成器表达式在 Python 2.4 被引入, 它与列表解析非常相似,而且它们的基本语法基本相同;不过它并不真正创建数字列表, 而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目“产生”(yield)出来. 生成器表达式使用了"延迟计算"(lazy evaluation), 所以它在使用内存上更有效.
eg. return max(len(x.strip()) for x in open('/etc/motd')) 寻找文件最长的行