zoukankan      html  css  js  c++  java
  • 生成器函数及生成器的基本用法

    初识生成器

      只要函数中有yield的,就是生成器函数,(生成器函数只是生成可迭代的对象).

      yield的特性:

            1.和return差不多,都可以做返回值.

            2.只要在函数执行的过程中遇到了yield,就会暂停这个函数的运行,并返回yield后面值

            3.下次再执行这个函数就会从上一次暂停的地方重新往下执行

    # def outer():
    # 	print("马云")
    # 	yield '阿里巴巴'
    # 	print('马化腾')
    # 	yield '腾讯'
    # 	print('刘强东')
    # 	yield '京东'
    
    # ger = outer()
    # print(ger)      # 生成的是一个生成器
    # <generator object outer at 0x0000000002761F10>
    

     如何使用这个生成器 

       生成器是生成一个可迭代的对象,之前的list,str,dict等都是可迭代的对象,方法一致.

      2.1 方法一 

    # r1 = ger.__next__()     # 执行"__next__"是打印第一个yield之前的内容,r1接受的是第一个yield的返回值
    # print(r1)
    # 结果:
    # 马云
    # 阿里巴巴
    
    # 每一次执行生成器的"__next__"就是执行到下一个yield的出现
    # r2 = ger.__next__()
    # print(r2)
    # 结果:
    # 马云
    # 阿里巴巴
    # 马化腾
    # 腾讯
    

      

      2.2 方法二

    def outer():
    	print("马云")
    	yield '阿里巴巴'
    	print('马化腾')
    	yield '腾讯'
    	print('刘强东')
    	yield '京东'
    
    ger = outer()       # 这就是生成器函数"outer"的迭代器
    for i in ger:       #只要是可迭代的对象,for循环都可以进行迭代,迭代器既是可迭代对象,也是迭代器,所以可以使用for循环
    	print(i)
    # 结果:
    # 马云
    # 阿里巴巴
    # 马化腾
    # 腾讯
    # 刘强东
    # 京东
    

      2.3 方法三

      

    def outer():
    	print("马云")
    	yield '阿里巴巴'
    	print('马化腾')
    	yield '腾讯'
    	print('刘强东')
    	yield '京东'
    
    ger = outer()
    print(list(ger))        # 把yield的返回值放进一个列表,并以此执行函数里的代码
    

    send使用

    def outer():
    	print("马云")
    	a = yield '阿里巴巴'
    	print('我是a',a)
    	print('马化腾')
    	b = yield '腾讯'
    	print('我是b',b)
    	print('刘强东')
    	yield '京东'
    
    
    ger = outer()
    ger.__next__()
    ger.send("a")       
    ger.send("b")
    # 结果:
    # 马云
    # 我是a a
    # 马化腾
    # 我是b b
    # 刘强东
    

      

    send的执行过程

      

       3.2 __next__() 和 .send() 的区别,和注意事项

        1.send和next都是让生成器往下在执行一个yield.

        2.send可以上一个yield的位置传递一个值,不能给最后一个yield传递值,因为yield是给上一个yield传递一个值,所以第一次访问生成器,不能是send,只能是__next__()

    生成器表达式

    # 生成器表达式
    # gen = (n for n in range(1,6))
    # print(gen)      # gen是一个迭代器.迭代器需要使用"__next__"或迭代,来访问生成器里面的代码.
    # 结果:<generator object <genexpr> at 0x00000000028120A0>
    

      

  • 相关阅读:
    variant conversion error for variable:v8
    oracle第二步创建表空间、用户、授权
    Java WEB 乱码解决大全
    跳转的两种方式(转发与重定向)
    jsp页面中 <%%> <%! %>, <%=%> <%-- --%>有什么区别
    Web.xml中Filter过滤器标签几个说明
    SSH面试题(struts2+Spring+hibernate)
    做一个java项目要经过那些正规的步骤
    web.xml 配置中classpath: 与classpath*:的区别
    Web.xml配置详解之context-param
  • 原文地址:https://www.cnblogs.com/594504110python/p/9330760.html
Copyright © 2011-2022 走看看