#迭代器
-可迭代(Iterable):直接用于for循环的变量
#可迭代
l = [i for i in range(10)]
for idx in l:
print(idx)
#迭代器(Iterator):不但可以作用于for循环,还可以被next调用
-list是典型的可迭代对象,但不是迭代器
-通过isinstance判断
#可迭代
l = [i for i in range(10)]
#l是可迭代的,但不是迭代器
for idx in l:
print(idx)
#range是个迭代器
for i in range(5):
print(i)
#isinstance案例
#判断某个变量是否是一个实例
#判断是否可迭代
from collections import Iterable
ll = [1,2,3,4,5]
print(isinstance(ll,Iterable))
form collections import Iterator
print(isinstance(ll,Iterator))
#iter函数
s = "siqi is stupid"
print(isinstance(s,Iterable))
print(isinstance(s,Iterator))
s_iter = iter(s)
print(isinstance(s_iter,Iterable))
print(isinstance(s_iter,Iterator))
#生成器
-generator:一边循环一边计算下一个元素的算法
-需要满足以下三个条件:
-每次调用都产生出for循环需要的下一个元素
-如果达到最后一个,报出StopIteration异常
-可以被next调用
-如何生成一个生成器
-直接使用
-手写生成器,如果函数中包含yield,则这个函数就叫生成器
-next调用函数,遇到yield返回
#直接使用生成器
L = [x*x for i in range(5)] #列表生成器
g = (x*x for i in range(5)) #生成器
print(type(L))
print(type(g))
#生成器案例
#在函数中,加入了yield负责返回
def odd():
print("step 1")
yield 1
print("step 2")
yield 2
print("step 3")
yield 3
g= odd()
one = next(g)
print(one)
two = next(g)
print(two)
three = next(g)
print(three)
#for循环调用生成器
#斐波那契数列的生成器写法
def fib(max):
n,a,b = 0,0,1
while n < max:
print(b)
a,b = b,a+b
n += 1
return "done"
g = fib(5)
for i in range(5):
rst = next(g)
print(rst)
#协程
-历史进程
-3.4引入协程,用yield实现
-3.5引入协程语法
-实现的协程比较好的包有asyncio/tornado/gevent
-定义:可百度,我看不懂
-通俗的讲,协程就是一个你可以暂停执行的函数
-协程的实现:
-yield调用
-send调用
#协程案例
def simple_corouting():
print("start")
x = yield
print("end,x")
#主线程
sc = simple_corouting()
print(111)
#可以使用sc.send(None),效果一样
next(sc) #预激
print(2222)
sc.send("siqi")
-协程终止
-协程中未处理的异常会向上冒泡,传给next函数
-方式:发送某个哨符值,让协程退出。
-yield from
-调用协程为了得到返回值,协程必须正常终止
-生成器正常终止会发出StopIteration异常,异常对象的value属性保存返回值
-yield from 从内部捕获StopIteration异常