Python

一边循环一边计算

生成器

  1. next
    • 取一个生成器的值(原理类似for)
  2. yield
    • 定义一个生成器(起到暂停与结束函数循环/抛出值的作用)
  3. 应用场景
    • 协程

代码示例:

# 格式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
'''