You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中next()函数返回意外None值的技术咨询

问题解析:为什么输出里会出现None?

嘿,这个问题其实很好理解,咱们一步步拆解来看~

你遇到的None,根源在于**print()函数本身的返回值就是None**,而你的代码逻辑相当于做了两次输出操作:

  1. 当你调用next(G)时,生成器会执行内部的print(x),这会在屏幕上输出foo/bar/baz;
  2. 但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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:55:30