zoukankan      html  css  js  c++  java
  • 迭代器和生成器

       定义一个函数,函数中用 yield 暂停函数,则这个函数就是一个生成器。生成器返回一个迭代器。

       yield 和 return 的区别:

       1. 执行函数时, 到了return ,函数就结束了。 执行到了yield ,暂停, 如果yield 后面还有 语句, 下次调用 __next__() 方法可以继续上次的调用执行。

       2. 执行的方法:函数定义后,函数名后就括号即会执行函数。 但是 如果是一个生成器,函数名后加括号不会执行该函数,需要用生成器的 __next__() 方法来执行。

           即 函数名().__next__()  

       3. return 返回了函数的值,yield 并没有返回函数值,只是暂停函数。

       4. yield 可以接收 send(i) 中传过来的值,即把 i 赋值给 yield 。 例如:在函数中定义: baozi = yield ,函数外, 函数名().send(i)  : 继续从 yield 暂停处执行,并且把 i 赋值给yield 。即send的作用: 继续从yield 处执行,并把参数传给 yield 。

    #--encoding : utf-8 --
    def cash_out(amount):
        while amount > 0:
            amount -= 100
            print("before:"+ str(amount))
            #return amount
            yield "函数暂停"
            print("after:"+ str(amount))
            print("又来取钱了")
    
    atm = cash_out(500)
    print(atm)
    print(atm.__next__())
    
    print(" leave to do something ……")
    print(" 二十年以后……")
    
    print(atm.__next__())
    

      输出结果:

    D:Python34python.exe E:/PycharmProjects/Day3/opentest.py
    <generator object cash_out at 0x02F35C10>
    before:400
    函数暂停
    leave to do something ……
    二十年以后……
    after:400
    又来取钱了
    before:300
    函数暂停

    注: 可以看出,在第一次调用 __next__() 方法后,函数暂停了, 在打印了 “二十年以后……”  , 再次调用 __next__() 方法, 函数接着上次 yield 暂停处继续执行 。yield 相当于函数的一个断点。 yield 会把后面的参数传给 __next__() 。

  • 相关阅读:
    Flink基础(57):FLINK-SQL函数(20) 内置函数(15)日期函数(二)
    Flink基础(56):FLINK-SQL函数(19)内置函数(14)字符串函数(五)
    位示图算法实现大数据的存储
    位示图算法实现大数据的存储
    JobTracker作业启动过程分析
    mysql 查询优化~ 分页优化讲解
    mysql 原理~ index的详解
    指纹识别开发1.0
    java8 base64编码和解码
    Cow Bowling POJ
  • 原文地址:https://www.cnblogs.com/z360519549/p/5184608.html
Copyright © 2011-2022 走看看