zoukankan      html  css  js  c++  java
  • day 11 生成器

    生成器
    生成器本质就是迭代器,生成器是自己用python代码写的迭代器


    将函数变成生成器
    yield
    用next 取值
    一个next,对应一个yield
    def func():
        yield 111
        yield 222
        yield 333
    ret = func()
    # print(ret)
    print(next(ret))  # 111 一个next取一个yield值,超出会报错
    print(next(ret))  # 222
    import time
    def genrator_fun1():
        a = 1
        print('现在定义了a变量')
        yield a
        b = 2
        print('现在又定义了b变量')
        yield b
    
    g1 = genrator_fun1()
    print('g1 : ',g1)       #打印g1可以发现g1就是一个生成器
    print('-'*20)   #我是华丽的分割线
    print(next(g1))
    time.sleep(5)   #sleep一秒看清执行过程
    print(next(g1))

    生成器好处:

      不会一下子在内存中生成太多数据

    yield return共同点和不同点:

    return 终止函数,yield不会终止生成器函数

    都会返回一个值,return给函数的执行者返回值,yield是给 next() 返回值

    send   next

    send 不仅能对应yield取值,而且可以给上一个yield发送一个值

    1、不能给第一个yield传值

    2、最后一个yield永远得不到send传的值

    def func():
        a = yield 111
        print('a=', a)
        b = yield 222
        print('b=',b)
        yield 333
    reg = func()
    print(next(reg))      #第一位,打印第一个yield
    print(reg.send('alex')) #在第二位,传值给第一位, a=alex 并打印222
    print(reg.send('echo')) #在第三位,传值给第二位,b=echo  并打印 333

    yield  from   (了解)

    将一个可迭代对象变成一个迭代器返回

    # 没有from
    def func():
        lst = ['alex', 'echo', 'nice', 'great']
        yield lst
    genor = func()
    print(next(genor))  # ['alex', 'echo', 'nice', 'great']
    for i in genor:
        print(i)     # ['alex', 'echo', 'nice', 'great']
    # 有from
    def func():
        lst = ['alex', 'echo', 'nice', 'great']
        yield from lst
    genor = func()
    # print(next(genor))  # alex  只打印第一个
    for i in genor:
        print(i)     #  alex   echo  nice   great 一个一个出

    列表推导式

    用一行代码构建简单,较复杂的列表

    优点:节省代码行数

    缺点:1、不能使用debug模式

       2、任何列表都可以通过常规构建去构建,复杂的列表不能通过列表推导式构建

    l1 = [i for i in range(100)]
    print(l1)

    分三种情况:

    1、循环模式。 [ 变量(加工后的变量)  for 变量 in iterable ]

    l1 = [i for i in range(100)]   # 变量
    print(l1)
    l1 = ['python%s期' % i for i in range(1, 25)]  # 加工后的变量
    print(l1)

    2、三元模式(循环模式的变种)

    # 构建一个列表:列表里面的元素是1~20,但是能被3整除元素替换成*。
    print(['*' if i % 3 ==0 else i for i in range(1,21)])   # 有else, if在for前面
    # 将至少含有两个e的名字放到一个列表中
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
             ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    print([name for l in names for name in l if name.count('e') >= 2])  # 没有else 则if放后面

    3、筛选模式   [ 变量(加工后的变量)  for 变量 in iterable  if  条件]

    # 30以内,能被3整除的数加入列表
    l1 = [i for i in range(1, 31) if i % 3 == 0 ]
    # 30以内能被3整除的数的 平方
    l1 = [i*i for i in range(1, 31) if i % 3 == 0]
    print(l1)

    生成器表达式

    与列表推导式几乎一模一样,就是[] 换成()

    gentor = ('python%s期' %i for i in range(1,26))
    print(gentor)
    for i in gentor:
        print(i)

    字典推导式,集合推导式 (了解)

    # {1: None, 2: None, 3: None, 4: None, 5: None}
    print({i:None for i in range(1,6)})
    
    # 将mcase列表键值调换
    mcase = {'a': 10, 'b': 34, 'c': 20, 'd': 15}
    print({value:key for key,value in mcase.items()})

    针对只有返回值的这样的函数:python提供了一个函数可以简化,匿名函数

    匿名函数,一行函数

    #两个函数都是让用户输入两个值,然后相加,输出结果
    def func(x, y): 
        return x + y 
    
    func2 = lambda x,y: x + y
    print(func2(3,4))
  • 相关阅读:
    tomcat简介与配置
    gitlab简介与配置
    cobbler自动装机服务简介与配置
    Linux中管理员用户与普通用户之间的切换
    kafka 学习
    Linux系统swappiness参数在内存与交换分区之间优化作用
    CentOS7中使用yum安装Nginx的方法
    配置两个Hadoop集群Kerberos认证跨域互信
    Linux shell中2>&1的含义解释
    解决SpringBoot多工程时jar包中注解不能扫描生效问题
  • 原文地址:https://www.cnblogs.com/echo2019/p/10214276.html
Copyright © 2011-2022 走看看