zoukankan      html  css  js  c++  java
  • Python生成器、三元表达式、列表生成式、字典生成式、生成器表达式

    什么是生成器:
    只要函数内部包含有yield关键字,那么函数名()的到的结果(生成器地址)就是生成器,
    再调用函数不会执行函数内部代码
    这个生成器本身有  _iter_  he  _next_功能(即生成器就是一个迭代器)

    为什么要用生成器:
    生成器是一种自定义迭代器的方式


    总结yield的功能
    1、提供一种自定义迭代器的方式
    2、yield可以暂停住函数,返回值

    yield he return
    相同点:都是用在函数内,都可以返回值,没有类型限制,没有个数限制
    不同点:return只能返回一次值,yield可以返回多次值


    1.生成器next取值,例如1:
    def func():                          #第一步:定义函数
        print('first1')
        print('first2')
        print('first3')
        yield 1 #暂停
        print('second1')
        print('second2')
        print('second3')
        yield 2  #暂停
        print('third')
        yield 3 #暂停
        print('fourth')
    g=func()                             #调用函数,不执行函数体代码只是得到了生成器即迭代器)
    print(g)
    res1=next(g) #把yield后面的返回值赋值给res1  #取到一个值,这个值是由func中的yield控制的,所以next后会逐一从上到下打印           
    print('第一次的返回值:',res1)

    print('='*100)
    res2=next(g)
    print('第二次的返回值:',res2)

    输出结果为:
    <generator object func at 0x05597BD0>
    first1
    first2
    first3
    第一次的返回值: 1
    ===============================================================
    second1
    second2
    second3
    第二次的返回值: 2


    1.生成器next取值(for循环),例如2:

    for item in g:  #g=iner(g)  #item=next(g)
        pass        #注意next(g)只会打印函数体print的结果,碰到yield会暂停pass,yield,继续下次循环

    输出结果:
    first1
    first2
    first3
    second1
    second2
    second3
    third
    fourth


    实际每次yield的值已经赋值给了item=next(g),item,只是上面没有打印
    for item in g:
        print(item)
    first1
    first2
    first3
    1
    second1
    second2
    second3
    2
    third
    3
    fourth

    2.自定义range函数模型(例如:my_range)
    def my_range(start,stop,step=1):
        while start < stop:
            yield start
            start+=step

    obj=my_range(1,7,2) #顾头不顾尾只能从1,2,3,4,5,6中取值
    print(next(obj))    #1
    print(next(obj))    #3
    print(next(obj))    #5
    print(next(obj))   #报错StopIteration

    3.三元表达式 (条件成立时返回值 if 条件 else 条件不成立时返回值
    x=10
    y=20
    res = x if x > 10 else y
    print(res)


    4.列表生成式:(值放在for循环的左边))(给一筐鸡蛋)

    #原始取值
    l=[]
    for i in range(1,11):
        l.append(i)
        print(l)
     
    改进为:
    l=[i for i in range(1,11)]
    print(l)     #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  得到的是一组列表,占内存空间大

    例如1:
    names=['alex','wxx','lxx']
    names=[name+'SB' for name in names]
    print(names)  #['alexSB', 'wxxSB', 'lxxSB']


    5.生成器表达式:(给一只鸡)
    # 相对列生成式省空间,刚开始什么都不执行,t本身就是一个迭代器,需要逐一取值
    t=(i for i in range(100000000))
    print(t)       #<generator object <genexpr> at 0x05057BD0> 得到的是一个生成器不占内存空间
    print(next(t))  #0
    print(next(t))  #1
    print(next(t))  #2


    6.字典生成式:()
    keys=['name','age','sex']
    values=['egon',18,'male']
    res=zip(keys,values)
    print(list(res))    #[('name', 'egon'), ('age', 18), ('sex', 'male')]
    方式一
    d={ }
    for k,v in zip(keys,values):
        d[k]=v
    print(d)   #{'name': 'egon', 'age': 18, 'sex': 'male'}

    方式二
    d={k:v for k,v in zip(keys,values)}
    print(d)   #{'name': 'egon', 'age': 18, 'sex': 'male'}


    7.zip()拉链函数:
    s='hello'
    l=[1,2,3,]
    res=zip(s,l)
    print(list(res))    #[('h', 1), ('e', 2), ('l', 3)]

    8.max函数(取位数最长的值len)
    情况1:
    with open('a.txt',encoding='utf-8') as f:
        nums=[len(line) for line in f]  #【】nums里面已经把值全部存放到列表中
        print(max(nums))                   #返回值32
    print(max(nums))   #在任何地方取都OK   #返回值32
    # 情况2:
    with open('a.txt',encoding='utf-8') as f:
        nums=(len(line) for line in f)  #如果(),nums是迭代器对象,每取一次里面就没有了
        print(max(nums))                   #返回值32
    print(max(nums))   #max() arg is an empty sequence 上面已经去过最大值,再取提示为空

  • 相关阅读:
    【转】Tomcat中部署java web应用程序
    【转】如何安装mysql服务
    【转】java_web开发入门
    【转】SVN 查看历史信息
    【转】java编译错误 程序包javax.servlet不存在javax.servlet.*
    【转】MySQL5安装的图解(mysql-5.0.27-win32.zip)
    【转】JAVA变量path , classpth ,java_home设设置作用和作用
    intellij idea 10.5介绍
    Java中的IO与NIO
    javaWeb完成注册功能
  • 原文地址:https://www.cnblogs.com/yangzhizong/p/9179305.html
Copyright © 2011-2022 走看看