Python 3.x 如何在加载列表时显示进度条?

Python 3.x 如何在加载列表时显示进度条?,python-3.x,list,progress-bar,list-comprehension,Python 3.x,List,Progress Bar,List Comprehension,提前感谢您的支持。 我最近发现了Progress模块,并一直在玩它。几乎任何事情都很简单。。。直到我决定尝试列表理解。 有办法吗?我的意思是,这些进度条的常见代码如下: from progress.bar import ChargingBar bar = ChargingBar('Some text like Loading...', cant_of_iterations) for iteration in some_cycle: --code-- bar.next() bar

提前感谢您的支持。 我最近发现了
Progress
模块,并一直在玩它。几乎任何事情都很简单。。。直到我决定尝试列表理解。 有办法吗?我的意思是,这些进度条的常见代码如下:

from progress.bar import ChargingBar

bar = ChargingBar('Some text like Loading...', cant_of_iterations)
for iteration in some_cycle:
    --code--
    bar.next()
bar.finish()

问题是,如何在列表理解中使用它?我不想把bar.next()放在LC中(或者,至少,不知道如何…。

你真的不应该这样做,因为列表理解不应该有任何副作用(列表理解返回列表,仅此而已)。很明显,绘制进度条是一种副作用

此外,如果您有一个进度条,我认为这个过程相当慢:列表理解(可能)不会比常规循环执行得更好

所以:不要这样做


你被警告过。。。但是既然你问了这个问题,让我们试着用一个简单的列表来理解:

>>> L = [sum(range(i**3)) for i in range(100)]
>>> L
[0, 0, 28, 351, 2016, ..., 416485546128, 442920719836, 470739589551]
from progress.bar import ChargingBar

bar = ChargingBar('Loading...')
L = [sum(range(i**3)) for i in range(100) if not bar.next()]
bar.finish()
print(L)
如果我将其转换为常规循环,我可以使用
progress
模块:

from progress.bar import ChargingBar

L = []
bar = ChargingBar('Loading...')
for i in range(100):
    L.append(sum(range(i**3)))
    bar.next()
bar.finish()

print(L)
输出:

Loading... ████████████████████████████████ 100%
[0, 0, 28, 351, 2016, ..., 416485546128, 442920719836, 470739589551]
Loading... ████████████████████████████████ 100%
[0, 0, 28, 351, 2016, ..., 416485546128, 442920719836, 470739589551]
现在,我用一个小技巧来让我的列表理解达到同样的效果:

>>> L = [sum(range(i**3)) for i in range(100)]
>>> L
[0, 0, 28, 351, 2016, ..., 416485546128, 442920719836, 470739589551]
from progress.bar import ChargingBar

bar = ChargingBar('Loading...')
L = [sum(range(i**3)) for i in range(100) if not bar.next()]
bar.finish()
print(L)
输出:

Loading... ████████████████████████████████ 100%
[0, 0, 28, 351, 2016, ..., 416485546128, 442920719836, 470739589551]
Loading... ████████████████████████████████ 100%
[0, 0, 28, 351, 2016, ..., 416485546128, 442920719836, 470739589551]
诀窍很容易理解:
bar.next()
在每次迭代(条形图进行)时进行评估,并返回
None
。在布尔上下文中,
None
False

>>> bool(None)
False
因此,
not bar.next()
True
,列表未被过滤(
[…for…if True]
[…for…]
相同)

再说一次,不要这样做