• 函数-省内存的生成器


    (一 ) 生成器 本质 就是迭代器,一个一个的创建 对象

    1) 生成器 的创建方式:

    # def func():
    # print("我叫哈哈哥.")
    # return "嘻嘻姐"
    # ret = func()
    # print(ret)
    # print(func()) #这样都可以打印出 2句话


    # ##  当 变化这个函数  一个词 就会变成 生成器
    # ## 大坑 生成器 运行之后,产生了一个生成器,而不是 运行函数
    # def func():
    # print("我叫哈哈哥")
    # yield "嘻嘻姐" # 表示返回 不会终止函数的 运行
    #
    #
    # ret = func() # 执行 函数 此时没有 运行函数
    #
    # # 此时我们得到了 生成器
    # print(ret.__next__())
    # print(ret.__next__())

    a.  生成器函数

    # def buy():
    # lst = []
    # for i in range(100):
    # lst.append("衣服%s" % i)
    # return lst
    # lst = buy()
    # print(lst)
    #
    #

    #
    # def buy():
    # for i in range(100):
    # yield "衣服%s" % i

    # gen = buy() ### 生成器 迭代器 好处 节省 内存
    # print(gen.__next__())
    # print(gen.__next__())
    # print(gen.__next__())

    # for yifu in gen: # 迭代器.__next__()
    # print(yifu)


    # lst = list(gen) # 内部使用的 是 for 循环 -> __next__
    # print(lst)


    # send() -> __next__()
    # send 可以给上一个 yield 传值

    ## 生成器 函数在 执行的时候 返回生成器,而不是 执行 此函数

    ## 能 向下执行的 两个条件
    # __next__(),执行到下 一个 yield
    ## send() 执行到下一个 yield ,给上一个 yield 位置 传值

    ## 生成器中记录的是代码而不是函数的运行

    b. 通过生成器表达式来获取函数

    ## 生成器 表达式
    # g = (i for i in range(1,10))
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())

    def func():
    lst = ["衣服%s" % i for i in range(1,5)]
    yield from lst
    lst1 = ["python%s期" % i for i in range(1,18)]
    yield from lst
    gen = func()
    print(gen.__next__())
    print(gen.__next__())
    print(gen.__next__())
    print(gen.__next__())
    print(gen.__next__())
    print(gen.__next__())

    c. 类型转换 

    (二 )生成器函数:

      生成器函数中包含 yield , 返回数据和 return 差不多,

      return 会立即结束这个函数的执行

      yield 可以分段的执行一个函数

    #  生成器函数在执行的时候返回生成器,而不是直接执行函数

    #  能向下执行的两个条件:

        1)   __next__()      执行到下一个 yield

        2)   send() ,           执行到下一个 yield ,给上一个   yield  位置传值

    #  所有的生成器都是迭代器都可以直接使用  for  循环

                               都可以使用 list()函数来获取到生成器 内 所有的 数据

    ###  生成器 中记录的是代码 而不是函数的运行

    def func():

      print("我叫哈哈哥")

      yield     "哈哈笑"

    gen = func()  #创建生成器,此时运行会把生成器函数中的代码记录在内存

              当执行到__next__(), 运行此空间中 的代码,运行到 yield 结束

    ##   优点: 节省内存,生成器本身就是代码,几乎不占内存

    ##    特点: 惰性机制,只能向前,不能反复

    (三)   各种推导式 

    1) 列表推导式:  [结果           for循环 if条件判断]

    # 寻找名字中带有两个e的⼈的名字
    # names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
    # ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    #
    # lst =[name for el in names for name in el if name.count("e") == 2]
    # print(lst)


    # lst= [11,22,33]
    # dic = {i:lst[i] for i in range(len(lst))}
    # print(dic) # 结果是 {0: 11, 1: 22, 2: 33}

    2)字典推导式: {结果(k,v)      for循环  if }

    # #     把字典的 key value  互换
    # dic = {"主食": "炒面", "副食": "小拌菜", "汤":"疙瘩汤"}
    #
    # dic1 = {v:k for k,v in dic.items() }
    # print(dic1)

    3)集合推导式:{结果(k)           for循环   if)

    ######  没有元祖的推导式啊  

    (四)生成器表达式

    (结果       for循环        if)

    (五)  这个有点意思哦

    # def add(a,b ):              
    # return a + b
    # 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)
    # print(list(g))

    结果是什么呢????????
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?








    #
    # # ### 结果是 两个字符串相加 list[20, 21, 22, 23]

    这个 结果又是什么 ????

    # def fib(max):
    #         n,a,b = 0 ,0 ,1
    # while n < max:
    # print(b)
    # a ,b = b , a + b
    # n += 1
    # return "done"
    # fib(10)
  • 相关阅读:
    程序员需要知道的知识
    ajax原理图
    线性表及其操作
    JDBC连接SQL server 2005 全过程
    asp.net生命周期
    终于在博客园里申请了自己的博客
    C#反射类中所有字段,属性,方法
    继续学习NHibernate
    C#中方法的四种参数类型
    Forms权限认证
  • 原文地址:https://www.cnblogs.com/wenqi2121/p/10104918.html
Copyright © 2020-2023  润新知