1

I have a function that outputs a progress bar, and I need it to output the current state of a list comprenhension. I don't know if there is a way of calling this progress_bar function on each iteration without returning any data.

Functions used:

-progress_bar function:

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 function:

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

My list comprenhension:

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

I have already tried this:

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

And although it prints the progress bar without errors, in df each element now has the value returned from progress_bar (in this case None):

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

-Expected output:

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

Is there any way, using list comprenhension, of making this call on each iteration (I know I can do it with a regular for loop but for the purpose of learning)

Stack
  • 1,028
  • 2
  • 10
  • 31
  • 4
    A list comprehension, is a way to return values, not just call function. This is unclear what you're trying to do, can you be more precise ? – azro Oct 25 '20 at 09:18
  • 1
    Cant you change the progress_bar function to return the first element? – TUNAPRO1234 Oct 25 '20 at 09:22
  • @azro, I've already added more info, check it out and tell me if now it's better explained – Stack Oct 25 '20 at 09:29
  • @TUNAPRO1234 I thought that, but I can't because `progress_bar` is called multiple times along my code. – Stack Oct 25 '20 at 09:31
  • 1
    Most elegant solution would be to implement the progress bar as a generator that yields from a sequence, so you could write `df = [some_process(v) for v in progress_bar(val)]` – Wups Oct 25 '20 at 09:40

4 Answers4

1

You can use short-circuiting to run a function returning falsey values.

>>> 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]
pavi2410
  • 1,220
  • 2
  • 12
  • 16
1

Next to short-circuiting explained by pavi2410 in his answer, you can as well hide your side effect behind for or if:

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

For people coming from search, please see also Is it Pythonic to use list comprehensions for just side effects?

darw
  • 941
  • 12
  • 15
0

If you want to repeatedly call a function for a range of numbers, you can simply use the map function like this:

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

Output:

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)

NOTE: The bars were fully black, but when I pasted it here from my console, few bars turned green.

The function printProgressBar does not return any value, so assigning the result of the function printProgressBar to a variable will only result in the values of the variable being None. Instead, you can simply call the function without assigning it to any variable, just like the way I have mentioned above.

Sushil
  • 5,440
  • 1
  • 8
  • 26
0

Maybe this will help:

df = [(i, print(i, 100))[0] for i in range(100)]
TUNAPRO1234
  • 106
  • 5