【问题标题】:Call a Function in each List Comprenhension Iteration在每个列表理解迭代器中调用一个函数
【发布时间】:2020-10-25 09:14:58
【问题描述】:

我有一个输出进度条的函数,我需要它来输出列表理解的当前状态。我不知道有没有办法在每次迭代时调用这个progress_bar 函数而不返回任何数据。

使用的功能:

-progress_bar函数:

def printProgressBar (iteration, total, decimals=1, length=100, fill='█', printEnd="\r"):                                                                                                               
    percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
    filledLength = int(length * iteration // total)
    bar = fill * filledLength + '-' * (length - filledLength)
    print(f'\r{'Progress'} |{bar}| {percent}% {'Completed'}', end = printEnd)
    if iteration == total:
        print()

-api_call函数:

def api_call(query):
    val = [0,1,1,0,0,1,1,1,0,1] #Api call, the values are just an example
    return val

我的列表理解:

df = [some_process(v) for v in val]

我已经试过了:

df = [(v, progress_bar(i, len(val))) for i, v in enumerate(val)]

虽然它打印进度条没有错误,但在df 中,每个元素现在都具有从progress_bar 返回的值(在本例中为无):

df[:3]
# [(0, None), (1, None), (2, None)]

-预期输出:

df[:3]
# [0, 1, 2] (And calling progress_bar() on each iteration)

有没有什么办法,使用列表理解,在每次迭代时进行这个调用(我知道我可以用常规的 for 循环来做,但为了学习)

【问题讨论】:

  • 列表推导式是一种返回值的方式,而不仅仅是调用函数。这不清楚你要做什么,你能更准确吗?
  • 你不能改变progress_bar函数来返回第一个元素吗?
  • @azro,我已经添加了更多信息,请查看并告诉我现在是否可以更好地解释
  • @TUNAPRO1234 我是这么想的,但我不能因为progress_bar 在我的代码中被多次调用。
  • 最优雅的解决方案是将进度条实现为从序列中产生的生成器,因此您可以编写df = [some_process(v) for v in progress_bar(val)]

标签: python list loops for-loop


【解决方案1】:

您可以使用短路来运行返回错误值的函数。

>>> df = [print(i) or i for i in range(10)]
0
1
2
3
4
5
6
7
8
9
>>> df
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

【讨论】:

    【解决方案2】:

    除了pavi2410 在他的回答中解释的短路,您还可以将您的副作用隐藏在for 或if 后面:

    [i for i in range(10) for _ in [print(i)]]
    [i for i in range(10) if not print(i)]
    

    对于来自搜索的人,另请参阅Is it Pythonic to use list comprehensions for just side effects?

    【讨论】:

      【解决方案3】:

      也许这会有所帮助:

      df = [(i, print(i, 100))[0] for i in range(100)]
      

      【讨论】:

        【解决方案4】:

        如果你想对一个数字范围重复调用一个函数,你可以像这样简单地使用map函数:

        list(map(printProgressBar, [i for i in range(100)], [100 for i in range(100)]))
        

        输出:

        Progress |----------------------------------------------------------------------------------------------------| 0.0% Completed', end = printEnd)
        Progress |█---------------------------------------------------------------------------------------------------| 1.0% Completed', end = printEnd)
        Progress |██--------------------------------------------------------------------------------------------------| 2.0% Completed', end = printEnd)
        Progress |███-------------------------------------------------------------------------------------------------| 3.0% Completed', end = printEnd)
        Progress |████------------------------------------------------------------------------------------------------| 4.0% Completed', end = printEnd)
        Progress |█████-----------------------------------------------------------------------------------------------| 5.0% Completed', end = printEnd)
        Progress |██████----------------------------------------------------------------------------------------------| 6.0% Completed', end = printEnd)
        Progress |███████---------------------------------------------------------------------------------------------| 7.0% Completed', end = printEnd)
        Progress |████████--------------------------------------------------------------------------------------------| 8.0% Completed', end = printEnd)
        Progress |█████████-------------------------------------------------------------------------------------------| 9.0% Completed', end = printEnd)
        Progress |██████████------------------------------------------------------------------------------------------| 10.0% Completed', end = printEnd)
        Progress |███████████-----------------------------------------------------------------------------------------| 11.0% Completed', end = printEnd)
        Progress |████████████----------------------------------------------------------------------------------------| 12.0% Completed', end = printEnd)
        Progress |█████████████---------------------------------------------------------------------------------------| 13.0% Completed', end = printEnd)
        Progress |██████████████--------------------------------------------------------------------------------------| 14.0% Completed', end = printEnd)
        Progress |███████████████-------------------------------------------------------------------------------------| 15.0% Completed', end = printEnd)
        Progress |████████████████------------------------------------------------------------------------------------| 16.0% Completed', end = printEnd)
        Progress |█████████████████-----------------------------------------------------------------------------------| 17.0% Completed', end = printEnd)
        Progress |██████████████████----------------------------------------------------------------------------------| 18.0% Completed', end = printEnd)
        Progress |███████████████████---------------------------------------------------------------------------------| 19.0% Completed', end = printEnd)
        Progress |████████████████████--------------------------------------------------------------------------------| 20.0% Completed', end = printEnd)
        Progress |█████████████████████-------------------------------------------------------------------------------| 21.0% Completed', end = printEnd)
        Progress |██████████████████████------------------------------------------------------------------------------| 22.0% Completed', end = printEnd)
        Progress |███████████████████████-----------------------------------------------------------------------------| 23.0% Completed', end = printEnd)
        Progress |████████████████████████----------------------------------------------------------------------------| 24.0% Completed', end = printEnd)
        Progress |█████████████████████████---------------------------------------------------------------------------| 25.0% Completed', end = printEnd)
        Progress |██████████████████████████--------------------------------------------------------------------------| 26.0% Completed', end = printEnd)
        Progress |███████████████████████████-------------------------------------------------------------------------| 27.0% Completed', end = printEnd)
        Progress |████████████████████████████------------------------------------------------------------------------| 28.0% Completed', end = printEnd)
        Progress |█████████████████████████████-----------------------------------------------------------------------| 29.0% Completed', end = printEnd)
        Progress |██████████████████████████████----------------------------------------------------------------------| 30.0% Completed', end = printEnd)
        Progress |███████████████████████████████---------------------------------------------------------------------| 31.0% Completed', end = printEnd)
        Progress |████████████████████████████████--------------------------------------------------------------------| 32.0% Completed', end = printEnd)
        Progress |█████████████████████████████████-------------------------------------------------------------------| 33.0% Completed', end = printEnd)
        Progress |██████████████████████████████████------------------------------------------------------------------| 34.0% Completed', end = printEnd)
        Progress |███████████████████████████████████-----------------------------------------------------------------| 35.0% Completed', end = printEnd)
        Progress |████████████████████████████████████----------------------------------------------------------------| 36.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████---------------------------------------------------------------| 37.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████--------------------------------------------------------------| 38.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████-------------------------------------------------------------| 39.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████------------------------------------------------------------| 40.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████-----------------------------------------------------------| 41.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████----------------------------------------------------------| 42.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████---------------------------------------------------------| 43.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████████--------------------------------------------------------| 44.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████████-------------------------------------------------------| 45.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████████------------------------------------------------------| 46.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████████-----------------------------------------------------| 47.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████████████----------------------------------------------------| 48.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████████████---------------------------------------------------| 49.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████████████--------------------------------------------------| 50.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████████████-------------------------------------------------| 51.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████████████████------------------------------------------------| 52.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████████████████-----------------------------------------------| 53.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████████████████----------------------------------------------| 54.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████████████████---------------------------------------------| 55.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████████████████████--------------------------------------------| 56.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████████████████████-------------------------------------------| 57.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████████████████████------------------------------------------| 58.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████████████████████-----------------------------------------| 59.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████████████████████████----------------------------------------| 60.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████████████████████████---------------------------------------| 61.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████████████████████████--------------------------------------| 62.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████████████████████████-------------------------------------| 63.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████████████████████████████------------------------------------| 64.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████████████████████████████-----------------------------------| 65.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████████████████████████████----------------------------------| 66.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████████████████████████████---------------------------------| 67.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████████████████████████████████--------------------------------| 68.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████████████████████████████████-------------------------------| 69.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████████████████████████████████------------------------------| 70.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████████████████████████████████-----------------------------| 71.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████████████████████████████████████----------------------------| 72.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████████████████████████████████████---------------------------| 73.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████████████████████████████████████--------------------------| 74.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████████████████████████████████████-------------------------| 75.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████████████████████████████████████████------------------------| 76.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████████████████████████████████████████-----------------------| 77.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████████████████████████████████████████----------------------| 78.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████████████████████████████████████████---------------------| 79.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████████████████████████████████████████████--------------------| 80.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████████████████████████████████████████████-------------------| 81.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████████████████████████████████████████████------------------| 82.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████████████████████████████████████████████-----------------| 83.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████████████████████████████████████████████████----------------| 84.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████████████████████████████████████████████████---------------| 85.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████████████████████████████████████████████████--------------| 86.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████████████████████████████████████████████████-------------| 87.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████████████████████████████████████████████████████------------| 88.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████████████████████████████████████████████████████-----------| 89.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████████████████████████████████████████████████████----------| 90.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████████████████████████████████████████████████████---------| 91.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████████████████████████████████████████████████████████--------| 92.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████████████████████████████████████████████████████████-------| 93.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████████████████████████████████████████████████████████------| 94.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████████████████████████████████████████████████████████-----| 95.0% Completed', end = printEnd)
        Progress |████████████████████████████████████████████████████████████████████████████████████████████████----| 96.0% Completed', end = printEnd)
        Progress |█████████████████████████████████████████████████████████████████████████████████████████████████---| 97.0% Completed', end = printEnd)
        Progress |██████████████████████████████████████████████████████████████████████████████████████████████████--| 98.0% Completed', end = printEnd)
        Progress |███████████████████████████████████████████████████████████████████████████████████████████████████-| 99.0% Completed', end = printEnd)
        

        注意:这些条是全黑的,但是当我从控制台将它粘贴到这里时,有几个条变成了绿色。

        函数printProgressBar 没有return 任何值,因此将函数printProgressBar 的结果分配给变量只会导致变量的值是None。相反,您可以简单地调用该函数而不将其分配给任何变量,就像我上面提到的那样。

        【讨论】:

        • 我试过了,调用list(df)返回一个满是None的列表
        • 是这样吗?查看我的最新编辑。我已经添加了我得到的输出。
        猜你喜欢
        • 2017-06-29
        • 1970-01-01
        • 1970-01-01
        • 2017-03-10
        • 2023-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-17
        相关资源
        最近更新 更多