生成器 迭代器

1.生成器
特点:只负责生产,只能往前走,不能回退,生产结束时,若在生产,就报错StopIteration

列表生成式:a = [i for i in range(10)] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
生成器:一边循环一边计算的机制称为生成器 ,通过next()调用下一个元素

  b = (i for i in range(10)) = <generator object <genexpr> at 0x000001A2AACF3048>

  next(b)   b.__next__()   b.send('ok')   for i in b:   while True     这三种方法生产完成后,只有for不会报错StopIteration

                                                           print(i)        next(b)

1.1.生成器的2种创建方式:

 1   b = (i for i in range(10))
 2 
 3   def fib(max):        
 4     n,a,b=0,0,1
 5     while n < max:
 6         yield b
 7         a,b=b,a+b
 8         n += 1
 9 
10   def range(n):
11         count = 0
12     while count < n:
13         yield count
14         return 'ss'
15         count+=1
16 
17   
18   def fib(max):
19     n,a,b=0,0,1
20     while n <max:
21         sign = yield b
22         print(sign)
23         if sign == 'stop':
24             break
25         a,b=b,a+b
26         n += 1
27    b=fib(13)
28    next(b)
29    b.__next__()
30    b.send('ok')
31    b.send('stop')

总结:yield
      1.函数有了yield之后,函数名加()就得到了一个生成器
      2.函数有了yield之后,return在生成器里,代表生成器的终止直接报错
      3.函数有了yield之后,函数的每个运行过程都可以拿到,处理大文件比较适合

return与yield的区别:
     1.return 返回数据 并终止function
     2.yield 返回数据 并冻结当前的执行过程,要想启动,就得next()。next()唤醒后,继续执行,直到遇到下一个yield

----------------------------------------------------

2.迭代器

2.1.可迭代对象(Iterable): list tuple dict set str
                                         generator yield的generator function

      判断是否是可迭代对象:---->可直接作用于for循环的对象是可迭代对象
      >>> from collections import Iterable
      >>> isinstance([1,2,3],Iterable)
     True

2.2.迭代器(Iterator):可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

     判断是否是迭代器:----->生成器是迭代器的一种。
     >>> from collections import Iterator
     >>> isinstance([1,2,3],Iterator)
     False
     >>> isinstance((i for i in range(10)),Iterator)
     True

2.3.可迭代对象list tuple dict set str 使用iter()函数可以变成迭代器
    >>> from collections import Iterator
    >>> isinstance([1,2,3],Iterator)
    False
    >>> isinstance(iter([1,2,3]),Iterator)
    True

2.4.迭代器对象表示一个数据流,不知道什么时候截止,不能使用len(),直到没有数据抛出StopIteration
      数据流可以看作是一个有序序列,不知道长度,只能通过next()调用

原文地址:https://www.cnblogs.com/alice-bj/p/8452666.html