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异常

  • 相关阅读:
    CI框架基本配置/教你学习CI框架codelgniter
    CI框架 简介
    PHP CI框架目录结构及运行机制
    [老老实实学WCF] 第三篇 在IIS中寄存服务
    [老老实实学WCF] 第二篇 配置WCF
    [老老实实学WCF] 第一篇 Hello WCF
    Js获取当前日期时间及其它操作
    当<script>中的type等于text/html的妙用
    asp.net MVC3 仿照博客园功能 异常处理
    jquery.validate使用攻略
  • 原文地址:https://www.cnblogs.com/StevenSunYiwen/p/9358683.html
Copyright © 2011-2022 走看看