Python
一边循环一边计算
生成器
- next
- 取一个生成器的值(原理类似for)
- yield
- 定义一个生成器(起到暂停与结束函数循环/抛出值的作用)
- 应用场景
- 协程
代码示例:
# 格式01:
foo.__next__()
# 格式02:
next(foo)
# 列表推导式格式:
foo = (i * 3 for i in range(15))
while True:
try:
bar = next(foo)
print(bar)
except:
break
# 函数格式:
def foo():
n = 0
while n < 2:
n += 1
yield n # 抛出值
return '超范围' # 报错提示语
bar = foo() # 接收抛出的值
print(next(bar)) # 1
print(next(bar)) # 2
print(next(bar)) # 超范围
传值
send:给生成器传值(值给了yield对应的变量名,先赋值再继续执行yield,此函数需要锁定行数)
代码示例:
def foo():
n = 0
while n < 5:
bar = yield n # 'yield n'本身不能给bar赋值,所以bar的值是None
print(bar)
n += 1
return '超范围'
G = foo()
print(next(G))
print(next(G))
print(next(G))
'''
0
None
1
None
2
'''
# 传值:
G.send(None) # 先执行一次生成器,至yield暂停(只能传None,因为还没锁定行数就赋值会报错)
P = G.send('P') # 给bar赋值,并执行一次生成器(接收yield返出的值)
print(P)
'''
P
1
'''
多任务
代码示例:
def foo(args):
for i in range(args):
print('foo')
yield None # 单单使用暂停函数循环功能(往外返出一个空值)
def bar(args):
for i in range(args):
print('bar')
yield None
G1 = foo(2)
G2 = bar(2)
while True:
try:
next(G1)
next(G2)
except:
break
'''
foo
bar
foo
bar
'''