【python】生成器、迭代器

  • 生成器:generator

与列表生成器类似,区别在于生成器是一边循环一边计算,具有“惰性”。
1.创建方法是:把一个列表生成式外层的[]改成()
2.1)通过next(g)方法打印出generator中元素,到计算最后一个元素时出现StopIteration的错误
2.2)通过for循环打印generator元素,不考虑StopIteration的错误
3.斐波拉契数列

def fib(max):
   n, a, b = 0, 0, 1
   while n < max:
       print(b)
       a, b = b, a + b #注意:tuple = (b,a+b),a=t[0],b=t[1]
       n = n + 1         #  b = a+b 中的 a 是未被t[0]赋值的原始a
   return 'done'

4.通过函数创建generator,将上函数中的print(b)改为yield b
5.generator和函数的执行流程区别:
函数是顺序执行,遇到return语句或者最后一行函数语句就返回;generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
6.for循环调用generator时,无return语句的返回值。需通过须捕获StopIteration错误得到。
7.杨辉三角函数,还没写出来,我需要想想。。

>>> def triangles():
...     L = [1]
...     while True:
...         yield L
...         L = [1] + [L[i]+L[i+1] for i in range(0, len(L)-1)] + [1]
...         L.append(1)
...
>>> n = 0
>>> for t in triangles():
...     print(t)
...     n += 1
...     if n == 10:
...         break
  • 迭代器

1.凡是可作用于for循环的对象都是可迭代对象(Iterable)
如:集合数据类型(list、tuple、dict、set、str)和`generator

#判断是否为Iterable类型
>>> from collections import Iterable
>>> isinstance([], Iterable)
True

2.凡是可作用于next()函数的对象都是迭代器(Iterator),表示惰性计算的序列;
如:generator都是、使用iter()函数变成生成器list、dict、str

#判断是否为Iterator类型
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
————————————————————————
#使用iter()函数变成生成器的list
>>> isinstance(iter([]), Iterator)
True

小白的我需要注意:调用generator时,首先要生成一个generator对象(理解为:需要给它个名字)。
如:g = (x * x for x in range(10)) , next(g)
o = odd(), next(o)其中odd()函数为含有yield关键词的generator function

你可能感兴趣的:(【python】生成器、迭代器)