携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情
0 环境
- 编辑器:idea或vscode
- 系统版本:windows10
- python版本:3.9.6
1 生成器的惰性求值
如下代码:先定义count方法,变量加while循环,保证yield 值的供给,add方法,则是消费yield弹出的值。
def count():
x = 2
while True:
x += 2
yield x
def add(counter):
return next(counter)
if __name__ == '__main__':
counter = count()
print(add(counter))
print(add(counter))
print(add(counter))
每次都要传入counter,也还挺麻烦的,可不可以把add的方法在优化优化,就想少写个入参,就能得到结果。代码如下:将next方法作为函数的返回值,就可以无参调用了,每次想得到yield弹出值,只就会很方便,而且看着舒服也好多。
def count():
x = 2
while True:
x += 2
yield x
def add1():
c = count()
return lambda : next(c)
if __name__ == '__main__':
inc = add1()
print(inc())
print(inc())
print(inc())
再往下的话,还是使用两个方法,看上也不太优雅,可以和在一起用,可以的,如下代码:可以配合debug看,结果和上面的一样。但是好处就是,我把next方法放在内部,你不知道我是怎么实现的,而你只需要知道每次调用这个add2的方法,就很舒服了不是。对了这里add2方法,返回不能说next(c),只会直接得到一个返回值,并且每次add2调用都是4,。
def add2():
def count():
x = 2
while True:
x += 2
yield x
c = count()
return lambda: next(c)
if __name__ == '__main__':
inc = add2()
print(inc())
print(inc())
print(inc())
2 总结
生成器还有一个优秀的地方,它可以被用来解决递归的问题。因为它不需要再去保护现场了。也就说我一个循环加yield搞定,以前的话,需要方法递归方法,而有了yield了,就会酸爽很多。回到今天的内容,生成器函数加next调用,在一步步的改进下,最终变成了,你只要调用该方法就能得到自己想要的值,不需要再去苦哈哈的去调用next方法,而对于写该方法的人来说,我不需要费力的告诉你它是怎么实现,只需要直接调用即可。