Sick Gaming
[Tut] Python Function Call Inside List Comprehension - Printable Version

+- Sick Gaming (https://www.sickgaming.net)
+-- Forum: Programming (https://www.sickgaming.net/forum-76.html)
+--- Forum: Python (https://www.sickgaming.net/forum-83.html)
+--- Thread: [Tut] Python Function Call Inside List Comprehension (/thread-98288.html)



[Tut] Python Function Call Inside List Comprehension - xSicKxBot - 11-15-2020

Python Function Call Inside List Comprehension

<div><p><strong>Question</strong>: Is it possible to call a function inside a <a href="https://blog.finxter.com/list-comprehension/" title="List Comprehension in Python — A Helpful Illustrated Guide" target="_blank" rel="noreferrer noopener">list comprehension</a> statement?</p>
<hr class="wp-block-separator"/>
<p><strong>Background</strong>: List comprehension is a compact way of creating lists. The simple formula is <code>[expression + context]</code>.</p>
<ul>
<li><strong>Expression: </strong>What to do with each list element?</li>
<li><strong>Context: </strong>What elements to select? The context consists of an arbitrary number of <code>for</code> and <code>if</code> statements.</li>
</ul>
<p>For example, the code <code>[x**2 for x in range(3)]</code> creates the list of square numbers <code>[0, 1, 4]</code> with the help of the expression <code>x**2</code>. </p>
<p><strong>Related article:</strong> <a href="https://blog.finxter.com/list-comprehension/" target="_blank" rel="noreferrer noopener" title="List Comprehension in Python — A Helpful Illustrated Guide">List Comprehension in Python — A Helpful Illustrated Guide</a></p>
<hr class="wp-block-separator"/>
<p><em><strong>So, can you use a function with or without return value as an expression inside a list comprehension?</strong></em></p>
<p class="has-pale-cyan-blue-background-color has-background"><strong>Answer</strong>: You can use any expression inside the list comprehension, including functions and methods. An expression can be an integer <code>42</code>, a numerical computation <code>2+2 (=4)</code>, or even a function call <code>np.sum(x)</code> on any iterable <code>x</code>. Any function without return value, returns <code>None</code> per default. That’s why you can even call functions with side effects within a list comprehension statement.</p>
<p>Here’s an example:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[print('hi') for _ in range(10)] '''
hi
hi
hi
hi
hi
hi
hi
hi
hi
hi '''</pre>
<p>You use the throw-away underscore <code>_</code> because you want to execute the same function ten times. If you want to print the first 10 numbers to the shell, the following code does the trick:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[print(i) for i in range(10)] '''
0
1
2
3
4
5
6
7
8
9 '''
</pre>
<p>Let’s have a look at the content of the list you just created: </p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">lst = [print(i) for i in range(10)]
print(lst)
# [None, None, None, None, None, None, None, None, None, None]</pre>
<p>The list contains ten <code>None</code> values because the return value of the <code><a href="https://blog.finxter.com/the-separator-and-end-arguments-of-the-python-print-function/" target="_blank" rel="noreferrer noopener" title="Python Print Function [And Its SECRET Separator &amp; End Arguments]">print()</a></code> function is <code>None</code>. The side effect of executing the print function within the list comprehension statement is that the first ten values from 0 to 9 appear on your standard output. </p>
<h3>Walrus Operator</h3>
<p>Python 3.8 has introduced the <a href="https://blog.finxter.com/python-3-8-walrus-operator-assignment-expression/" title="Python 3.8 Walrus Operator (Assignment Expression)" target="_blank" rel="noreferrer noopener">walrus operator</a>, also known as the <a href="https://www.python.org/dev/peps/pep-0572/" target="_blank" rel="noreferrer noopener">assignment expression</a>. This operator is useful if executing a certain function has side effects that you don’t want. For example, if you have a string creation method inside the list comprehension statement, conditioned by some filtering criterion in the if suffix. Without the walrus operator, Python would execute this same routine multiple times—even though this is highly redundant. You can avoid this redundancy by assigning it to a variable <code>s</code> once using the walrus operator and reusing this exact variable in the expression. </p>
</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import random def get_random_string(): return f'sss {random.randrange(0, 100)}' # Goal: Print all random strings that contain 42 # WRONG
lst = [get_random_string() for _ in range(1000) if '42' in get_random_string()]
print(lst)
# ['sss 74', 'sss 13', 'sss 76', 'sss 13', 'sss 92', 'sss 96', 'sss 27', 'sss 43', 'sss 80'] # CORRECT
lst = [s for _ in range(1000) if '42' in (s := get_random_string())]
print(lst)
# ['sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42']
</pre>
<p>With the walrus operator <code>s := get_random_string()</code>, you store the result of the function call in the variable <code>s</code> and retrieve it inside the expression part of the list comprehension. All of this happens inside the list comprehension statement. </p>
<p><strong><em>I teach these concepts in my exclusive FINXTER email academy—join us, it’s free!</em></strong></p>
<h2> Related Video: List Comprehension</h2>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio">
<div class="wp-block-embed__wrapper">
<div class="ast-oembed-container"><iframe title="A Simple Introduction to List Comprehension in Python" width="1400" height="788" src="https://www.youtube.com/embed/9qsq2Vf48W8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
</div>
</figure>
<p>The post <a href="https://blog.finxter.com/python-function-call-inside-list-comprehension/" target="_blank" rel="noopener noreferrer">Python Function Call Inside List Comprehension</a> first appeared on <a href="https://blog.finxter.com/" target="_blank" rel="noopener noreferrer">Finxter</a>.</p>
</div>


https://www.sickgaming.net/blog/2020/11/15/python-function-call-inside-list-comprehension/