【问题标题】:How to show a progress bar while loading a list comprehension?加载列表理解时如何显示进度条?
【发布时间】:2020-09-03 21:11:58
【问题描述】:

提前感谢您的支持。 我最近发现了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()

问题是,如何将它与 List Comprehension 一起使用?我不想将 bar.next() 放在 LC 中(或者,至少不知道如何......)。

【问题讨论】:

    标签: python-3.x list progress-bar list-comprehension


    【解决方案1】:

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

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

    所以:不要这样做。


    您已被警告...但既然您提出了这个问题,让我们尝试一个简单的列表理解:

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

    如果我将其转换为常规循环,我可以使用 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]
    

    现在,我用一个小技巧来实现我的列表理解:

    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]
    

    诀窍很容易理解:bar.next() 在每次迭代(条形进度)上进行评估并返回 None。在布尔上下文中,NoneFalse

    >>> bool(None)
    False
    

    因此,not bar.next()True 并且该列表未被过滤([... for ... if True][... for ...] 相同)。

    再说一遍,不要这样做。

    【讨论】:

      猜你喜欢
      • 2016-07-14
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多