Python函数返回值疑问:为何return仅返回单个值,如何返回全部?
问题
我写了下面这个Python函数:
def filter_verdi_total_fruit_cost(file_name): output = [] for token in file_name.split('\n'): items = token.split() if len(items) > 2 and items[1] in fruit_words: output.append((items[1], items[-1])) for _, v in output: return v print(filter_verdi_total_fruit_cost(verdi50))
调用后只打印出单个值 123,20,但把return v换成print(v)后,调用print(filter_verdi_total_fruit_cost(verdi50))能输出所有匹配的成本值:
123,20 2.772,00 46,20 577,50 69,30 3.488,16 137,50 500,00 1.000,00 2.000,00 1.000,00 381,2
想知道怎么不用print语句,让函数返回所有这些值?
解决办法
你的问题出在两个关键点:
return的特性:return语句一执行就会直接终止函数,所以第一次走到return v时,函数立刻结束,只能返回第一个匹配到的值。- 冗余的内部循环:每次往
output添加元素后就立刻遍历output并返回,完全打断了收集所有结果的逻辑。
要返回所有值,你需要先把所有匹配结果收集完成,再统一返回,有两种常用方案:
方案1:返回结果列表
先把所有符合条件的值收集到列表中,循环结束后一次性返回:
def filter_verdi_total_fruit_cost(file_name): output = [] for token in file_name.split('\n'): items = token.split() if len(items) > 2 and items[1] in fruit_words: # 若需要保留水果名和成本的对应关系,用这句: # output.append((items[1], items[-1])) # 仅需成本值的话用这句: output.append(items[-1]) # 循环执行完毕后返回所有结果 return output # 调用函数后可遍历结果输出或做其他处理 results = filter_verdi_total_fruit_cost(verdi50) for cost in results: print(cost)
方案2:用生成器返回(适合大数据场景)
如果处理的内容体量较大,不想一次性占用过多内存,可以用生成器逐个返回结果:
def filter_verdi_total_fruit_cost(file_name): for token in file_name.split('\n'): items = token.split() if len(items) > 2 and items[1] in fruit_words: # 若需返回元组,替换为:yield (items[1], items[-1]) yield items[-1] # 调用生成器并遍历输出 for cost in filter_verdi_total_fruit_cost(verdi50): print(cost)
核心说明
return的作用是终止函数并返回单个值(或单个容器),不能在循环内用它返回多个值。要么把所有结果装进列表、元组等容器,循环结束后统一返回;要么用yield创建生成器,让函数变成可迭代对象,调用时遍历即可获取所有结果。
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

