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))