Python生成器send方法传值无法打印及前两项记录丢失问题咨询
问题原因分析
- 前2条记录未输出的原因:
send()和next()的执行逻辑一致,都会触发生成器运行到下一个yield位置,同时返回yield抛出的值。你调用的两次send操作都没有接收返回值:- 第一次
variable.send(None)是生成器启动操作,会读取第一条记录Tim,22,运行到yield处暂停,返回('Tim', 22),该值被直接丢弃 - 第二次
variable.send("Jane, 35")会把传入的字符串赋值给生成器内的variable变量,继续运行读取第二条记录Tonya,45,运行到yield处暂停,返回('Tonya', 45),该值同样被丢弃
后续循环打印时自然从第三条记录('Mary', 12)开始输出,前两条就消失了。
- 第一次
- 新宾客Jane未输出的原因:你的生成器没有对
send传入的值做任何处理。拿到存入variable的"Jane, 35"后,你没有做解析、存储、yield返回的操作,直接进入下一轮循环读取文件内容,该值直接被丢弃。 - 最终报
StopIteration的原因:原文件一共只有14条宾客记录,加上新增的Jane一共15条有效数据,你循环打印16次超出了生成器能返回的元素总数。
修复后的代码示例
guests = {} def read_guestlist(file_name): text_file = open(file_name,'r') while True: line_data = text_file.readline().strip().split(",") if len(line_data) < 2: # 读取完文件后关闭,退出循环 text_file.close() break name = line_data[0] age = int(line_data[1]) guests[name] = age variable = yield name, age # 新增逻辑:处理send传入的新宾客 if variable is not None: new_name, new_age = variable.strip().split(",") new_age = int(new_age.strip()) guests[new_name] = new_age yield new_name, new_age guest_gen = read_guestlist('guest_list.txt') # 启动生成器,接收第一条返回值 print(next(guest_gen)) # 传入新宾客,接收第二条返回值 print(guest_gen.send("Jane, 35")) # 剩余还有13条原记录+刚插入的1条新记录,共14条,循环14次即可 for _ in range(14): print(next(guest_gen))
内容的提问来源于stack exchange,提问作者Blenderinho
相关产品推荐
相关产品推荐

