Generators


与列表生成器的区别

列表生成器:直接将结果全部运算出来,并储存在内存当中 生成器: 本质上还是一个函数,储存在内存当中的是函数,而非运算结果 生成器只有在调用的时候,才会计算并返回生成结果 (生成器属于迭代器的一种)

生成器:(f(x) for x in range(a,b))

生成器的语法与列表生成器几乎一样, 只是将大括号[ ] 换成了圆括号 ( )

生成器须用next( )函数进行调用 next()的特点: 每调用一次,返回下一个运算结果 直到最后一个元素后,返回StopIteration错误

  1. def f(x):
  2. return x*x
  3. g = (f(x) for x in range(1,5))
  4. while 0 != 1:
  5. try:
  6. p = next(g)
  7. ex
  8. #=======================================
  9. #output
  10. 1
  11. 4
  12. 9
  1. def f(x):
  2. return x*x
  3. g = (f(x) for x in range(1,4))
  4. while 0 != 1:
  5. try:
  6. p = next(g)
  7. print(p)
  8. except StopIteration :
  9. print("StopIteration")
  10. break
  11. #=======================================
  12. #output
  13. 1
  14. 4
  15. 9
  16. StopIteration

for 循环

for循环本身就会不断调用next( )函数 当遇到”StopIteration”错误时就会停止循环

  1. def f(x):
  2. return x*x
  3. g = (f(x) for x in range(1,4))
  4. for i in g:
  5. print(i)
  6. #=======================================
  7. #output
  8. 1
  9. 4
  10. 9

迭代器

生成器是迭代器

  1. from collections import Iterable #可迭代对象
  2. from collections import Iterator #迭代器对象
  3. def f(x):
  4. return x*x
  5. g = (f(x) for x in range(1,4))
  6. G1 = isinstance(g, Iterable)
  7. G2 = isinstance(g, Iterator)
  8. print(G1)
  9. print(G1)
  10. #=======================================
  11. #output
  12. True
  13. True