(一 ) 生成器 本质 就是迭代器,一个一个的创建 对象
1) 生成器 的创建方式:
# def func():
# print("我叫哈哈哥.")
# return "嘻嘻姐"
# ret = func()
# print(ret)
# print(func()) #这样都可以打印出 2句话
# ## 当 变化这个函数 一个词 就会变成 生成器
# ## 大坑 生成器 运行之后,产生了一个生成器,而不是 运行函数
# def func():
# print("我叫哈哈哥")
# yield "嘻嘻姐" # 表示返回 不会终止函数的 运行
#
#
# ret = func() # 执行 函数 此时没有 运行函数
#
# # 此时我们得到了 生成器
# print(ret.__next__())
# print(ret.__next__())
a. 生成器函数
# def buy():
# lst = []
# for i in range(100):
# lst.append("衣服%s" % i)
# return lst
# lst = buy()
# print(lst)
#
#
#
# def buy():
# for i in range(100):
# yield "衣服%s" % i
# gen = buy() ### 生成器 迭代器 好处 节省 内存
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())
# for yifu in gen: # 迭代器.__next__()
# print(yifu)
# lst = list(gen) # 内部使用的 是 for 循环 -> __next__
# print(lst)
# send() -> __next__()
# send 可以给上一个 yield 传值
## 生成器 函数在 执行的时候 返回生成器,而不是 执行 此函数
## 能 向下执行的 两个条件
# __next__(),执行到下 一个 yield
## send() 执行到下一个 yield ,给上一个 yield 位置 传值
## 生成器中记录的是代码而不是函数的运行
b. 通过生成器表达式来获取函数
## 生成器 表达式
# g = (i for i in range(1,10))
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
def func():
lst = ["衣服%s" % i for i in range(1,5)]
yield from lst
lst1 = ["python%s期" % i for i in range(1,18)]
yield from lst
gen = func()
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
c. 类型转换
(二 )生成器函数:
生成器函数中包含 yield , 返回数据和 return 差不多,
return 会立即结束这个函数的执行
yield 可以分段的执行一个函数
# 生成器函数在执行的时候返回生成器,而不是直接执行函数
# 能向下执行的两个条件:
1) __next__() 执行到下一个 yield
2) send() , 执行到下一个 yield ,给上一个 yield 位置传值
# 所有的生成器都是迭代器都可以直接使用 for 循环
都可以使用 list()函数来获取到生成器 内 所有的 数据
### 生成器 中记录的是代码 而不是函数的运行
def func():
print("我叫哈哈哥")
yield "哈哈笑"
gen = func() #创建生成器,此时运行会把生成器函数中的代码记录在内存
当执行到__next__(), 运行此空间中 的代码,运行到 yield 结束
## 优点: 节省内存,生成器本身就是代码,几乎不占内存
## 特点: 惰性机制,只能向前,不能反复
(三) 各种推导式
1) 列表推导式: [结果 for循环 if条件判断]
# 寻找名字中带有两个e的⼈的名字
# 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)
# lst= [11,22,33]
# dic = {i:lst[i] for i in range(len(lst))}
# print(dic) # 结果是 {0: 11, 1: 22, 2: 33}
2)字典推导式: {结果(k,v) for循环 if }
# # 把字典的 key value 互换
# dic = {"主食": "炒面", "副食": "小拌菜", "汤":"疙瘩汤"}
#
# dic1 = {v:k for k,v in dic.items() }
# print(dic1)
3)集合推导式:{结果(k) for循环 if)
###### 没有元祖的推导式啊
(四)生成器表达式
(结果 for循环 if)
(五) 这个有点意思哦
# def add(a,b ):
# return a + b
# def test():
# for r_i in range(4):
# yield r_i
# g = test()
# for n in [2,10]:
# g = (add(n,i)for i in g)
# print(list(g))
结果是什么呢????????
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
#
# # ### 结果是 两个字符串相加 list[20, 21, 22, 23]
这个 结果又是什么 ????
# def fib(max):
# n,a,b = 0 ,0 ,1
# while n < max:
# print(b)
# a ,b = b , a + b
# n += 1
# return "done"
# fib(10)