生成器generator
(1) 定义:能够动态(循环一次计算一次返回一次)提供数据的可迭代对象。
(2) 作用:在循环过程中,按照某种算法推算数据,不必创建容器存储完整的结果,从而节省内存空间。 数据量越大,优势越明显。以上作用也称之为延迟操作或惰性操作,通俗的讲就是在需要的时候才计算 结果,而不是一次构建出所有结果。
1 生成器函数
(1) 定义:含有yield语句的函数,返回值为生成器对象。
(2) 语法
# 创建:
def 函数名():
…
yield 数据
…
# 调用:
for 变量名 in 函数名():
语句
(3) 说明:
– 调用生成器函数将返回一个生成器对象,不执行函数体。 – yield翻译为”产生”或”生成”
(4) 执行过程:
a. 调用生成器函数会自动创建迭代器对象。
b. 调用迭代器对象的next()方法时才执行生成器函数。
c. 每次执行到yield语句时返回数据,暂时离开。
d. 待下次调用next()方法时继续从离开处继续执行。
(5) 原理:生成迭代器对象的大致规则如下
a. 将yield关键字以前的代码放在next方法中。
b. 将yield关键字后面的数据作为next方法的返回值。
(6) 演示:
def my_range(stop):
number = 0
while number < stop:
yield number
number += 1
for number in my_range(5):
print(number) # 0 1 2 3 4
2 内置生成器
2.1 枚举函数enumerate
(1) 语法:
1 for 变量 in enumerate(可迭代对象):
2 语句 3
4 for 索引 , 元素in enumerate(可迭代对象):
5 语句
(2) 作用:遍历可迭代对象时,可以将索引与元素组合为一个元组。
(3) 演示:
list01 = [43, 43, 54, 56, 76]
# 从头到尾读 -- 读取数据
for item in list01:
print(item)
# 非从头到尾读 -- 修改数据
for i in range(len(list01)):
if list01[i] % 2 == 0:
list01[i] += 1
for i, item in enumerate(list01): # -- 读写数据
if item % 2 == 0:
list01[i] += 1
2.2 zip
(1) 语法:
1 for item in zip(可迭代对象1, 可迭代对象2):
2 语句
(2) 作用:将多个可迭代对象中对应的元素组合成一个个元组,生成的元组个数由最小的可迭代对象决 定。
(3) 演示:
list_name = ["悟空", "八戒", "沙僧"]
list_age = [22, 26, 25]
# for 变量 in zip(可迭代对象1,可迭代对象2)
for item in zip(list_name, list_age):
print(item)
# ('悟空 ', 22) # ('八戒 ', 26) # ('沙僧 ', 25)
# 应用:矩阵转置
map = [
[2, 0, 0, 2],
[4, 2, 0, 2],
[2, 4, 2, 4],
[0, 4, 0, 4]
]
# new_map = []
# for item in zip(map[0],map[1],map[2],map[3]): # new_map.append(list(item))
# print(new_map)
# new_map = []
# for item in zip(*map):
# new_map.append(list(item))
new_map = [list(item) for item in zip(*map)]
print(new_map)
# [[2, 4, 2, 0], [0, 2, 4, 4], [0, 0, 2, 0], [2, 2, 4, 4]]
4.3 生成器表达式
(1) 定义:用推导式形式创建生成器对象。
(2) 语法:
1 变量 = (表达式 for 变量 in 可迭代对象 if 条件)