zoukankan      html  css  js  c++  java
  • 小学生都能学会的python(生成器)

    小学生都能学会的python(生成器)

    1. 生成器
    生成器的本质就是迭代器.
    生成器由生成器函数来创建或者通过生成器表达式来创建

    # def func():
    #     lst = []
    #     for i in range(10000):
    #         lst.append("衣服%s" % i)
    #     return lst
    # lst = func()
    # print(lst)
    
    # def func():
    #     for i in range(1, 10000):
    #         yield "衣服%s" % i
    #
    # gen = func()
    # for i in range(50):
    #     yf = gen.__next__()
    # for i in range(50):
    #     yf = gen.__next__()
    # for i in range(50):
    #     yf = gen.__next__()
    
    # def func():
    #     lst = []
    #     for i in range(1, 10000):
    #         lst.append("衣服%s" % i)
    #         if i % 50 == 0:
    #             yield lst
    #             lst = [] # 新的装衣服的地方
    #
    # gen = func()
    # yf1 = gen.__next__()
    # print(yf1)
    # yf2 = gen.__next__()
    # print(yf2)
    # yf3 = gen.__next__()
    # print(yf3)
    # yf4 = gen.__next__()
    # yf5 = gen.__next__()
    # print(yf1)
    # print(yf2)
    # print(yf3)
    # print(yf4)
    # print(yf5)
    
    
    
    # 生成器:本质是迭代器, 写法和迭代器不一样. 用法和迭代器一样
    # 生成器函数: 函数中带有yield, 执行生成器函数的时候返回生成器。而不是执行这个函数
    # def func():
    #     print("你好啊, 我叫赛利亚,")
    #     yield "西岚的武士刀" # return 和yield都可以返回数据
    #
    # ret = func() # generator ret是一个生成器
    # print(ret)
    # s = ret.__next__() # 当执行到__next__()的时候, 函数才真正的开始执行
    # print("接受到的是", s)
    
    # def func():
    #     print("打开手机")
    #     print("打开陌陌")
    #     yield "手机"
    #     print("约妹子")
    #     print("出来喝喝茶")
    #     yield "电脑"
    #     print("我加了一句话")
    # gen = func() # 生成器
    # ret1 = gen.__next__()
    # print(ret1)
    # ret2 = gen.__next__()
    # print(ret2)
    # ret3 = gen.__next__()  # 找不到最后一个yield 会报错
    # print(ret3)
    #
    
    # 特点:
    #   1. 节省内存, 几乎不占用内存
    #   2. 惰性机制
    #   3。只能往前走
    
    
    # send() 也可以实现类似__next__()的效果, send()可以给上一个yield传值
    #
    # def func():
    #     print("韭菜盒子")
    #     a = yield "哇哈哈"
    #     print("肉包子", a)
    #     b = yield "脉动"
    #     print("锅包肉", b)
    #     yield "冰红茶"
    #
    # gen = func()
    # ret = gen.send("胡辣汤")
    # print(ret)
    #
    # ret = gen.send("刘伟") # 给上一个yield传值
    # print(ret)
    #
    # ret = gen.send("刘德华") # 给上一个yield传值
    # print(ret)
    
    #  send()和__next__()的区别
    # send不可以用在开头
    # send可以给上一个yield传值, 不能给最后一个yield传值
    
    def func():
        yield "麻花藤"
        yield "李彦宏"
        yield "马云"
        yield "刘强东"
    
    gen = func()
    # print(gen.__next__()) # 麻花藤
    # print(gen.__next__()) # 麻花藤
    # print(gen.__next__()) # 麻花藤
    # print(gen.__next__()) # 麻花藤
    
    # 生成器的本质是迭代器.
    # print("__iter__" in dir(gen))
    #
    # # 生成器可以直接使用for循环
    # # for el in gen:
    # #     print(el)
    #
    # lst = list(gen) # 把生成器中的每一个数据拿出来组合成一个列表
    # print(lst)
    

      

    2. 生成器函数
    生成器函数:在函数中return换成yield. 这个函数就是生成器函数
    def func():
    yield

    gen = func() 函数并不会被执行, 而是创建一个生成器对象

    取值:
    gen.__next__() 下一个
    gen.send() 可以给上一个yield传值, 第一次执行不能用send()

    特性:
    1. 节省内存
    2. 惰性机制
    3. 只能向前

    3. 各种推导式

    # 列表:装python1期, python2期。。。。。。
    # lst = [] # 创建列表
    # for i in range(1, 17): #  循环1-16
    #     lst.append("python%s" % i) # 装数据
    # print(lst)
    
    # 推导式
    # 列表推导式 : [结果 for循环 if筛选]
    lst = ["python%s" % i for i in range(1, 17)]
    print(lst)
    
    # 创建列表: [1,3,5,7,9..99]
    lst = [i for i in range(1, 100, 2)]
    print(lst)
    
    lst = [i for i in range(1,100) if i % 2 == 1]
    print(lst)
    
    
    # 获取1-100内能被3整除的数
    # lst = [i for i in range(1, 101) if i % 3 == 0]
    #
    # # 100以内能被3整除的数的平⽅
    # lst = [i*i for i in range(1, 101) if i % 3 == 0]
    # 寻找名字中带有两个e的⼈的名字
    
    # names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
    #  ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    #
    # lst = [name for first in names for name in first if name.count("e") >= 2 ]
    # print(lst)
    
    # 字典推导式, {key: value for循环 if 筛选}
    # dic = {"张无忌":"九阳神功", "乔峰":"降龙十八掌", "楚留香":"帅"}
    # d = {dic[k]: k for k in dic}
    # print(d)
    
    # lst1 = ["东北", "陕西", "山西", "开封", "杭州", "广东", "济南"]
    # lst2 = ['大拉皮', "油泼面", "老陈醋", "灌汤包", "西湖鲤鱼", "早茶", "胶东一锅鲜"]
    #
    # dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
    # print(dic)
    
    # 集合推导式 无序不重复 可哈希
    # {key for if}
    
    # lst = ["周杰伦","周伯通","周润发","周伯通","周笔畅","周伯通","周星驰","周伯通"]
    # s = {el for el in lst}
    # print(s)
    

      


    1.列表推导式: [结果 for循环 if条件]
    2.字典推导式: { key: value for循环 if条件}
    3.集合推导式: {key for循环 if条件}
    (结果 for循环 if条件)

    惰性机制
    记录在内存中的一段代码.

    # 元组没有推导式
    # [结果 for if]
    # {key for if}
    # {key:value for if}
    # (结果 for if) # 生成器表达式, 拿到的是生成器
    
    # 可以使用生成器表达式直接创建生成器
    # gen = (i for i in range(10)) # generator
    # print(gen.__next__())
    # print(gen.__next__())
    # print(gen.__next__())
    # print(gen.__next__())
    # print(gen.__next__())
    # print(gen.__next__())
    # print(gen.__next__())
    # print(gen.__next__())
    # print(gen.__next__())
    # print(gen.__next__())
    # print(gen.__next__())
    
    # 生成器表达式: 记录一下代码。 然后每次需要的时候去生成器中执行一次这个代码
    # 列表推导式: 一次性把所有的数据创建出来, 容易产生内存浪费
    # 特性:
    #     1. 节省内存
    #     2. 惰性机制
    #     3.只能向前。
    
    
    # 生成器函数
    # def func():
    #     print(111)
    #     yield 222
    #
    # g = func() #  生成器
    #
    # g1 = (i for i in g) # 生成器
    # g2 = (i for i in g1) # 生成器
    #
    #
    # print(list(g1)) # 222
    # print(list(g2))
    # print(list(g)) # 才会开始真正的取数据
    
    # 计算两个数的和
    def add(a, b):
        return a + b
    
    # 生成器函数, 0-3
    def test():
        for r_i in range(4):
            yield r_i
    
    # 获取到生成器
    g = test() # 惰性机制
    
    for n in [2, 10]:
        g = (add(n, i) for i in g)  # 循环的内部也是一个生成器
    
    #  __next__()
    # list()
    
    print(list(g)) # 刚开始拿数据
    # 生成器记录的是代码
    

      

  • 相关阅读:
    微信分享功能开发代码整理
    js 完美兼容浏览器的复制功能
    linux 搭建svn服务器
    zendStudio安装Xdebug项目断点调试
    程序员开发常用英语词汇
    简单的一个远传采集并下载远传图片存储到本地示例
    form表单中经常用到的禁用获取值问题
    记录下url拼接的多条件筛选js
    better-scroll在vue中的使用
    移动端适配,引入lib-flexible,vue开发中将px转化为rem
  • 原文地址:https://www.cnblogs.com/konghui/p/9670801.html
Copyright © 2011-2022 走看看