【问题标题】:One line for loops that don't require list不需要列表的循环的一行
【发布时间】:2022-01-18 23:24:27
【问题描述】:

我试图弄清楚当输出不是一个列表时,单行 for 语句是如何工作的。例如,如果我想打印这些匹配 x 到 x+10 的元组,我有代码:

[print((i2x, xi2xx)) for i2x, xi2xx in zip(range(1,11), range(11,21))]

哪个输出

(1, 11)
(2, 12)
(3, 13)
(4, 14)
(5, 15)
(6, 16)
(7, 17)
(8, 18)
(9, 19)
(10, 20)
>>> [None, None, None, None, None, None, None, None, None, None]

现在我想我明白 print 语句(我将其视为命令)是在 for 循环中执行的,但我想知道 None 的括号列表是否是单行 for 循环的必要输出.用于此的多行 for 循环如下所示:

for i2x, xi2xx in zip(range(1,11), range(11,21)):
    print((i2x, xi2xx))

只输出

(1, 11)
(2, 12)
(3, 13)
(4, 14)
(5, 15)
(6, 16)
(7, 17)
(8, 18)
(9, 19)
(10, 20)

我是否遗漏了有关括号如何在 oneline 语句中工作的内容?有没有办法只输出没有None列表的打印语句?

【问题讨论】:

  • 就像你的第二个例子是这样做的方式。
  • 理解通常用于创建有用的对象。虽然它在这里工作并产生这种无用的输出,但应该首选经典循环。
  • “一行语句”是一个列表理解,根据定义,它创建了一个值列表。它不应被滥用于打印等副作用。
  • 对于它的价值,您可以在没有列表理解的情况下在一行中执行此操作:print(*zip(range(1,11), range(11,21)), sep='\n')。我认为大多数 python 开发人员更喜欢 for 循环以提高可读性。

标签: python list for-loop output one-liner


【解决方案1】:

问题是你的代码的产物:

[print((i2x, xi2xx)) for i2x, xi2xx in zip(range(1,11), range(11,21))]

是由列表推导创建的列表(因为您使用的是方括号)。

https://www.w3schools.com/python/python_lists_comprehension.asp

列表推导式按以下方式工作:它将您写的第一件事(在您的情况下为print((i2x, xi2xx)))附加(插入列表末尾)到列表中,但是正如您所说,一个可以处理 print语句作为命令,每次它不会在列表中添加任何值,而是无。 因此,您会得到 None 值的列表。

所以如果我们写:

lst_comp = [x for x in range(10)]

print(lst_comp)

输出将是:

>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

它与for循环不同,它是列表推导,它返回列表,我相信不能称之为单行for循环...

如果我们这样写也是一样的:

lst_comp = []

for x in range(10):
    lst_comp.append(x)

print(lst_comp)

【讨论】:

    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2015-10-11
    • 2019-02-19
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多