python基础(生成器、列表推导式)
一、 生成器:
1.1 特点:
生成器的本质就是一个迭代器
生成器一定是一个迭代器,迭代器不一定是一个生成器
生成器是可以让程序员自己定义的一个迭代器
生成器的好处,节省内存空间
生成器的特性继承迭代器特性:一次性的,惰性机制,从上向下
1.2 生成器的普通方法:
# 方式一: # 每次创建一个新的生成器对象 def func(): print(111) yield 5 print(222) yield 10 print(func().__next__()) # 每次创建一个新的生成器对象 print(func().__next__()) # 方式二: # 只创建一个生成器 def func(): print(111) yield 5 # 碰到yield不结束就挂起 print(222) yield 10 generator = 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__() 方法相同 def func(): print(111) yield 5 print(222) yield 10 generator = func() print(next(generator)) # 第一次打印 111 5 生成器停在yield 5 处 print(next(generator)) # 第二次打印 222 10 生成器停在yield 10 处 print(next(generator)) # 第三次无法找到新的生成器,报错
1.3 生成器的send()方法:
1.3.1 特点:
第一次调用生成器的时候使用send里边的值必须是None,建议一般第一次获取生成器时使用.__next__() 方法
1.3.2 范式:
# 第一次调用生成器的时候使用send里边的值必须是None,一般第一次获取生成器时使用__next__ # 范式 def func(): 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__())
1.4 生成器的from()方法:
1.4.1 特点:
将可迭代对象元素逐个返回
# 生成器from方法: # yield from 将可迭代对象元素逐个返回 def func(): 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
二、 列表推导式:
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)]) # 推导式循环
2.3.3 集合与字典推导式:
# 集合推导式 # {结果 语法} 容器 s = {i for i in range(10)} # 生成一个集合 print(s) # 字典推导式: print({i:i+1 for i in range(10)}) # 生成一个字典
2.3.4 生成器推导式:
注意: 生成器推导式类似于元组,但并不存在元组推导式!
# 生成器推导式 # 注意只有生成器推导式(没有元组推导式) g = (i for i in range(4)) print(g) # <generator object <genexpr> at 0x00000150D6D20EB8> print(g.__next__()) # 0 print(g.__next__()) # 1 print(g.__next__()) # 2 print(g.__next__()) # 3
https://www.cnblogs.com/WiseAdministrator/