zoukankan      html  css  js  c++  java
  • day12-2018-11-1 生成器

    # def gen():
    #     print("我是一个函数")
    #     return "娃哈哈" # 返回 娃哈哈, 返回给调用者
    #     print("你好")
    #     print("你好")
    #     print("你好")
    #
    # ret = gen()
    # print(ret) # 娃哈哈
    
    # 生成器函数. 就是把return换成yield
    # def gen():
    #     print("爽歪歪")
    #     yield "娃哈哈" # 可以让我们的函数分段运行
    #     print("酸酸乳")
    #     yield "AD钙奶"
    #     print("黄焖鸡米饭")
    #
    # ret = gen() # 不会执行你的函数, 获取到生成器对象
    # # 迭代器不能等价代换
    # print(ret) # <generator object gen at 0x00000195518CFE60> generator 生成器
    # print(ret.__next__()) # 必须执行__next__()才可以触发生成器的运行 娃哈哈
    # print(ret.__next__()) # 必须执行__next__()才可以触发生成器的运行 AD钙奶
    # print(ret.__next__()) # StopIteration 迭代器, 就找yield, 执行不到才会报错
    
    
    # 生成器函数有什么用
    # 普通的程序会占用内存
    # def buy():
    #     lst = []
    #     for i in range(10000):
    #         lst.append("衣服%s" % i)
    #     return lst
    #
    # lst = buy()
    # print(lst)
    
    # def gen():
    #     lst = []
    #     for i in range(1, 10000):
    #         lst.append("衣服%s" % i)
    #         if i % 50 == 0: #  1 2 3 4 5 6 7 8 9 .. 49  50
    #             yield lst
    #             lst = [] # 每次生成一个新列表
    #
    # g = gen() # 获取到生成器
    #
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    
    # 迭代器
    # # 节省内存
    # # 惰性机制
    # # 只能往前
    
    # 生成器还可以使用__next__(), send()来访问生成器
    # send()可以给上一个yield位置传值
    
    # def func():
    #     print("水饺")
    #     a = yield "大馅水饺"
    #     print("a=", a)
    #     print("烧饼")
    #     b = yield "武大郎烧饼"
    #     print("b=",b)
    #     print("老婆饼")
    #     c = yield "只要老婆不要饼"
    #     print("c=", c)
    #
    #
    # gen = func() # 生成器
    # print("返回值是:", gen.__next__())
    # print("返回值是:",gen.send("混沌面")) #  和__next__()一样也是向下找yield. 给上一个yield传值
    # print("返回值是:",gen.send("胡辣汤")) #  和__next__()一样也是向下找yield. 给上一个yield传值
    # print("返回值是:",gen.send("马拉")) #  和__next__()一样也是向下找yield. 给上一个yield传值
    
    #  send()不可以在第一个位置和最后一个位置出现
    #  最后的yield后的代码是可以执行的但是会报错. StopIteration
    
    # 生成器函数里不要写return
    # def  func():
    #     print("哈哈")
    #     yield  "呵呵"
    #     print("吼吼")
    #     return  "嘻嘻" # don't do this!
    #
    # gen = func()
    # gen.__next__()
    # gen.__next__()
    
    
    
    # def gen():
    #     lst = ["⿇花藤", "胡辣汤", "微星牌饼铛", "Mac牌锅铲"]
    #     yield from lst # 把列表中的每一个元素返回
    #     # yield  lst[0]
    #     # yield  lst[1]
    #     # yield  lst[2]
    #     # yield  lst[3]
    #
    # g = gen() # 生成器函数 -> 获取生成器
    # for el in g:
    #     print(el)
    
    # def gen():
    #     lst = ["⿇花藤", "胡辣汤", "微星牌饼铛", "Mac牌锅铲"]
    #     lst2 = ["饼铛还是微星的好", "联想不能煮鸡蛋", "微星就可以", "还可以烙饼"]
    #     yield from lst
    #     # yield lst[0]
    #     # yield lst[1]
    #     # yield lst[2]
    #     # yield lst[3]
    #     yield from lst2
    #     # yield lst2[0]
    #     # yield lst2[1]
    #     # yield lst2[2]
    #     # yield lst2[3]
    #
    # g = gen() # 获取生成器
    # for el in g: # 从生成器获取数据
    #     print(el) # 打印
    
    
    def func():
        print(111)
        yield 222
    
    g = func()
    print(g.__next__())
    g = func()
    print(g.__next__())
    
    gg = (i for i in range(10))
    print(list(gg))
    # lst = []
    # for i in range(1, 18):
    #     lst.append("python全栈%s期" % i)
    #
    # print(lst)
    
    # 列表推导式 快速的简单的创建一个列表
    # lst = ["python全栈%s期" % i for i in range(1, 17)]
    # 语法: [结果 for循环 if判断]
    
    # lst = [ i for i in range(1, 21) if i % 2 == 1]
    # print(lst)
    # lst = ["中岛美雪", "夏川美里", "原由子", "汪峰", "田震","那英","周杰伦"]
    #
    # # for el in lst:
    # #     if len(el) == 2:
    # #         pass
    # new_lst = [ el for el in lst if len(el) == 2]
    # print(new_lst)
    
    # 生成列表: 1-20 所有的奇数的2次方
    # print([ i*i for i in range(1,21) if i % 2 == 1])
    
    
    
    # [3,6,9]  已知
    # [(1,2,3), (4,5,6), (7,8,9)]
    # lst = [3,6,9]
    # new_lst = [(el-2, el-1, el) for el in lst]
    
    # for el in lst: # 3
    #     new_lst.append((el-2, el-1, el))
    # print(new_lst)
    
    # 寻找名字中带有两个e的⼈的名字 name.count("e") == 2
    # 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)
    
    # 语法: [结果 for循环 if判断]
    
    
    # 字典推导式和集合推导式
    # {结果 for循环 if判断}
    # {结果 for循环 if判断}
    
    # lst = [11, 22, 33]  #  => {0:11, 1:22, 2:33}
    # dic = {i:lst[i] for i in  range(len(lst)) }
    # print(dic)
    #
    # dic = {"张无忌":"赵敏", "杨过":"小龙女", "郭靖":"黄蓉"}
    # # 把字典中的key和value互换
    # # dic = {"赵敏":"张无忌", "小龙女":"杨过", "黄蓉":"郭靖"}
    # dic1 = { v:k for k, v in dic.items()}  # 强化
    # print(dic1)
    #
    # dic2 = { dic[k]:k for k in dic} # 强化
    # print(dic2)
    
    
    # 集合推导式 # 不可变. 不重复, 无序
    # {结果 for循环 if判断}
    # s = {i*"胡辣汤" for i in range(10)}
    # print(s)
    
    
    # 没有元组推导式
    # 生成器表达式  (结果  for循环 if判断)   =>   生成器表达式
    # 特点:  本质是迭代器. __next__()
        # 1. 省内存
        # 2. 惰性机制
        # 3. 只能向前
    
    # def gen():
    #     yield 1
    #
    # r = gen()
    # r....
    
    # g = (i for i in range(10))
    # print(g) # <generator object <genexpr> at 0x000001F32B74FEB8>
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__()) #  StopIteration
    
    # lst = ["衣服%s" % i for i in range(100000000)] # 占内存
    # print(lst)
    
    # g = ("衣服%s" % i for i in range(100000000)) # 生成器表达式. 节省内存
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    
    # g = (i for i in range(10))
    # # s = {1,2 , 3, 4, 5}
    # print(list(g)) # 把传递进来的数据转化成列表.  里面包含了for循环
    # # list() => for=> __iter__() ==> __next__()
    #
    # print(list(g)) # 上一次已经拿没了
    # print(g.__next__())
    # for el in g:
    #     print(el)
    # for el in g: # 已经没有数据了 惰性机制-> 只能往前
    #     print(el)
    
    
    # def func(): # 生成器函数
    #     print(111)
    #     yield 222
    #
    # g = func() #  生成器 -> 没有执行过__next__()
    # g1 = (i for i in g) # 生成器表达式. 也没有__Next__()
    # g2 = (i for i in g1) # 生成器表达式. 也没有__Next__()
    # # 到此为止, 没有人拿过值
    #
    # print(list(g2)) # 111 [222]
    # print(list(g)) #  []
    # print(list(g1)) # []
    
    # 111
    # [222]
    # []
    # []
  • 相关阅读:
    未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker
    .net remoting 尝试
    上传图片时获取所传图片大小
    图象处理算法(二)
    对CollapablePanel控件的改进
    一个简单的网页计数器
    ValidateBox控件使用Ajax改进
    图象处理算法(四)
    常用技巧(一)
    在Asp.Net里使用自定义映射进行重定向
  • 原文地址:https://www.cnblogs.com/VastTry/p/9890557.html
Copyright © 2011-2022 走看看