zoukankan      html  css  js  c++  java
  • 第十三天-生成器

    # 生成器:
    # 生成器实质就是迭代器(省内存 惰性机制 只往前)
    # 1. 通过生成器函数
    # 2. 通过各种推导式来实现生成器

    # def func():
    # yield
    #
    # g = func() - 得到生成
     1 # 生成器函数  就是把return 换成yield
     2 # return  换成 yield 理解成一次性执行 只往前
     3 def fu():
     4     print("娃哈哈")
     5     yield "哈哈娃"  # yield可以把函数分段执行
     6     print("AD钙")
     7     yield "美滋滋"
     8     print("爽歪歪")
     9 
    10 # fu() # 这里是获取到生成器对象 generator 不会执行函数
    11 print(fu()) # 输出 生成器 generator
    12 ret = fu()
    13 print(ret.__next__()) # 必须执行__next__()才可以触发生成器的运行 娃哈哈
    14 print(ret.__next__()) # 必须执行__next__()才可以触发生成器的运行 美滋滋
    15 print(ret.__next__()) # StopIteration 迭代器 找不到 yield 报错
    # 生成器的用法和迭代器基本一致
    # __next__() 开始执行生成器 . 执行到yield. 直到没有yield. 抛出StopIteration


    # 生成器函数有什么用
    # 省内存
     1 # 如定制一万衣服 一次性全输出了 全堆到公司没地放
     2 # 普通程序会很占内存
     3 # def buy():
     4 #     lis = []
     5 #     for  i in range(10000):
     6 #         lis.append("衣服%s"%i)
     7 #     return lis
     8 #
     9 # print(buy())
    10 
    11 # 生成器 要多少拿多少
    12 # 省内存
    13 # def buy():
    14 #     lis = []
    15 #     for i in range(1,10000):
    16 #         lis.append("衣服%s"%i)
    17 #         if i % 50 == 0: # 50一批次得拿
    18 #             yield lis
    19 #             lis = []  # 每次生成一个新列表(新批次)
    20 #
    21 # set = buy()  # 获取到生成器
    22 # print(set.__next__()) # 拿到第一批1-50
    23 # print(set.__next__()) # 拿到第二批51-100
    24 # print(set.__next__())
    25 # print(set.__next__())
    # 生成器还可以用 __next__()  snd()来访问生成器
    # send()给上一个yield位置 传值
     1 def food():
     2     print("水饺")
     3     a = yield "大馅水饺"
     4     print("a=", a)
     5     print("烧饼")
     6     b = yield "武大郎烧饼"
     7     print("b=", b)
     8     print("老婆饼")
     9     c = yield "只要老婆不要饼"
    10     print("c=", c)
    11 
    12 # 使用__next__()来访问生成器
    13 ret = food() # 生成器
    14 # print(ret.__next__())  # 执行第一个yield 水饺 大馅水饺
    15 # print(ret.__next__())  # 执行第二个yield 烧饼 武大郎烧饼
    16 # print(ret.__next__())  # 执行第三个yield 老婆饼 只要老婆不要饼
    17 
    18 # 使用 send()来访问生成器 # send()有__next__的作用 但还会返回值给 yield
    19 print("返回值是:",ret.__next__())
    20 print("返回值是:",ret.send("来两盘")) #  给第一个 a 和__next__()一样也是向下找yield. 但还给上一个yield传值
    21 print("返回值是:",ret.send("来五张")) # 返回给了第2个 yield 即b
    22 print("返回值是:",ret.send("来一堆!")) # 返回给了第3个 yield 即c
    23 
    24 #  send()不可以在第一个位置和最后一个位置出现
    25 #  最后的yield后的代码是可以执行的但是会报错. StopIteration

     示意图:

    # 生成器函数里不要写return
    1 def  func():
    2     print("哈哈")
    3     yield  "呵呵"
    4     print("吼吼")
    5     return  "嘻嘻" # don't do this!
    6 
    7 gen = func()
    8 gen.__next__()
    9 gen.__next__()
    # 列表推导式
    # 语法 [结果 for循环 if判断]
    # 要得到的效果必须放前面的结果位置
     1 lis = ["运动会%s期"% i for i in range(0,18)]
     2 print(lis)
     3 
     4 lis1 = [i for i in range(0,21) if i%2==1]
     5 print(lis1)
     6 
     7 lst = ["中岛美雪", "夏川美里", "原由子", "汪峰", "田震","那英","周杰伦"]
     8 
     9 lst1 = [i for i in lst if len(i)== 2 ]
    10 print(lst1)
    11 
    12 lis = [i**2 for i in range(1,21) if i%2==1]
    13 print(lis)
     1 # 已知(3,6,9)
     2 # 输出(1,2,3) (4,5,6) (7,8,9)
     3 #
     4 lis = [3,6,9]
     5 lis1 = []
     6 for i in lis:
     7     lis1.append((i-2,i-1,i))
     8 print(lis1)
     9 
    10 # 用推导式
    11 lis1 = [(i-2,i-1,i) for i in lis]
    12 print(lis1)
    13 
    14 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
    15         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    16 
    17 for i in names:
    18     for j in i:
    19         if j.count("e")==2:
    20             print(j)
    21 # 推导式
    22 name1 = [j  for i in names  for j in i  if j.count("e") == 2]
    23 print(name1)
    # 字典推导式
    # 语法 {结果 for循环 if判断}
    1 # dic = {"张无忌":"赵敏", "杨过":"小龙女", "郭靖":"黄蓉"}
    2 # dic1 = {dic[i]:i for i in dic}
    3 # print(dic1)
    4 #
    # 集合推导式  # 不可变 不重复 无序的
    # {结果 for循环 if判断}
    # set = {i*坚挺 for i in range(1,11)}


    # 生成器表达式
    # 语法 (结果 for循环 if判断) # 没有元祖推导式!
    # 特点: 本质是迭代器 __next__()
    # 省内存
    # 惰性机制
    # 只能往前

     1 # 坑(面试题)生成器函数
     2 def fun():
     3     print(111)
     4     yield 222
     5 
     6 g = fun()
     7 g1 = (i for i in g)  # 没有__next__() 不执行
     8 g2 = (i for i in g1)
     9 
    10 print(list(g))
    11 print(list(g1))
    12 print(list(g2))

    ——————推导式练习——————

     1 # ———day_work———
     2 
     3 # 1.过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
     4 
     5 lis = ["a","asdd"]
     6 lis1 = [str(i).upper() for i in lis if len(i)>=3 ]   # 语法 [结果 for循环 if判断]
     7 print(lis1)
     8 
     9 # 用循环写
    10 # lis = []
    11 # lis1 = []
    12 # while 1:
    13 #     s = input("请输入字符串,q结束输入:")
    14 #     lis.append(s)
    15 #     if s.upper() == "Q":
    16 #         for i in lis:
    17 #             if len(i) > 2:
    18 #                 lis1.append(i.upper())
    19 #             else:
    20 #                 continue
    21 #         print(lis1)
    22 #         break
    23 
    24 # 2.求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
    25 
    26 lis=[(x,y) for x in range(6) for y in range(6) if x%2==0 and y%2==1]
    27 print(lis)
    28 # 或者切片方法
    29 print([(i, j) for i in range(0,6,2) for j in range(1,6,2)])
    30 
    31 # 3 求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
    32 
    33 lis = [3,6,9]
    34 M = [[i-2,i-1,i] for i in lis ]
    35 print(M)
    36 
    37 # 4.求出50以内能被3整除的数的平方,并放入到一个列表中。
    38 
    39 lis = [i**2 for i in range(1,50) if i % 3 == 0]
    40 print(lis)
    41 
    42 
    43 # 5.构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期',
    44 #
    45 lis = ["python%s期"%i for i in range(1,18)]
    46 print(lis)
    47 
    48 # 6.构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
    49 lis = [(i,i+1) for i in range(0,6)]
    50 print(lis)
    51 
    52 # 7.构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    53 lis = [2*i for i in range(0,10)]
    54 print(lis)
    55 
    56 # 8.有一个列表l1 = ['sally', 'like', '小屁孩', '太白']将其构造成这种列表['sally0', 'like1', '小屁孩2', '太白3']
    57 l1 = ['sally', 'like', '小屁孩', '太白']
    58 l2 = [l1[i]+str(i) for i in range(len(l1))]
    59 print(l2)
    60 
    61 
    62 # x = {'name':'alex','Values':[{'timestamp':1517991992.94,'values':100,},
    63 #     {'timestamp': 1517992000.94,'values': 200,},{'timestamp': 1517992014.94,'values': 300,},
    64 #     {'timestamp': 1517992744.94,'values': 350},{'timestamp': 1517992800.94,'values': 280}],}
    65 '''
    66 将上面的数据通过列表推导式转换成下面的类型:[[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
    67 '''
    68 
    69 lis = x['Values']
    70 lis1 =[[i['timestamp'] , i['values']] for i in lis]
    71 print(lis1)
  • 相关阅读:
    推理思维
    模糊数学
    Android 加法程序
    线程特点
    单例模式的优缺点
    lua 字符串过滤,特殊字符过滤
    cocos2dx
    cocos2dx之控制台输出
    C++基础(using)
    生活常识
  • 原文地址:https://www.cnblogs.com/xi1419/p/9893356.html
Copyright © 2011-2022 走看看