python函数式生成器的简单介绍( 四 )


的比例 。显然 , 我们需要先求出全国的总人口,然后在遍历每个省份的人口,用每个省的人口数除以总人
口数 , 就得到了每个省份的人口占全国人口的比例 。
如下所示:
def get_province_population(filename):
with open(filename) as f:
for line in f:
yield int(line)
gen = get_province_population('data.txt')
all_population = sum(gen)
#print all_population
for population in gen:
print population / all_population
执行上面这段代码 , 将不会有任何输出 , 这是因为,生成器只能遍历一次 。在我们执行sum语句的时候 , 
就遍历了我们的生成器 , 当我们再次遍历我们的生成器的时候 , 将不会有任何记录 。所以 , 上面的代码不
会有任何输出 。
因此,生成器的唯一注意事项就是:生成器只能遍历一次 。
5. 总结
2017/11/6 如何更好地理解Python迭代器和生成器? - 知乎
5/5
本文深入浅出地介绍了Python中,一个容易被大家忽略的重要特性 , 即Python的生成器 。为了讲解生成
器 , 本文先介绍了迭代器协议 , 然后介绍了生成器函数和生成器表达式,并通过示例演示了生成器的优点
和注意事项 。在实际工作中,充分利用Python生成器,不但能够减少内存使用,还能够提高代码可读性 。
掌握生成器也是Python高手的标配 。希望本文能够帮助大家理解Python的生成器
Python中生成器表达式的理解?9.11. 生成器表达式
有时简单python函数式生成器的生成器可以用简洁python函数式生成器的方式调用python函数式生成器,就像不带中括号的链表推导式 。这些表达式是为函数调用生成器而设计的 。生成器表达式比完整的生成器定义更简洁python函数式生成器,但是没有那么多变,而且通常比等价的链表推导式更容易记 。
例如:
sum(i*i for i in range(10))# sum of squares
285
xvec = [10, 20, 30]
yvec = [7, 5, 3]
sum(x*y for x,y in zip(xvec, yvec))# dot product
260
from math import pi, sin
sine_table = {x: sin(x*pi/180) for x in range(0, 91)}
unique_words = set(wordfor line in pagefor word in line.split())
valedictorian = max((student.gpa, student.name) for student in graduates)
data = 'https://www.04ip.com/post/golf'
list(data[i] for i in range(len(data)-1, -1, -1))
['f', 'l', 'o', 'g']
Footnotes
[1] 有一个例外 。模块对象有一个隐秘的只读对象,名为 __dict__,它返回用于实现模块命名空间的字典,命名 __dict__ 是一个属性而非全局命名 。显然,使用它违反了命名空间实现的抽象原则,应该被严格限制于调试中 。
python生成器到底有什么优点?在Python这门语言中,生成器毫无疑问是最有用的特性之一 。与此同时,也是使用的最不广泛的Python特性之一 。究其原因,主要是因为,在其他主流语言里面没有生成器的概念 。正是由于生成器是一个“新”的东西,所以,它一方面没有引起广大工程师的重视,另一方面,也增加了工程师的学习成本,最终导致大家错过了Python中如此有用的一个特性 。
1. 迭代器协议
由于生成器自动实现了迭代器协议 , 而迭代器协议对很多人来说,也是一个较为抽象的概念 。所以,为了更好的理解生成器,我们需要简单的回顾一下迭代器协议的概念 。
迭代器协议是指:对象需要提供next方法 , 它要么返回迭代中的下一项,要么就引起一个StopIteration异常 , 以终止迭代
可迭代对象就是:实现了迭代器协议的对象

推荐阅读