zoukankan      html  css  js  c++  java
  • python——函数 19、生成器

    一、什么是生成器?

          答:当函数体内有yield的关键字时就叫做生成器

    def foo():
        print('a')
        yield 1
        print('b')
        yield 2
        print('c')
        yield 3
    x=foo()
    print(x.__next__())
    print(x.__next__())

    可以看出 1、生成器就是迭代器

                    2、yield与return一样 都是返回值 (区别?向下继续看)

    既然生成器就是迭代器 那就可以用for循环来实现一下这个

    def foo():
        print('a')
        yield 1
        print('b')
        yield 2
        print('c')
        yield 3
        print('d')
    x=foo()
    for i in x:
        pass
    在迭代器里已经说过for循环原理
    像这个for循环 for i in x: (#obj=x.__iter__#obj.__next__)
    def foo():
        print('a')
        yield 1
        print('b')
        yield 2
        print('c')
        yield 3
        print('d')
    x=foo()
    for i in x:
        print(i)#将每次next返回值打出来
    每一个next都会print一次 所以打印的结果如下图: 可以看到d是没有返回值的 在迭代器里 就会报出StopIteration但是for循环里他会自动捕捉所以就不会报异常

    二、yield的功能

                             1、把函数的最后执行结果做成迭代器

                             2、yield与return类似,只不过是yield可以返回多个值,而return只能返回一个值

                             3、遵循迭代器取值方式 obj.__next__(),触发函数执行,当运行一次obj.__next__()时函数就会停到第一个yield,也就是说你写几个obj.__next__()你函数就停在第几个yield

    例子:

    def foo(x):
        print('play')
        while x>0:
            yield x
            x-=1
        print('game over')
    g=foo(5)
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())

    当然 这样会报一个StopIteration的异常,前面已经说过既然是迭代器也可以这么改一下代码:

    def foo(x):
        print('play')
        while x>0:
            yield x
            x-=1
        print('game over')
    g=foo(5)
    for i in g:
        print(i)

    不再写g.__next__() ,把它改为for循环 就可以自动捕捉异常 不会再报出StopIteration异常

  • 相关阅读:
    RuntimeError: Object: Could not open SDE workspace
    数字证书原理
    ie浏览器总跳转到 http://hao.360.cn
    ArcCatalog连接ArcSDE连接报:unable to create new database connection file,permission is denied
    卸载重装ArcGIS Enterprise 注意事项
    修改机器名、IP对arcgis server、portal的影响?
    arcpy调试
    jquery的show/hide/toggle详解
    jquery的回调对象Callbacks详解
    元素全屏居中(不变形)
  • 原文地址:https://www.cnblogs.com/StevenSunYiwen/p/9358683.html
Copyright © 2011-2022 走看看