一、生成器
1.生成器的本质就是迭代器
生成器一定是一个迭代器,迭代器不一定是一个生成器
def func():
print(1)
yield 5 # 我的函数走到这了,停了
print(2)
yield 9 # 我的函数走到这了,停了
g = func() # 生成一个生成器
print(g.__next__()) # 1 5
print(g.__next__()) # 2 9
print(g.__next__()) # 报错 StopIteration
ps:错误三种分析
1.语法分析
2.语义分析
3.词法分析
2.生成器特点
- 非常节省内存
- 碰到yield不结束就挂起
- 惰性机制
- 不能从下向上走
- 一次性的,用完就没了
应用场景:需要大批量数据时,可以用生成器,用一个释放一个
def func():
print(1)
a = yield 2 # 1.挂起 2.返回值 3.接受值
print(a) # '123'
print(3)
b = yield 4
print(b) #'234'
c = yield 9
g = func()
print(g.__next__()) #1 2 g.send(None)
print(g.send('123')) # send = next+传值
print(g.send('234')) # send = next+传值
第一次调用生成器的时候使用send里边的值必须是None
def func():
li = [1,2,3,4]
yield from li
ret = func() # 把生成器的地址给了ret
print('is ret',ret.__next__()) # is ret 1
# 执行ret这个变量的指向的生成器地址
print('is ret',ret) # is ret <generator object func at 0x0000023C6B9816D8>
# 在全局空间找到一个变量叫做ret的,打印它的值 值就是生成器的地址
def func():
with open('t','r',encoding='utf-8')as f:
for i in f:
i = i.strip('\r\n')
yield i
g = func()
for i in range(10):
print(g.__next__())
二、推导式
1.列表推导式
格式:[结果 语法]
li = []
for i in range(10):
li.append(i)
print(li)
print([i for i in range(10)])
# 两个输出结果是一样
带筛选功能的列表推导式
li = []
for i in range(10):
if i%2 == 1:
li.append(i)
print(li)
print([i for i in range(10) if i%2 == 0])
li = []
for i in range(10):
for em in range(3):
li.append(em)
print(li)
print([j for i in range(10) for em in range(3) for j in range(5)])
2.集合推导式
格式:{结果 语法}
s = {i for i in range(10)}
print(s)
3.字典推导式
print({i:i+1 for i in range(10)})
推导式:
1.列表
2.集合
3.字典
没有其他推导式
元组是生成器推导式