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

Python中采用Pythonic风格编写的代码返回<generator object>的原因解析

问题原因及解决办法

你遇到的这个情况很典型——本质是你把生成器对象直接传给了print()函数,而不是遍历生成器里的元素来打印。

为什么会出现<generator object ...>?

在Python里,i for i in a.values() if i<0是一个生成器表达式,它不会立刻生成所有符合条件的数值,而是创建了一个等待被迭代的生成器对象。当你直接把这个生成器传给print()时,Python只会打印这个对象的身份标识(也就是你看到的<generator object at 0x...>),而不是它里面的元素。

对比你的原代码:原代码通过for循环主动遍历了a.values()里的每个元素,遇到小于0的就打印——这相当于主动去迭代并处理生成器(如果原代码换成生成器的话)里的内容,所以能输出预期的负数。

怎么修改新代码达到预期效果?

这里有几种Pythonic的方式:

  1. 把生成器转为列表后打印
    如果想一次性输出所有符合条件的元素(以列表形式),可以用list()把生成器转换成列表:

    a={ 'AA':-5, 'BB':-8, 'C':15, 'D':-85, 'E':24 }
    print(list(i for i in a.values() if i<0))
    

    输出会是:[-5, -8, -85]

  2. 遍历生成器逐个打印(和原代码效果一致)
    保持生成器的惰性特性,用循环遍历它来逐个打印元素:

    a={ 'AA':-5, 'BB':-8, 'C':15, 'D':-85, 'E':24 }
    for num in (i for i in a.values() if i<0):
        print(num)
    

    这会和原代码一样,每行输出一个负数。

  3. 用解包操作直接打印所有元素
    利用Python的解包语法*,把生成器里的元素作为print()的多个参数,再指定分隔符为换行:

    a={ 'AA':-5, 'BB':-8, 'C':15, 'D':-85, 'E':24 }
    print(*(i for i in a.values() if i<0), sep='\n')
    

    这个写法既简洁,又能得到和原代码完全一样的输出效果。

内容的提问来源于stack exchange,提问作者Meriole

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:27:35