生成器

  1 # """
  2 # 2021/11/1
  3 # 今日学习内容:
  4 #     1.生成器与生成器函数
  5 #         生成器的本质就是迭代器
  6 #         生成器的三种生成办法:
  7 #             1.通过生成器函数
  8 #             2.通过生成器表达式创建表达式创建生成器
  9 #     2.各种推导式,生成器函数
 10 #
 11 # """
 12 #
 13 #
 14 # # def func():
 15 # #     print("我是周建荣")
 16 # #     yield "a"  # 函数中包含 yield ,表示当前这个函数不再是普通的函数了,是生成器函数
 17 # #
 18 # #
 19 # # g = func()  # 通过函数func()来创建一个生成器
 20 # # print(func())  # generator object func at 0x0000013FC6C52030
 21 # # print(g.__next__())
 22 # # # print(g.__next__())  # StopIteration
 23 # def func1():
 24 #     print("我是周建荣")
 25 #     yield "a"  # 函数中包含 yield ,表示当前这个函数不再是普通的函数了,是生成器函数
 26 #     print("我是yuxin")
 27 #     yield 'B'
 28 #
 29 #
 30 # g = func1()
 31 # print(g.__next__())
 32 # print(g.__next__())
 33 #
 34 #
 35 # # return 是直接返回结果,结束函数的调用
 36 # # yield 返回函数的结果,可以让函数分段执行
 37 # def func_2():
 38 #     print("A")
 39 #     a = yield "11"
 40 #     print(a)
 41 #     b = print("B")
 42 #     yield "22"
 43 #     c = print("C")
 44 #     yield "33"
 45 #
 46 #
 47 # g = func_2()
 48 # print(g.__next__())
 49 # print(g.send(1))
 50 # print(g.__next__())
 51 #
 52 #
 53 # # send()可以给上一个yield赋值
 54 #
 55 #
 56 # def eat():
 57 #     print("我吃什么呀")
 58 #     a = yield '馒头'
 59 #     print("a=", a)
 60 #     b = yield "大饼"
 61 #     print("b=", b)
 62 #     c = yield "韭菜盒子"
 63 #     print("c=", c)
 64 #     yield "GAME OVER"
 65 #
 66 #
 67 # gen = eat()  # 获取生成器
 68 # ret1 = gen.__next__()
 69 # print(ret1)
 70 # ret2 = gen.send("胡辣汤")
 71 # print(ret2)
 72 # ret3 = gen.send("狗粮")
 73 # print(ret3)
 74 # ret4 = gen.send("猫粮")
 75 # print(ret4)
 76 
 77 """
 78 推导式
 79 # 列表推导式: 最终给你的是列表
 80 语法 : [最终结果(变量) for 变量 in 可迭代对象]
 81 """
 82 # lst = [i for i in range(1, 15)]
 83 # print(lst)
 84 #
 85 # names = [['yuxin', 'neihaiyuan', 'yuxiaoxin'], ['yufanxiu', 'yuhuaxiu']]
 86 # lst = [name for first in names for name in first if name.count("x") == 2]
 87 # print(lst)
 88 # # 列表推导式
 89 #
 90 # g = (i for i in range(0, 10))
 91 # print(g)  # 打印出来的是生成器地址
 92 # print(list(g))
 93 #
 94 # for e in g:
 95 #     print(e)
 96 
 97 
 98 def func():
 99     print("111")
100     yield 222
101 
102 
103 g = func()  # 获取生成器
104 g1 = (i for i in g)
105 g2 = (i for i in g1)
106 print(list(g))  # 打印 111
107 print(list(g1))
108 print(list(g2))
109 # yield 与 return 的区别
110 """
111 yield 是分段来执行一个函数
112 而 return 直接停止执行函数
113 """
114 # 获取1-100内所有的偶数
115 lst = [i for i in range(1, 101) if i % 2 == 0]
116 print(lst)
117 
118 gen = (i for i in range(0, 101))
119 print(gen)   # <generator object <genexpr> at 0x0000022918E41F50>
120 
121 gen = (i for i in range(2, 55))
122 for i in gen:
123     print(i, end=" ")
124 print()
125 # 获取1-100内能被3整除的数
126 gen = (i for i in range(1, 101) if i % 3 == 0)
127 while 1:
128     try:
129         print(gen.__next__(), end=" ")
130     except StopIteration:
131         break
132 
133 
134 # 100以内能被3整除的数的平⽅
135 gen = (i*i for i in range(1, 101) if i % 3 == 0)
136 for i in gen:
137     print(i, end="\t")
138 print("  ")
139 
140 # 寻找名字中带有两个e的⼈的名字
141 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
142          ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
143 # 普通方法
144 for i in names:
145     for name in i:
146         if name.count("e") == 2:
147             print(name, end="\t")
148 print("  ")
149 
150 # 生成器方法
151 gen = (name for i in names for name in i if name.count("e") == 2)
152 for name in gen:
153     print(name, end="\t")
154 # ⽣成器表达式和列表推导式的区别:
155 # 1. 列表推导式比较耗内存. ⼀次性加载. ⽣成器表达式⼏乎不占⽤内存. 使⽤的时候才分
156 # 配和使⽤内存
157 # 2. 得到的值不⼀样. 列表推导式得到的是⼀个列表. ⽣成器表达式获取的是⼀个⽣成器.
158 """
159 字典推导式:
160  根据名字应该也能猜到. 推到出来的是字典
161 """
162 # 把字典中的key和value互换
163 # dic = {'a': 1, 'b': '2'}
164 # dict_1 = {dic[key]: key for key in dic}
165 # print(dict_1)
166 
167 # 在以下list中. 从lst1中获取的数据和lst2中相对应的位置的数据组成⼀个新字典
168 lst1 = ['jay', 'jj', 'sylar']
169 lst2 = ['周杰伦', '林俊杰', '邱彦涛']
170 # dic = {i: j for i in lst1 for j in lst2}
171 # print(dic)    这个写法是错误的
172 dic = {lst1[i]: lst2[i] for i in range(len(lst1))}
173 print(dic)
174 # dic = {}
175 # for i in range(len(lst1)):
176 #     dic[lst1[i]] = lst2[i]
177 # print(dic)
178 # 集合推导式:
179 #  集合推导式可以帮我们直接⽣成⼀个集合. 集合的特点: ⽆序, 不重复. 所以集合推导式⾃
180 # 带去重功能
181 lst = [1, -1, 8, -8, 12]
182 # 绝对值去重
183 s = {abs(i) for i in lst}   # abs() 函数 意思是 绝对值函数
184 # s = {i for i in lst if i > 0}
185 print(s)
186 
187 
188 def add(a, b):
189     return a + b
190 
191 
192 def test():
193     for r_i in range(4):
194         yield r_i
195 
196 
197 g = test()
198 for n in [2, 10]:
199     g = (add(n, i) for i in g)
200 print(list(g))

 

posted @ 2021-11-01 17:29  余鑫2020  阅读(105)  评论(0)    收藏  举报