zoukankan      html  css  js  c++  java
  • 生成器函数,推导式,生成器表达式

    一.生成器

    1生成器的定义

      生成器的本质是迭代器

      生成器一般由生成器函数或者生成器表达式来创建

      生成器是手写的迭代器

    2.生成器的特点

      生成器的特点和迭代器一样.

    (1)惰性机制

    (2)节省内存

    (3)只向下进行

    3.生成器的取值方式

      生成取值方式和迭代器一样

    (1)__next__()

    (2)send():给上一个yield传值.

    二.生成器函数

    1.和普通的函数没有什么区别.里面有yield的函数就是生成器函数.

    def func():
        print("哈哈")
        yield 1
    gen = func()  #不会执行函数,拿到的是生成器

    2.生成器函数在执行的时候.默认不会执行函数体,而会形成生成器,通过生成器的__next__()分段执行这个函数

    def order():
        for i in range(10000):
            yield "衣服"+str(i)
    g = order() # 获取生成器
    mingwei = g.__next__()
    print(mingwei)
    zhaoyining = g.__next__()
    print(zhaoyining)

    3.send()给上一个yield传值,不能开头(没有上一个yield),最后一个yield也不可以用send()

    def eat():
        print("我吃什么啊")
        a =  yield  "馒头"
        print("a=",a)
        b =  yield  "鸡蛋灌饼"
        print("b=",b)
        c =  yield  "韭菜盒子"
        print("c=",c)
        yield  "GAME OVER"
    gen = eat()      # 获取生成器
    
    ret1 = gen. __next__()
    print(ret1) # 馒头
    ret2 = gen.send("胡辣汤")
    print(ret2)
    
    ret3 = gen.send("狗粮")
    print(ret3)
    ret4 = gen.send( "猫粮")
    print(ret4)
    for i in func(): # for的内部一定有__next__()
        print(i)
    
    print(list(func())) # 内部都有__next__()

    三.推导式

    1.列表推导式  [结果 for循环 条件筛选]

    lst = []
    for i in range(1, 16):
        lst.append("python"+str(i))
    print(lst)
    lst = ["python"+str(j) for j in range(1,16)]
    print(lst)
    lst = ["pytjon"+str(j) for j in range(1,6)]
    print(lst)
    View Code
    lst = [i for i in range(1000) if i%2==1]
    print(lst)
    奇数
    lst = [i*i for i in range(100) if i%3==0]
    print(lst)
    100以内能被3整除的数的平方
    #寻找名字中带两个e的人的名字
    name = [["Tom","Billy","Jefferson","Andrew","Wesley","Steven","Joe"],
    ["Alice","Jill","Ana","Wendy","Jennifer","Sherry"]]
    lst = [name for line in names for name in line if type(name)==str and name.count("e")==2]
    print(lst)

    2.字典推导式  {K:v  for循环  条件筛选}

    #[11,22,33,44]  =>{0:11, 1:22, 2:33, 3:44}
    lst = [11,22,33,44]
    dic = {i:lst[i]  for i in range(len(lst)) if i < 2}
    print(dic)
    
    
    
    dic = {"jj": "林俊杰", "jay": "周杰伦", "zs": "赵四", "ln":"刘能"}
    d = {v : k for k,v in dic.items()}
    print(d)

    3.集合推导式 {k    for循环  条件筛选}

    s = {i for i in range(100)} # 可去除重复
    print(s)

    四.生成器表达式

    (结果  for循环  条件)

    特点:
    1. 惰性机制
    2. 只能向前
    3. 节省内存(鸡蛋)
    #生成器函数
    def func():
        print(111)
        yield 222
        yield 333
    g = func #获取生成器
    g1 = (i for i in g)#生成器
    g2 = (i for i in g1) #生成器
    print(list(g))  #[222,333] 源头,从源头把数据拿走了
    print(list(g1))  #[]    这里执行的时候,源头已经没有数据了
    print(list(g2))  #[]   这里也没有值了
    # 求和
    def add(a, b):
        return a  + b
    
    # 生成器函数 #  0-3
    def test():
        for r_i in range(4):
            yield  r_i
    
    # 0,1,2,3
    g = test() # 获取生成器
    
    for n in  [2, 10]:
        g = (add(n, i) for i in g)
    print(g)
    
    
    # 到最后往里面放数据就对了
    # print(list(g))
    # print(list(g)) # []

    当生成器没执行的时候,无论生成器里的值,还是别的值都不拿

  • 相关阅读:
    小程序导航栏跟随滑动
    前端每日一题
    Spring框架学习——AOP的开发
    Spring框架学习-Spring的AOP概念详解
    SpringIOC学习_属性注入(依赖注入)
    hibernate与struts2整合中出现问题以及一级缓存查询数据在业务层问题
    工具类学习-java实现邮件发送激活码
    Spring框架学习-搭建第一个Spring项目
    Spring框架学习-Spring和IOC概述
    Hibernate学习——持久化类的学习
  • 原文地址:https://www.cnblogs.com/Bug66/p/9467532.html
Copyright © 2011-2022 走看看