生成器和生成器函数,推导式和生产器表达式。

1. 生成器和生成器函数
生成器的本质就是迭代器
生成器的三种创建办法:
1.通过生成器函数
2.通过生成器表达式创建生成器
3.通过数据转换
生成器函数:
函数中包含了yield的就是生成器函数
注意:生成器函数被执行. 获取到的是生成器. 而不是函数的执行
生成器表达式:
(结果 for 变量 in 可迭代对象 if 筛选)
取值:
1. __next__()
2. send(值) 给上一个yield位置传一个值, 第一个和最后一个yield不用传值
3. 可以for循环
4. list(g)
2. 各种推倒式和生成器表达式
1. 列表推倒式 [结果 for 变量 in 可迭代对象 if 筛选]
2. 字典推倒式 {结果 for 变量 in 可迭代对象 if 筛选} 结果=>key:value
3. 集合推倒式 {结果 for 变量 in 可迭代对象 if 筛选} 结果=>key

-------------------------------------------举例试题--------------------------------------------

# 1. 获取1-100内能被3整除的数
# lst = [i for i in range(1,101) if i % 3 == 0]
# 2. 100以内能被3整除的数的平方
# lst = [i*i for i in range(1,101) if i % 3 == 0]
# 3. 寻找名字中带有两个e的⼈的名字
# names = [['Tom', 'Billy', 'Jefferson' , 'Andrew' , 'Wesley' , 'Steven' ,
# 'Joe'],['Alice', 'Jill' , 'Ana', 'Wendy', 'Jennifer', 'Sherry' , 'Eva']]
# lst = [name for first in names for name in first if name.count("e") == 2]
# print(lst)
#
# lst = ["衣服%s" % i for i in range(10000)]

# 生成列表 里面装1-14的数据
# lst = []
# for i in range(1,15):
# lst.append("python%s" % i)
# print(lst)

# 列表推倒式; 最终给你的是列表
# 语法 [最终结果(变量) for 变量 in 可迭代对象]

# lst = [i for i in range(1,15)]
# print(lst)

# [最终结果 for 变量 in 可迭代对象 if 条件]
lst = [i for i in range(1,101) if i%2==0]
print(lst)

---------------------------------------------------------------------------------------------------

# dic = {"a":"b", "c":"d"}
# # 把字典中的key:value互换 .{"b":"a", "d":"c"}
# new_dic = {dic[key]:key for key in dic}
# print(new_dic)

# lst1 = ["alex", "wusir", "taibai", "ritian"]
# lst2 = ['sb', "很色", "很白", "很牛"]
# # {"alex":"sb", "wusir":"很色"}
#
# dic = { lst1[i]:lst2[i] for i in range(len(lst1))}
# print(dic)

# dic = {"a":"b","c":"d"}
# #把字典中的key:value互换.{"b":"a":"d":"c"}
# new_dic = {dic[key]:key for key in dic}
# print(new_dic)
#
# #lst1 = ["alex","wusir","taibai","ritian"]
# #lst2 = ['sb',"很色","很白","很牛"]
# #{"alex":"sb","wusir":"很色"}
# dic = {lst1[1]:lst2[i] for i in range(len(lst1))}
# print(dic)
#
# dic = {"a":"b","c":"d"}


# name = "aleX leNb"
# e1 = name.find("e", 0,5)
# print(e1)
#
# e2 = name.find("e",5)
# print(e2)

# count = 1
# while count <= len(name):
# if name[count] =='e':
# print(count)
# count = count + 1
#
# s = "123a4b5c"
# s = "asdfer"
# for c in s: #c :chartor
# print(c)

# content = input("请输入内容")
# lst = content.split("+")
# s1 = lst[0]
# s2 = lst[1]
# a1 = int(s1)
# a2 = int(s2)
# print(a1+a2)
#
# lst = ["皇阿玛", "皇额娘", "容嬷嬷", "紫薇"]
# it = lst.__iter__()
# while True:
# try:
# name = it.__next__()
# print(name)
# except StopIteration:
# break
#
#
# dic = {"a":"b", "c":"d"}
# new_dic = {dic[key]:key for key in dic} #字典的key和value对调
# print(new_dic)
#
#
# lst1 = ["alex","wusir","taibai","ritian"]
# lst2 = ['sb',"很色","很白","很牛"]
# dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
# print(dic)
# #列表1和列表二合并,1作为key,2作为value

# def func():
# print("111")
# return 222
# ret = func()
# print(ret)


# def func():
# print("111")
# yield 222
# ret = func()
# print(ret)

----------------------------------------------------------------------------------------------------------------

def add(a, b):
return a + b


def gen():
for r_i in range(4):
yield r_i


g = gen()

for n in [2, 10]:
g = (add(n, i) for i in g)
print(list(g))

----------------------------------------------------------------------------------------------------------------------------

# def func():
# print("大碴粥")
# a = yield "11"
# print(a)
# print("狗不理")
# b = yield "22"
# print(b)
# print("大麻花")
# c = yield "33"
# print(c)
#
# g = func()
# print(g.__next__())
# print(g.send(1))
# print(g.send(2))
# print(g.send(3))

# __next__() 可以让生成器向下执行一次
# send() 也可以让生成器向下执行一次, 给上一个yield传一个值, 第一个不能用send(). 最后一个也不要传值


def eat():
print("我吃什么啊")
a = yield "馒头"
print("a=",a)
b = yield "大饼"
print("b=",b)
c = yield "韭菜盒子"
print("c=",c)
yield "GAME OVER"

gen = eat() # 获取⽣成器

ret1 = gen. __next__ ()
print(ret1)
ret2 = gen.send("胡辣汤")
print(ret2)
ret3 = gen.send("狗粮")
print(ret3)
ret4 = gen.send("猫粮")
print(ret4)


def func():
yield 11
yield 22
yield 33
yield 44
g = func()
lst = list(g) # 可迭代对象
print(lst)

原文地址:https://www.cnblogs.com/songhuasheng/p/9330305.html