一、 生成器:
1.1 特点:
生成器的本质就是一个迭代器
生成器一定是一个迭代器,迭代器不一定是一个生成器
生成器是可以让程序员自己定义的一个迭代器
生成器的好处,节省内存空间
生成器的特性继承迭代器特性:一次性的,惰性机制,从上向下
1.2 生成器的普通方法:
#方式一:
#每次创建一个新的生成器对象
deffunc():print(111)yield 5
print(222)yield 10
print(func().__next__()) #每次创建一个新的生成器对象
print(func().__next__())#方式二:
#只创建一个生成器
deffunc():print(111)yield 5 #碰到yield不结束就挂起
print(222)yield 10generator= func() #只创建一个生成器
print(generator.__next__()) #第一次打印 111 5 生成器停在yield 5 处 挂起
print(generator.__next__()) #第二次打印 222 10 生成器停在yield 10 处 挂起
print(generator.__next__()) #第三次无法找到新的生成器,报错
#python2 next() iter()#python3 next() __next__() iter() __iter__()
#方式三:
next() == generator.__next__() 方法相同deffunc():print(111)yield 5
print(222)yield 10generator=func()print(next(generator)) #第一次打印 111 5 生成器停在yield 5 处
print(next(generator)) #第二次打印 222 10 生成器停在yield 10 处
print(next(generator)) #第三次无法找到新的生成器,报错
View Code
1.3 生成器的send()方法:
1.3.1 特点:
第一次调用生成器的时候使用send里边的值必须是None,建议一般第一次获取生成器时使用.__next__() 方法
1.3.2 范式:
#第一次调用生成器的时候使用send里边的值必须是None,一般第一次获取生成器时使用__next__
#范式
deffunc():print(111)
a= yield 5 #1.挂起 2.返回值 3.接收值
print(a) #123
print(222)
b= yield 10
print(b)
generator=func()print(generator.send(None)) #第一次使用send必须为None
print(generator.send('123')) #第一次传参获取yield位置,send = next() + 传值
print(generator.send('456')) #第二次传参获取yield位置
aa= generator.__next__() #aa=123
print(aa + 5) #生成器返回参数
print(generator.__next__())
View Code
1.4 生成器的from()方法:
1.4.1 特点:
将可迭代对象元素逐个返回
#生成器from方法:#yield from 将可迭代对象元素逐个返回
deffunc():
lst= [1, 2, 3, 4, 5]
lst1= [6, 7, 8, 9]#for index in lst: # 普通方法执行yield方法
#yield index
yield from lst #yield from 方法实现
yield from lst1 #第二个yield from
g=func()print(next(g)) #1
print(next(g)) #2
print(next(g)) #3
print(next(g)) #4
print(next(g)) #5
print(next(g)) #6
print(next(g)) #7
print(next(g)) #8
print(next(g)) #9
View Code
二、 列表推导式:
2.1 推导式类型:
列表
集合 {1,2,3}
字典 {1:2,2:4}
2.2 推导式的特点:
实现小的需求时可以使用推导式,推导式节省代码
推导式不要写太长,可读性差
2.3 推导式的常用方法:
2.3.1 样式:
[结果 语法] #容器 列表推导式
{结果 语法} #容器 字典推导式或集合推导式
(结果 语法) # 生成器推导式
2.3.2 列表推导式:
#列表推导式:
#方式一:#[结果 语法]
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嵌套循环方法:
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)]) #推导式循环
View Code
2.3.3 集合与字典推导式:
#集合推导式
#{结果 语法} 容器
s = {i for i in range(10)} #生成一个集合
print(s)#字典推导式:
print({i:i+1 for i in range(10)}) #生成一个字典
View Code
2.3.4 生成器推导式:
注意: 生成器推导式类似于元组,但并不存在元组推导式!
#生成器推导式#注意只有生成器推导式(没有元组推导式)
g= (i for i in range(4))print(g) # at 0x00000150D6D20EB8>
print(g.__next__()) #0
print(g.__next__()) #1
print(g.__next__()) #2
print(g.__next__()) #3
View Code