python笔记 生成器下

携手创作,共同成长!这是我参与「掘金日新计划 · 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))

image.png

每次都要传入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())

image.png

再往下的话,还是使用两个方法,看上也不太优雅,可以和在一起用,可以的,如下代码:可以配合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())

image.png

2 总结

生成器还有一个优秀的地方,它可以被用来解决递归的问题。因为它不需要再去保护现场了。也就说我一个循环加yield搞定,以前的话,需要方法递归方法,而有了yield了,就会酸爽很多。回到今天的内容,生成器函数加next调用,在一步步的改进下,最终变成了,你只要调用该方法就能得到自己想要的值,不需要再去苦哈哈的去调用next方法,而对于写该方法的人来说,我不需要费力的告诉你它是怎么实现,只需要直接调用即可。

猜你喜欢

转载自juejin.im/post/7127501947443085325
今日推荐