python-迭代器、生成器及协程-26

#迭代器
-可迭代(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异常

猜你喜欢

转载自www.cnblogs.com/houziaipangqi/p/9637320.html