Python 协程(1)

迭代器

可迭代-直接作用于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等常量经常用作哨符值==。

委派生成器

解释:

  1. 委派生成器在 yield from 表达式处暂停时,调用方可以直接把数据发给子生成器。
  2. 子生成器再把产出的值发给调用方。
  3. 子生成器返回之后,解释器会抛出 StopIteration 异常,并把返回值附加到异常对象上,此时委派生成器会恢复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值