当前位置:Gxlcms > 数据库问题 > [oldboy-django][4python面试]有关yield那些事

[oldboy-django][4python面试]有关yield那些事

时间:2021-07-01 10:21:17 帮助过:21人阅读

f(): print("start") current = yield "hello" print(current=, current) while True: value = yield "bad" # value = value + ‘not‘ # 此行会报错,因为value会为None, 不能和字符串进行相加 g = f() s1 = next(g) print(s1=,s1) # 第一次Next时,停止在第5行, 将yield右边的表达式(无即None)作为next()的返回值 s2 = next(g) print(s2=, s2) # 第二次的next,会将None作为yield表达式" yield hello"的值赋给current, 即current = None # 然后程序往下执行,遇到yield "bad"停止,将yield右边的表达式"bad"作为第二次next的返回值 s3 = next(g) print(s3=,s3) # 第三次next,会将None作为yield表达式”yield bad"的值赋给value, 即value = None, # 程序往下执行,遇到value = yield "bad"停止,将"bad"作为第三次next的返回值 View Code

  send例子:

技术分享图片
def f():
    print("start")
    current = yield "hello"
    print(current=, current)
    while True:
        value = yield "bad"
        print("value=",value)
        # value = value + ‘not‘ # 此行会报错,因为value会为整形, 不能和字符串进行相加

g = f()
s1 = next(g)# 这一步不能少
# 第一次Next时,停止在第5行, 将yield右边的表达式(无即None)作为next()的返回值
print(g.send(10))
# 生成器调用第一次send时,将send参数10代替表达式"yield hello"的值,赋给current,
# 然后程序往下执行,在遇到yield bad停止,将"bad"作为第一次send()函数的返回值返给外界
print(g.send(20))
# 生成器第二次调用send时,将send参数20代替表达式"yield bad"赋给 value
# 程序往下执行,然后遇到yield bad停止,将"bad"作为第二次send()函数的返回值返给外界
View Code

   

 2 yield与生成器generator

  函数里面使用了yield不再是函数,而是一个生成器generator。 比如

def fab(max):  
    n, a, b = 0, 0, 1  
    while n < max:  
        yield b  
        # print b  
        a, b = b, a + b  
        n = n + 1

  当执行g = fab(5)时,不是调用函数,而是实例化一个生成器对象。 当循环g对象或者next(g)时才会调用fab函数里面的代码

技术分享图片
def test():
    # print(‘one‘)
    yield 1
    # print(‘two‘)
    yield 2

g = test()
for i in g:
    print(i)

# 应该和下面效果是一样的:
g = test()
res = next(g)
print(res)
# 首次遇到next()会执行test代码,并停留在yield 1 处,
# 同时将yield 后面表达式的值作为next的返回值返回给外界
#
res = next(g)
print(res)
# 接着上面保存的地方,运行print two,
# 碰到yield 2 ,停止并把后面的2作为Next的返回值返回给外界
View Code

 3 生成器是有状态的,调用者不可反复使用它。比如:

技术分享图片
def test():
    yield 1
    yield 2

g = test()
for i in g:
    print(i)

# 下面这里是没有效果的
for i in g:
    print(hello)
    print(i)
View Code

 

 

 

  

[oldboy-django][4python面试]有关yield那些事

标签:none   djang   实例   cab   send   就会   并且   tor   span   

人气教程排行