zoukankan      html  css  js  c++  java
  • yield的表达式形式与内置函数

    yield的功能:
      1. 与return类似,都可以返回值,不一样在于,yield可以返回多个值而且可暂停,再次执行可继续下一步操作,return到了就停止不在继续运行。
      2.为封装好的的函数能够使用__iter__和__next__方法,
      3.遵循迭代器的取值方式 .__next__(),触发函数的执行和函数的保存都是通过yeild保存的。  .
     
    一:yield的表达式形式
    def foo():
        print('starting')
        while True:
            x=yield        #yield的表达式形式
            print('value :   ',x) 
    
    g=foo()
    next(g)      #next(g)==g.semd(None)
    g.send(2)   #send的效果:1.将携带的值传给yield,注意是yiled,而不是x,然后yiled赋值给x  2.send()方法具有和next()方法一样的功能,也就是继续执行,直到碰到yield结束.
    View Code

    yield表达式形式(例如: x = yield)下,生成器会有一个send的操作:  

    #send的效果:
    # 1:先从为暂停位置的那个yield传一个值,然后yield会把值赋值x
    # 2:与next的功能一样
      #3: send传多个值时,必须以元组的形式
    def foo():
        print('starting')
        while True:
            x=yield
            print('value:',x)
    
    foo()  
    #next(g)
    # g.send(1)
    
    foo()#不执行print('starting'),因为定义该函数,解释器在检测语法的时候,检测到有yield,那么在执行该函数的时候就不会打印。
    
    g.send(1)       ###send 有///传值+next的功能,传值给yield,再赋值给x,再接着往后走,直到下一个yield停止。 
        g.send-----1567890`124680>首先要给一个初始化的值,才能再g.send(1)传值
    View Code

    案例:

    def good(func):
        def good1(*args,**kwargs):
            g=func(*args,**kwargs)
            next(g)
            return g
        return good1
    
    @good
    def eater(name):
        print('%s starting to eat '%name)
        food_list=[]
        while True:
            food=yield food_list
            food_list.append(food)
            print('%s start to eat %s'%(name,food))
            print(food_list)
    
    m=eater('jason')
    m.send('火腿')
    View Code

     注意点:

    既然send()方法有和next一样的作用,那么我们可不可以这样做:

    def foo():
        while True:
            x = yield              #函数有yield,函数执行的结果就是生成器,即foo()就是生成器。而要执行的话就需要next(g).
            print("value:",x)
    
    g = foo()
    g.send(1) #执行给yield传值,这样行不行呢?

    很明显,是不行的;

    TypeError: can't send non-None value to a just-started generator

    错误提示:不能传递一个非空值给一个未启动的生成器。

      也就是说,在一个生成器函数未启动之前,是不能传递数值进去。必须先传递一个None进去或者调用一次next(g)方法,才能进行传值操作。

    三:内置函数

    abs(x)            #取绝对值,如果是复数,返回值是该复数的模
    divomd(x,y)     #函数完成除法运算,返回商和余数
    isinstance(object,type)    #判断对象是不是此类型
    chr()                 #函数返回ASCII码对应的字符串    
    ord()                   #函数返回字符串对应的ASCII码
    max(),min()      #返回函数的最大值与最小值(字母:z>a)

     内置函数实例/:

    func2=lambda x:x**2  #匿名函数:相当于return x**2
    
    # map:映射
    # l=[1,2,3,4]
    # m=map(lambda x:x**2,l)
    
    #reduce:合并
    from functools import reduce
    print(reduce(lambda x,y:x+y,range(100),100))
    
    # filter:过滤
    # names=['alex_sb','yuanhao_sb','wupeiqi_sb','egon']
    # print(list(filter(lambda name:name.endswith('_sb'),names)))
    
    # #sorted  升序
    # l=[1,2,4,9,-1]
    # print(sorted(l)) #从小到大
    # print(sorted(l,reverse=True)) #从大到小
    View Code
    # s='hello'
    # l=[1,2,3]
    #
    # for i in zip(s,l):    #拉链,s,l 一一随对应
    #     print(i)
    
    
    l=['a','b','c']
    for i in enumerate(l):
        print(i)                  #
    =========结果==========
    (0, 'a')
    (1, 'b')
    (2, 'c')
    View Code
  • 相关阅读:
    python相关软件安装流程图解————————pycharm安装——————pycharm-professional-2018.3.1
    爬虫——python——百度地图经纬度查询——经纬度查看地点地名——利用百度API获取地名经纬度——爬取所有的中国地址
    博客园自定义美化——博客园公告功能(公告栏圆形时钟)——博客园公告栏圆形时钟功能
    博客园自定义美化——博客园页脚功能(底部简介关注打赏)——博客园文章个性签名功能
    博客园自定义美化——博客园页首功能(右侧悬浮打赏)——右侧添加悬浮打赏功能
    Django项目:CMDB(服务器硬件资产自动采集系统)--12--08CMDB采集硬件数据日志记录
    Django项目:CMDB(服务器硬件资产自动采集系统)--11--07CMDB文件模式测试采集硬件数据
    centos 安装gitlab
    vscode 配置
    mssql下调用dll
  • 原文地址:https://www.cnblogs.com/junxiansheng/p/7049043.html
Copyright © 2011-2022 走看看