list01 = [random.randint(1, 5) for i in range(5)]
|| 中括号变成小括号
gen01 = (random.randint(1, 5) for i in range(5))
# 列表推导式import randomlist01 = [random.randint(1, 5) for i in range(5)]print(list01) # [1, 3, 4, 1, 2]# 天生器表达式gen01 = (random.randint(1, 5) for i in range(5))print(gen01) # <generator object <genexpr> at 0x7f18cc1c8830>三、天生器调用方式:
方式一:gen.__next__()
# 天生器当中的元素只能获取一遍# for 天生器.__next__()print("data:", gen01.__next__()) # 第一个数据print("data:", gen01.__next__()) # 第二个数据
方式二:for循环
for item in gen01: print("for:", item)# print("data:", gen01.__next__()) # 报错:StopIteration三、天生器函数yield:
# 天生器函数# return: 函数实验的停止# yield: 体现函数实验的停息def func02(): a = 1 yield a b = "hello" yield b c = [1, 2] yield cgen2 = func02()print("gen2:", gen2)# <generator object func02 at 0x7f94da357a98>print(gen2.__next__()) # 1print(gen2.__next__()) # hellofor item in gen2: print("for:", item) # [1, 2]# gen2.__next__() # 报错四、案例
需求:
使用函数实现天生器 yield
函数担当一个文件对象作为参数(读文件)
天生器函数每次返回文件的 10 行数据
# 实现思绪:# 创建list容器吸收读取的文件内容# 读取文件内容,并将每一行存储到list中# 判断list长度是否为10,是,yield返回,清空列表# 读取完文件后,查察list是否大于0,是,yield返回def get_lines(file_name): li = [] with open(file_name, mode="r") as fr: while True: line = fr.readline() # 没数据就退出循环 if line is "": break # 添加每一行的数据 li.append(line) # 判断line长度 if len(li) == 10: yield li li.clear() # 兜底判断,包管末了的数据完备性 if len(li) != 0: yield liif __name__ == '__main__': gen = get_lines("/etc/hosts") # 循环输出文件内容 for item in gen: print("line:", item)