迭代器
可迭代-直接作用于for循环的变量
迭代器不但可以作用于for循环,还可以被next调用
例如range就是一个迭代器,是否是一个迭代器可以用isinstance判断
案例1
from collections import Iterable
from collections import Iterator
l1=[1,2,3,4]
print(isinstance(l1,Iterable))
print(isinstance(l1,Iterator))
Iter函数
案例2
from collections import Iterable
from collections import Iterator
s='I love TianjinBinhai'
print(isinstance(s,Iterable))
print(isinstance(s,Iterator))
s_iter=iter(s)
print(isinstance(s_iter,Iterable))
print(isinstance(s_iter,Iterator))
生成器
generator:一边循环一边计算下一个元素的机制和算法
三个条件:1-每次调用都生产出for循环需要的下一个元素2-如果达到最后一个,报出StopIterration异常3-可以被next函数调用
#直接使用生成器
案例3
L=[x*x for x in range(5)] #放在中括号中的是列表生成器
g=(x*x for x in range(5)) #放在小括号中的就是生成器
print(type(L))
print(type(g))
#如果函数中包含yield,则这个函数叫做生成器,函数调用遇到yield返回
案例4
#生成器案例
#在函数odd中,yield负责返回
def odd():
print('step 1')
yield 1
print('step 2')
yield 1
print('step 3')
yield 1
one=next(odd())
print(one)
for循环调用生成器
案例5
#斐波那契数列生成器
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,a+b
n=n+1
#需要注意,报出异常的返回值使return的返回值
return 'done'
g=fib(5)
for i in range(6):
rst=next(g)
print(rst)
协程
定义:协程是为非抢占式多任务产生子程序的计算机程序组件,协程允许不同入口点在不同位置暂停或开始执行程序
技术:协程就是一个你可以暂停执行的函数
协程在运行过程中有四个状态:
GEN_CREATE:等待开始执行
GEN_RUNNING:解释器正在执行,这个状态一般看不到
GEN_SUSPENDED:在yield表达式处暂停
GEN_CLOSED:执行结束
协程终止
协程中未处理的异常会向上冒泡,传给next函数或者send方法的调用方(即触发协程的而对象)
终止协程的一种方式:发送某个哨符值。内置的None和Ellipsis等常量经常用作哨符值==。
委派生成器
解释:
- 委派生成器在 yield from 表达式处暂停时,调用方可以直接把数据发给子生成器。
- 子生成器再把产出的值发给调用方。
- 子生成器返回之后,解释器会抛出 StopIteration 异常,并把返回值附加到异常对象上,此时委派生成器会恢复。