python - Python在尝试打印时返回一个生成器对象?
问题描述
所以我尝试使用列表理解进行打印,我想在迭代中单独打印每个元素。有问题的代码:
str1 = "You don't know how amazing it is to learn how to program!"
list1 = str1.split(" ")
print(i.upper() for i in list1 if len(i) > 5)
但是当我尝试运行代码时,它会吐出:
<generator object <genexpr> at 0x000001F4212233C0>
期望的输出是:
AMAZING
PROGRAM!
除了使用普通的 for 循环之外,我还能在这里使用print()
函数内部的一行代码来实现我想要的吗?
解决方案
表格
(i.upper() for i in list1 if len(i) > 5)
是生成器表达式 (a genexpr
)。在迭代之前它不会有值,并且print()
不会自行迭代对象。(它只用它们生成字符串,并且<generator object <genexpr>>
是生成器表达式的字符串形式。
要解决此问题,您有几个选择(除了使用列表推导):
- 在genexpr 上使用
"\n".join()
以使其成为由换行符连接的字符串:print("\n".join(i.upper() for i in list1 if len(i) > 5))
print
您可以使用*
运算符将生成器表达式转换为参数,并print
通过换行符来分隔值:print(*(i.upper() for i in list1 if len(i) > 5), sep="\n")
推荐阅读
- python - 使用 Pipenv 和 setup.py 将包发布并安装到 Github
- asp.net - 使用 ASP.NET Web Api 和 Angular 10 进行授权
- java - 如何Junit测试读取文件然后将内容存储到ArrayList
- amazon-dynamodb - awscli 在验证属性定义时不考虑全局二级索引
- azure - 逻辑应用程序 - 获取 http 请求的响应时间
- google-admin-sdk - Google Meet:可以通过审核日志 API 获得会议昵称吗?
- android-ble - 在 Android 上写入 BLE gatt 特性 — 错误状态 255
- ruby-on-rails - sidekiq 的任务是否有任何“组异步等待”?
- python - 按一列降序对 2by2 Numpy 数组进行排序
- visual-studio-code - VS Code 工具问题 - 在双显示器中显示空白