""" 内置生成器函数 enumerate zip """ """enumerate""" # 枚举 list01 = [1, 2, 3, 4, 5, 6, 7, 8, 9] # 读取全部元素: for item in list01: pass # 修改全部元素 for i in range(len(list01)): if list01[i]: pass # item是元组(索引,元组) # 读取+修改 for i, item in enumerate(list01[-1::-1]): if item > 5: list01[i] = 5 """zip""" # 压缩 list02 = ["北京", "广州", "天津"] list03 = ["010", "020", "030"] zip(list02, list03) for item in zip(list02, list03): print(item) # 矩阵转置 map = [ [4, 2, 2, 4], [8, 4, 2, 4], [4, 8, 2, 2], [8, 2, 16, 4], ] map = [list(item) for item in zip(*map)] print(map) # 列表合并字典 dict01 = dict(zip(list03, list02)) dict02 = {k: v for k, v in zip(list03, list02)} print(dict01) print(dict02) data = zip(list03, list02) # yield生成迭代器的大致规则 # 1.将yield以前的代码定义在__next__函数中 # 2.将yield以后的数据作为__next__函数返回值 """ 步骤一:迭代器-->yield """ class Myrange: def __init__(self, end=0): self.end = end def __iter__(self): number = 0 while number < self.end: yield number number += 1 # obj = Myrange(5) # iterator = obj.__iter__() # while True: # try: # item = iterator.__next__() # print(item) # except StopIteration: # break """ 步骤二:yield-->生成器 """ def my_range(end=0): number = 0 while number < end: yield number number += 1 obj = my_range(5) print(type(obj)) print(*obj) """ # 生成器伪代码 class generator: # 生成器 def __iter__(self): # 可迭代对象 return self # (价值在于可以通过for使用生成器) def __next__(self): # 迭代器 1.计算数据 2.返回数据 3.发送错误(最后一次) """ """ 生成器函数应用 函数有一个结果,使用return返回 函数有多个结果,使用yield返回 """ list02 = [86, 80, 56, 47, 61, 67, 57, 58, 65, 58] # 生成器方法:(将每个结果通过yield返回) def find_all(num): for item in list02: if item > num: yield item generator_data = find_all(50) print(generator_data) print(*generator_data) # 生成器表达式 # generator_data = (元素 for 元素 in 序列 if 条件) generator_data = (item for item in list02 if item < 60) print(*generator_data) # 列表表达式 # list = [i for i in range()] """ 列表与生成器 列表 优点:支持索引切片 可以重复使用(__iter__内部返回新迭代器) 缺点:占用内存较大 生成器 优点:节省内存空间 缺点:不能使用索引、切片; 只能使用一次(__iter__返回自身) 适用性:优先 """ a = list02.__iter__() b = list02.__iter__() print(a) print(b) # 生成新的可迭代对象 c = generator_data.__iter__() d = generator_data.__iter__() print(c) print(d) # 不会生成新的迭代器 # 练习1:使用生成器表达式在列表中获取所有字符串. # 练习2:在列表中获取所有整数,并计算它的平方. list01 = [43, "a", 5, True, 6, 7, 89, 9, "b"] data1 = (item for item in list01 if type(item) == str) print(*data1) data2 = list(item ** 2 for item in list01 if type(item) is int) print(data2) # 生成器转列表
Python重点知识四:生成器generator
于 2023-04-11 09:10:10 首次发布