Python中next()函数返回意外None值的技术咨询
问题解析:为什么输出里会出现
None? 嘿,这个问题其实很好理解,咱们一步步拆解来看~
你遇到的None,根源在于**print()函数本身的返回值就是None**,而你的代码逻辑相当于做了两次输出操作:
- 当你调用
next(G)时,生成器会执行内部的print(x),这会在屏幕上输出foo/bar/baz; - 但
print(x)没有返回值(或者说返回None),生成器会把这个返回值传递出来,然后你又用外层的print()把这个None打印了一遍。
所以就出现了你看到的foo之后跟着None的情况——这是两次输出叠加的结果。
两种修正方案
方案1:让生成器返回元素,外层负责打印
把生成器改成返回列表元素,而不是直接在生成器里执行print,这样外层的print(next(G))就会打印元素本身:
liste=['foo','bar','baz'] try: G = (x for x in liste) # 生成器返回x,而非执行print print(next(G)) print(next(G)) print(next(G)) print(next(G)) except StopIteration: print("That was obviously expected")
这个版本的输出就和你预期的完全一致了。
方案2:保留生成器内的print,但不要外层的print包裹
如果你想在生成器里处理打印逻辑,那只需要调用next(G)触发执行即可,不需要再用print()包裹它(因为生成器内部已经完成了输出):
liste=['foo','bar','baz'] try: G = (print(x) for x in liste) next(G) # 触发生成器执行print(x),输出foo,不打印返回的None next(G) next(G) next(G) except StopIteration: print("That was obviously expected")
这个版本也会输出你想要的结果。
核心总结
记住一个关键点:所有没有return语句(或者return后没有值)的函数,默认返回None,print()就是典型的这类函数。你的代码相当于把print(x)的返回值又打印了一次,才出现了多余的None。
内容的提问来源于stack exchange,提问作者Sam The Sid
相关产品推荐
相关产品推荐

