python-3.x 如何在单独的行上打印生成器中的元素?

amrnrhlw  于 2022-12-14  发布在  Python
关注(0)|答案(2)|浏览(124)

使用这个简单的循环,我打印了一串数字:

rows = cursor.execute.....
rows_ftcl = rows.fetchall()

for row in rows_ftcl:
    test = row[2]
    print(test)

我想用同样的循环“Short Hand”,写在变量的同一行,得到同样的结果,我会用这样的东西:

rows = cursor.execute.....
rows_ftcl = rows.fetchall()

test = row[2] for row in rows_ftcl
print(test)

如果我使用这个,我得到错误<generator object <genexpr> at 0x7effb5f1edc0> .我还尝试添加方括号,我得到打印在一个列表中.我不想打印在一个列表中,但我想打印垂直数字(没有任何括号).
我怎样才能得到和上面的循环一样的结果呢?我想使用“速记”模式,把所有的东西写在同一行(像我的第二个例子)

3lxsmp7m

3lxsmp7m1#

生成器是一个可迭代对象,就像任何其他可迭代对象一样,它可以用作unpack或splat操作符的目标
星号*表示可迭代解包。它的操作数必须是可迭代对象。可迭代对象在解包位置展开为一个项序列,这些项包含在新的元组、列表或集合中。
因此,我们可以使用unpack操作符将生成器的所有值作为参数传递给print,然后使用sep关键字参数选择一个分隔符。

print(*(row[2] for row in rows_ftcl), sep='\n')

生成器表达式周围的额外括号仅用于操作符优先级;除了改变解析顺序之外,它们自身没有特殊的行为。

h5qlskok

h5qlskok2#

<generator object <genexpr> at 0x7effb5f1edc0>不是错误。它只是表达式row[2] for row in rows_ftcl创建的生成器对象的字符串表示形式。如果您不知道生成器是什么,许多好的解释是quick web search away
现在,您希望打印生成器生成的所有元素。为此,您首先需要构建要打印的字符串。在前面的方法中,您不需要这样做,因为您只是简单地循环生成器的元素。并逐个打印它们。print使用换行符"\n"隐式结束对它的每次调用。由于您'我们必须自己构建字符串,你必须自己把这些元素放进去,我们可以用换行符把生成器生成的所有元素连接起来。

# Join on newline ┌ join needs each element to be a string 
#       |         |
#       v         v
text = "\n".join(str(row[2]) for row in rows_ftcl)
print(text)

或者,unpack将生成器传入print的参数,并传递一个换行符作为分隔符参数。现在print的行为就像生成器的每个元素都是一个单独的参数一样,并在打印输出时使用sep中指定的字符分隔每个参数

test = (row[2] for row in rows_ftcl)
print(*test, sep="\n")

相关问题