<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Как написать функцию в Python 3 - Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</title>
	<atom:link href="https://python.ivan-shamaev.ru/tag/%d0%ba%d0%b0%d0%ba-%d0%bd%d0%b0%d0%bf%d0%b8%d1%81%d0%b0%d1%82%d1%8c-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d1%8e-%d0%b2-python-3/feed/" rel="self" type="application/rss+xml" />
	<link>https://python.ivan-shamaev.ru/tag/как-написать-функцию-в-python-3/</link>
	<description>Библиотеки обработки данных. Примеры. Строки, списки, файлы, числа, массивы. Язык программирования Python 3 - скачать</description>
	<lastBuildDate>Wed, 01 Apr 2020 20:54:11 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.1</generator>

<image>
	<url>https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/cropped-data_science_python3_logo-32x32.png</url>
	<title>Как написать функцию в Python 3 - Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</title>
	<link>https://python.ivan-shamaev.ru/tag/как-написать-функцию-в-python-3/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Функции Python 3: значение, аргументы, вызов, переменные, списки</title>
		<link>https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/</link>
					<comments>https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Sun, 29 Mar 2020 12:43:40 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[python 3]]></category>
		<category><![CDATA[Аргументы функции]]></category>
		<category><![CDATA[Вызов функции]]></category>
		<category><![CDATA[Значение функции]]></category>
		<category><![CDATA[Использование массивов в функциях Python]]></category>
		<category><![CDATA[Как написать функцию в Python 3]]></category>
		<category><![CDATA[Переменные функции Python]]></category>
		<category><![CDATA[Функции Python 3]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=795</guid>

					<description><![CDATA[<p>Функции Python 3 &#8212; Краткая шпаргалка Функции – главный и самый важный способ организации и повторного использования кода в Python. Функций не может быть слишком много. 1 функция &#8212; это блок кода, который используется для выполнения одного связанного действия. В Python есть два инструмента для создания функций: def и lambda. Сначала рассмотрим def. К lambda функции вернемся позже. Python предоставляет [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/">Функции Python 3: значение, аргументы, вызов, переменные, списки</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&#038;title=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" data-a2a-url="https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/" data-a2a-title="Функции Python 3: значение, аргументы, вызов, переменные, списки"></a></p><h1><strong>Функции Python 3 &#8212; Краткая шпаргалка</strong></h1>
<p><strong>Функции</strong> – главный и самый важный способ организации и повторного использования кода в Python. Функций не может быть слишком много. <strong>1 функция</strong> &#8212; это блок кода, который используется для выполнения одного связанного действия.</p>
<blockquote>
<p><span>В Python есть </span>два<span> инструмента для создания функций: </span><strong><em>def</em></strong><span><strong> </strong>и </span><strong><em>lambda</em></strong><span>. </span></p>
<p><span>Сначала рассмотрим <em><strong>def</strong></em>. К <em><strong>lambda</strong> </em>функции вернемся позже.</span></p>
</blockquote>
<p><strong>Python</strong> предоставляет вам множество встроенных функций, таких как print() и т.д., но вы также можете создавать свои собственные функции. Эти функции называются пользовательскими функциями.</p>
<p>Объявление функции начинается ключевым словом <strong>def</strong>, а результат возвращается в предложении <strong>return</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def my_function(x, y, z=1.5):
    if z &gt; 1:
        return z * (x + y)
    else:
        return z / (x + y)</pre>
<p>Ничто не мешает иметь в функции несколько предложений <strong>return</strong>. Если при выполнении достигнут конец функции, а предложение <strong>return</strong> не встретилось, то возвращается <strong>None</strong>.</p>
<p>У функции могут быть позиционные и именованные аргументы.</p>
<p><strong>Именованные аргументы</strong> обычно используются для задания значений по умолчанию и необязательных аргументов.</p>
<p>В примере выше:</p>
<ul>
<li>x и y – <em><strong>позиционные аргументы, </strong></em></li>
<li>а z – <em><strong>именованный. </strong></em></li>
</ul>
<p>Следующие вызовы функции эквивалентны:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">my_function(5, 6, z=0.7)
my_function(3.14, 7, 3.5)</pre>
<p>Основное ограничение состоит в том, <strong>именованные аргументы должны находиться после всех позиционных (если таковые имеются).</strong> Сами же именованные аргументы можно задавать в любом порядке, это освобождает программиста от необходимости помнить, в каком порядке были указаны аргументы функции в объявлении, важно лишь, как они называются.</p>
<h2><strong>Определение функции Python 3</strong></h2>
<p><span>Вы можете задать функции для реализации нужной вам функциональности. Вот простые правила для определения функции в Python.</span></p>
<ul class="list">
<li><span>Ключевое слово для определения функции: </span><b><span>def,</span></b><span> за которым следуют имя функции и круглые скобки () с параметрами.</span></li>
<li><span>Любые входные параметры или аргументы должны быть помещены в эти круглые скобки.</span></li>
<li><span>В качестве первой команды может быть необязательная конструкция &#8212; <strong>строка документации функции</strong> (эта часть функции &#8212; пояснение зачем функция создана, очень рекомендуется использовать для облегчения понимания кода при работе в команде или при повторном возвращении к коду через длительный промежуток времени)</span><span>.</span></li>
<li><span>Блок кода в каждой функции начинается с двоеточия <strong>:</strong> и имеет отступ.</span></li>
<li><span>Оператор <strong>return</strong> <strong>[выражение]</strong> возвращает результат из функции. Оператор <strong>return</strong> без аргументов аналогичен <strong>return None</strong>. <span style="color: #ff6600;"><strong>Функции всегда возвращают значение, хотя бы None.</strong></span></span></li>
</ul>
<h2><strong>Синтаксис функции Python</strong></h2>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def function_name( parameter1, parameter2 ):
   """function_docstring: функция Python предназначена для расчета ROI"""
   function_suite (algorithms, expressions)
   return [expression]</pre>
<p><span>По умолчанию, параметры <em><strong>parameter1, parameter2</strong></em> имеют позиционное поведение, и вам необходимо сообщить их в том же порядке, в котором они были определены.</span></p>
<h2><strong>Пример реализации функции</strong></h2>
<p>Следующая функция принимает строку в качестве входного параметра и печатает ее на стандартном экране.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def print_me( str ):
   """Выводит на печать переданную строку в эту функцию"""
   print(str)
   return</pre>
<h2><strong>Вызов функции</strong></h2>
<p>В определении функции указывается <strong>имя функции</strong>, <strong>её параметры</strong>, а также <strong>тело функции</strong> (реализация требуемой функциональности).</p>
<p>Как только базовая структура функции создана, вы можете выполнить ее, вызвав ее из другой функции или непосредственно из <span><strong>Python prompt</strong> (командной оболочки)</span>. Ниже приведен пример вызова функции <strong>printme()</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printme( str ):
    """This prints a passed string into this function"""
    print(str)
    return

# Теперь вы можете вызвать функцию printme
printme("I'm first call to user defined function!")
printme("Again second call to the same function")</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">I'm first call to user defined function!
Again second call to the same function</pre>
<h1><strong>Аргументы функции</strong></h1>
<p><span>Вы можете вызвать функцию, используя следующие типы аргументов:</span></p>
<ul class="list">
<li><span>Обязательные аргументы</span></li>
<li><span>Ключевые аргументы</span></li>
<li><span>Аргументы по умолчанию</span></li>
<li><span>Аргументы переменной длины</span></li>
</ul>
<h2><strong>Обязательные (позиционные) аргументы</strong></h2>
<blockquote>
<p><strong>Позиционные аргументы:</strong> указываются простым перечислением</p>
</blockquote>
<p><span><strong>Обязательные аргументы</strong> &#8212; это аргументы, переданные функции в правильном позиционном порядке. Здесь количество аргументов и их порядок в вызове функции должно точно соответствовать определению функции.</span></p>
<p><span>Чтобы вызвать функцию </span><i><span>printme()</span></i><span> , вам обязательно нужно передать один аргумент, иначе она выдаст следующую синтаксическую ошибку:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printme( str ):
   """This prints a passed string into this function"""
   print(str)
   return

# Теперь вы можете вызвать функцию printme
printme()</pre>
<p>Ошибка (в функции Printme не указан аргумент):</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Traceback (most recent call last):
  File "C:/Users/User/Desktop/CodePythonFunc.py", line 8, in &lt;module&gt;
    printme()
TypeError: printme() missing 1 required positional argument: 'str'</pre>
<p>Правильно указать аргумент так:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printme( str ):
   """This prints a passed string into this function"""
   print(str)
   return

# Теперь вы можете вызвать функцию printme
printme("Текстовая переменная")</pre>
<h2><strong>Ключевые аргументы</strong></h2>
<blockquote>
<p><span><strong>Ключевые аргументы:</strong> указываются перечислением </span><code class="docutils literal notranslate"><span class="pre">ключ=значение</span></code></p>
</blockquote>
<p><span>Когда вы используете ключевые аргументы в вызове функции, вызывающая сторона идентифицирует аргументы по имени параметра. Плюс в определении функции у ключевого параметра можно указать значение по-умолчанию.</span></p>
<p><span>Это позволяет пропускать аргументы или размещать их не по порядку, поскольку интерпретатор Python может использовать предоставленные ключевые слова (ключи) для сопоставления значений с параметрами. Создадим ключевые слова для функции </span><i><span>printinfo()</span></i><span> следующими способами:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printinfo( name, age ):
   "This prints a passed info into this function"
   print("Name: " + name + "|Age: " + str(age))
   return

# Вызов функции printinfo
printinfo( age=23, name="Anton" )
printinfo( name="Alena", age=20 )</pre>
<p><strong><span style="color: #000000;">Результат:</span></strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Name: Anton|Age: 23
Name: Alena|Age: 20</pre>
<blockquote>
<p><span style="color: #ff0000;"><strong>Важно!</strong></span> Позиционные и ключевые аргументы могут быть скомбинированы в одной функции. Позиционные параметры всегда идут перед ключевыми.</p>
</blockquote>
<h3><strong>Преимущества ключевых аргументов в функциях</strong></h3>
<ul>
<li>Нет необходимости отслеживать порядок аргументов;</li>
<li>У ключевых параметров есть значение по умолчанию, которое можно не передавать.</li>
</ul>
<h2><strong>Аргументы по умолчанию</strong></h2>
<p><span>Аргумент по умолчанию &#8212; это аргумент, который принимает значение по умолчанию (задается в описании функции), если при вызове функции аргументу не передается значение.</span></p>
<p><span>Следующий пример дает представление об аргументах по умолчанию, он печатает возраст по умолчанию, если он не был передан:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printinfo( name, age = 35 ):
   "This prints a passed info into this function"
   print("Name: " + name + "|Age: " + str(age))
   return

# Вызов функции printinfo
printinfo( age=19, name="Семен" )
printinfo( name="Николай" )</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Name: Семен|Age: 19
Name: Николай|Age: 35</pre>
<h2><strong>Аргументы переменной длины </strong></h2>
<h3><strong>Передача кортежа в функцию &#8212; Использование *args в Python</strong></h3>
<p><span>Вам может потребоваться разработать функцию для большего числа аргументов, чем Вы указали при определении функции. Эти аргументы называются <strong>аргументами </strong></span><strong><i>переменной длины</i></strong><span> и не указываются в определении функции, <strong>в отличие от позиционных и ключевых аргументов.</strong></span></p>
<p><span>В Python форма с одной звездочкой </span><code>*args</code><span>может использоваться в качестве параметра для отправки в список функций аргументов переменной длины без ключа. Стоит отметить, что звёздочка ( </span><code>*</code><span>) является здесь важным элементом, так как слово </span><code>args</code><span>является общепринятой традиционной идиомой, хотя оно не поддерживается языком.</span></p>
<p><span>Синтаксис для функции с аргументами переменной длины следующий:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def function_name([formal_args,] *args_tuple ):
    """function_docstring"""
    function_body
    return [expression]</pre>
<p><span>Звездочка (*) ставится перед именем переменной, которая содержит в себе кортеж значений без ключевых слов.</span><span> Кортеж является необязательным параметром.</span></p>
<p><strong>Рассмотрим простой пример:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def print_info( parametr_1, *var_tuple ):
   """Эта функция производит вывод переданных аргументов"""
   print("Output is: ")
   print(parametr_1)
   for elem in var_tuple:
      print(elem)
   return

# Вызов функции printinfo
print_info( 10 )
print_info( 70, 60, 50 )</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Output is: 
10
Output is: 
70
60
50</pre>
<p>Еще один <strong>пример использования *args в функции</strong> Python:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def multiply(*args):
    z = 1
    for num in args:
        z *= num
    print(z)

multiply(4, 5)
multiply(10, 9)
multiply(2, 3, 4)
multiply(3, 5, 10, 6)</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">20
90
24
900</pre>
<p><span>Поскольку мы использовали </span><code>*args</code><span>для отправки списка аргументов переменной длины в нашу функцию, мы смогли передать столько аргументов, сколько пожелали, в вызовы функции.</span></p>
<p><span>С помощью </span><code>*args</code><span> вы можете создать более гибкий код, который принимает различное количество аргументов без ключевых слов в вашей функции.</span></p>
<h3><strong>Передачи словаря переменной длины с аргументами в функцию **kwargs</strong></h3>
<blockquote>
<p><strong>**kwargs</strong> &#8212; сокращение от “keyword arguments”</p>
</blockquote>
<p><span>Форма двойной звездочки </span><code>**kwargs</code><span>используется для передачи словарного </span><a href="https://www.digitalocean.com/community/tutorials/understanding-dictionaries-in-python-3"><span>словаря</span></a><span> с аргументами переменной длины в функцию. Опять же, две звездочки ( </span><code>**</code><span>) являются здесь важным элементом, так как слово </span><code>kwargs</code><span>используется условно, но не поддерживается языком.</span></p>
<p><span>Мол </span><code>*args</code><span>, </span><code>**kwargs</code><span>может принять столько аргументов, которые вы хотели бы привести к этому. Однако </span><code>**kwargs</code><span>отличается от того, </span><code>*args</code><span>что вам нужно будет назначить ключевые слова.</span></p>
<p><span>Во-первых, давайте просто распечатаем </span><code>**kwargs</code><span>аргументы, которые мы передаем функции. Мы создадим короткую функцию для этого:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def print_kwargs(**kwargs):
        print(kwargs)

print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True)</pre>
<p><span>Давайте запустим программу выше и посмотрим на вывод:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">{'kwargs_1': 'Shark', 'kwargs_2': 4.5, 'kwargs_3': True}</pre>
<p><span>В зависимости от версии Python 3, которую вы используете в данный момент, тип данных словаря может быть неупорядоченным. В Python 3.6 и выше вы получите пары ключ-значение по порядку, но в более ранних версиях пары будут выводиться в случайном порядке.</span></p>
<p><span>Важно отметить, что </span><code>kwargs</code><span>созданный словарь создан, и мы можем работать с ним так же, как мы можем работать с другими словарями.</span></p>
<p><span>Давайте создадим еще одну короткую программу, чтобы показать, как мы можем использовать </span><code>**kwargs</code><span>. Здесь мы создадим функцию для приветствия словаря имен. Сначала мы начнем со словаря из двух имен:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def print_values(**kwargs):
    for key, value in kwargs.items():
        print("The value of {} is {}".format(key, value))

print_values(my_name="Sammy", your_name="Casey")</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">The value of my_name is Sammy
The value of your_name is Casey</pre>
<p><span>Использование </span><code>**kwargs</code><span>дает нам гибкость в использовании ключевых аргументов в нашей программе. Когда мы используем </span><code>**kwargs</code><span>в качестве параметра, нам не нужно знать, сколько аргументов мы в конечном итоге хотели бы передать функции.</span></p>
<h3 id="using-args-and-kwargs-in-function-calls"><strong>Использование *args и **kwargs в вызовах функций</strong></h3>
<p><span>Мы также можем использовать </span><code>*args</code><span>и </span><code>**kwargs</code><span>для передачи аргументов в функции.</span></p>
<p><span>Сначала давайте рассмотрим пример с </span><code>*args</code><span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def some_args(arg_1, arg_2, arg_3):
    print("arg_1:", arg_1)
    print("arg_2:", arg_2)
    print("arg_3:", arg_3)

args = ("Sammy", "Casey", "Alex")
some_args(*args)</pre>
<p><span>В функции выше, существует три параметра , определенный как </span><code>arg_1</code><span>, </span><code>arg_</code><span>и </span><code>arg_3</code><span>. Функция распечатает каждый из этих аргументов. Затем мы создаем переменную, для которой задано итеративное значение (в данном случае </span><a href="https://www.digitalocean.com/community/tutorials/understanding-tuples-in-python-3"><span>кортеж</span></a><span> ), и можем передать эту переменную в функцию с синтаксисом звездочки.</span></p>
<p><span>Когда мы запустим код,</span><span> мы получим следующий вывод:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">arg_1: Sammy
arg_2: Casey
arg_3: Alex</pre>
<p><span>Мы также можем изменить вышеприведенную программу для </span><span>типа данных</span><span> итеративного списка с другим именем переменной. Давайте также объединим </span><code>*args</code><span>синтаксис с </span><span>именованным параметром</span><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def some_args(arg_1, arg_2, arg_3):
    print("arg_1:", arg_1)
    print("arg_2:", arg_2)
    print("arg_3:", arg_3)

my_list = [2, 3]
some_args(1, *my_list)</pre>
<p><span>Если мы запустим программу выше, она выдаст следующий вывод:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">arg_1: 1
arg_2: 2
arg_3: 3</pre>
<p><span>Аналогично, </span><code>**kwargs</code><span>аргументы с ключевым словом могут использоваться для вызова функции. Мы установим переменную, равную словарю с 3 парами ключ-значение (мы будем использовать </span><code>kwargs</code><span>здесь, но она может называться как угодно), и передадим ее функции с 3 аргументами:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def some_kwargs(kwarg_1, kwarg_2, kwarg_3):
    print("kwarg_1:", kwarg_1)
    print("kwarg_2:", kwarg_2)
    print("kwarg_3:", kwarg_3)

kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"}
some_kwargs(**kwargs)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">kwarg_1: Val
kwarg_2: Harper
kwarg_3: Remy</pre>
<p><span>Мы можем использовать специальный синтаксис </span><code>*args</code> <span>и </span><code>**kwargs</code> <span>внутри определения функции, чтобы передать переменное число аргументов функции.</span></p>
<p><span>Создание функций, которые принимают </span><code>*args</code><span>и </span><code>**kwargs</code><span>лучше всего использовать в ситуациях, когда вы ожидаете, что количество входов в списке аргументов останется относительно небольшим. Использование </span><code>*args</code><span>и </span><code>**kwargs</code><span>в первую очередь для обеспечения удобочитаемости и удобства, но следует делать с осторожностью.</span></p>
<h3><strong>Комбинирование параметров *args и **kwargs в функции</strong></h3>
<p>При комбинировании параметров параметр с двумя звездочками записывается самым последним. Если в определении функции указывается комбинация параметров с одной звездочкой и двумя звездочками, то функция примет любые переданные ей параметры:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def func(*args, **kwargs):
    """Функция примет любые параметры и выведет их на печать"""
    for elem in args:                   # Перебираем список с переданными параметрами
        print(elem, end=" ")
    for key, value in kwargs.items():   # Перебираем словарь с переданными параметрами
        print("{0} =&gt; {1}".format(key, value), end=" ")
    print("") #Перенос строки

func(35, 10, a=1, b=2, c=3) # Выведет: 35 10 a =&gt; 1 c =&gt; 3 b =&gt; 2
func(10)                    # Выведет: 10
func(3, a=1, b=2)           # Выведет: a =&gt; 1 b =&gt; 2</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">35 10 a =&gt; 1 b =&gt; 2 c =&gt; 3 
10 
3 a =&gt; 1 b =&gt; 2 </pre>
<p><strong>Еще один пример использования комбинации *args &amp; **kwargs:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Описываем функцию
def echo(*args, **kwargs):
    print(args, kwargs)

# Задаем список
args = (10, 20)
# Задаем словарь
kwargs = {'a':30, 'b':40}

#Вызываем функцию
echo(*args, **kwargs)</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">(10, 20) {'a': 30, 'b': 40}</pre>
<h3><strong>Порядок аргументов в функции Python</strong></h3>
<p>Аргументы внутри вызова функции должны стоять в определенном порядке:</p>
<ol>
<li><strong>Позиционные аргументы (arg_1, arg_2)</strong></li>
<li><strong>*args</strong></li>
<li><strong>Ключевые аргументы (kw_1=&#187;значение 1&#8243;, kw_2=&#187;значение 2&#8243;)</strong></li>
<li><strong>**kwargs</strong></li>
</ol>
<p>Рассмотрим детальный пример с использованием всех функций:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def function_print(arg_1, arg_2, *args, kw_1="значение 1", kw_2="значение 2", **kwargs):
    """ Обобщенный пример вывода всех аргументов, переданных функции """
    print("===Позиционные аргументы===")
    print(str(arg_1) + "," + str(arg_2))
    print("===*args===")
    for elem in args: # Перебираем список с переданными параметрами
        print(elem, end=" ")
    print("") #Перенос строки
    print("===Ключевые аргументы===")
    print(kw_1 + "," + kw_2)
    print("===**kwargs===")
    for key, value in kwargs.items(): # Перебираем словарь с переданными параметрами
        print("{0} =&gt; {1}".format(key, value), end=" ")
    print("") #Перенос строки


function_print(1, 2, 4, kw_2="Иван", var1=4)</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">===Позиционные аргументы===
1,2
===*args===
4 
===Ключевые аргументы===
значение 1,Иван
===**kwargs===
var1 =&gt; 4 </pre>
<h2><strong>Передача списка (list) по ссылке в функцию</strong></h2>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def myfunction (list):
    list.append(40)
    print ("Modified list inside a function: ", list)
    return

mylist=[10,20,30]
myfunction(mylist)
print(mylist)</pre>
<p>Следующий результат подтверждает, что аргументы передаются по ссылке в функцию Python:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Modified list inside a function: [10, 20, 30, 40]
[10, 20, 30, 40]</pre>
<h1><strong>Пространства имен, области видимости и локальные функции</strong></h1>
<h2><strong>Область действия переменной &#8212; область видимости переменных</strong></h2>
<p><span>Переменные в программе могут быть доступны или недоступны в разных местах этой программы. Это зависит от того, где вы объявили переменную.</span></p>
<p><span>Область действия переменной определяет ту часть программы, в которой вы можете получить доступ к определенному идентификатору (т.е. к значению переменной и возможности эту переменную поменять). <strong>В Python есть две основные области видимости переменных:</strong></span></p>
<ul class="list">
<li><span>Глобальные переменные</span></li>
<li><span>Локальные переменные</span></li>
</ul>
<p><strong>Область видимости переменной</strong> в Python называют также пространством имен. Любая переменная, которой присвоено значение внутри функции, по умолчанию попадает в локальное пространство имен.</p>
<p><strong>Локальное пространство имен</strong> создается при вызове функции, и в него сразу же заносятся аргументы функции. По завершении функции локальное пространство имен уничтожается (хотя бывают и исключения, см. ниже раздел о замыканиях).</p>
<p><strong>Переменные внутри функции – локальные.</strong> Поиск переменных: сперва среди локальных, потом среди глобальных.</p>
<p>Рассмотрим следующую функцию:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def func():
    a = []
    for i in range(5):
        a.append(i)</pre>
<p>При вызове func() создается пустой список a, в него добавляется 5 элементов, а затем, когда функция завершается, список a уничтожается. Но допустим, что мы объявили a следующим образом:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = []
def func():
    for i in range(5):
        a.append(i)</pre>
<p>Присваивать значение глобальной переменной внутри функции допустимо, но такие переменные должны быть объявлены глобальными с помощью ключевого слова <strong>global</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = None

def bind_a_variable():
    global a
    a = []

bind_a_variable()
print a</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">[]</pre>
<p>Функции можно объявлять в любом месте, в том числе допустимы локальные функции, которые динамически создаются внутри другой функции при ее вызове:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def outer_function(x, y, z):
    def inner_function(a, b, c):
        pass
    pass</pre>
<p>Здесь функция <strong>inner_function</strong> не существует, пока не вызвана функция <strong>outer_function</strong>. Как только <strong>outer_function</strong> завершает выполнение, <strong>inner_function</strong> уничтожается.</p>
<blockquote>
<p>Не рекомендуется злоупотреблять ключевым словом <strong>global</strong>. Обычно глобальные переменные служат для хранения состояния системы. Если вы понимаете, что пользуетесь ими слишком часто, то стоит подумать о переходе к <strong>объектно-ориентированному программированию (использовать классы).</strong></p>
</blockquote>
<p>Вложенные функции могут обращаться к локальному пространству имен объемлющей функции, но не могут связывать в нем переменные. Подробнее смотрите в разделе о замыканиях.</p>
<p>Строго говоря, любая функция локальна в какой-то области видимости, хотя это может быть и область видимости на уровне модуля.</p>
<h2><strong>Возврат нескольких значений из одной функции</strong></h2>
<p>В Python существует возможность возвращать из функции несколько значений.</p>
<p>Вот простой пример:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def f():
    a = 5
    b = 6
    c = 7
    return a, b, c
var1, var2, var3 = f()

print("var1={0} var2={1} var3={2}".format(var1, var2, var3))</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">var1=5 var2=6 var3=7</pre>
<p>В анализе данных и других научных приложениях это встречается сплошь и рядом, потому что многие функции вычисляют несколько результатов.</p>
<p>На самом деле, функция возвращает только один объект, кортеж, который затем распаковывается в результирующие переменные.</p>
<p>Этот пример можно было бы записать и так:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def f():
    a = 5
    b = 6
    c = 7
    return a, b, c
return_value = f()

print(return_value)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">(5, 6, 7)</pre>
<p>В таком случае <strong>return_value</strong> было бы кортежем, содержащим все три возвращенные переменные.</p>
<p>Иногда разумнее возвращать несколько значений не в виде кортежа, а <strong>в виде словаря</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def f():
    a = 5
    b = 6
    c = 7
    return {'a' : a, 'b' : b, 'c' : c}

return_value = f()

print(return_value)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">{'a': 5, 'b': 6, 'c': 7}</pre>
<h2><strong>Функции являются объектами</strong></h2>
<p>Поскольку функции в Python – объекты, становятся возможны многие конструкции, которые в других языках выразить трудно. Пусть, например, мы производим очистку данных и должны применить ряд преобразований к следующему списку строк:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">states = [' Alabama ', 'Georgia!', 'Georgia', 'georgia', 'FlOrIda', 'south carolina##', 'West virginia?']</pre>
<p>Всякий, кому доводилось работать с присланными пользователями данными опроса, ожидает такого рода мусора. Чтобы сделать такой список строк пригодным для анализа, нужно произвести различные операции: удалить лишние пробелы и знаки препинания, оставить заглавные буквы только в нужных местах.</p>
<p>Первая попытка могла бы выглядеть так:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import re # Модуль регулярных выражений

def clean_strings(strings):
    result = []
    for value in strings:
        value = value.strip()
        value = re.sub('[!#?]', '', value) # удалить знаки препинания
        value = value.title()
        result.append(value)
    return result

states = [' Alabama ', 'Georgia!', 'Georgia', 'georgia', 'FlOrIda', 'south carolina##', 'West virginia?']

states = clean_strings(states)

print(states)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['Alabama', 'Georgia', 'Georgia', 'Georgia', 'Florida', 'South Carolina', 'West Virginia']</pre>
<p>Другой подход, который иногда бывает полезен, – составить список операций, которые необходимо применить к набору строк:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import re # Модуль регулярных выражений

def remove_punctuation(value):
    return re.sub('[!#?]', '', value)

def clean_strings(strings, ops):
    result = []
    for value in strings:
        for function in ops:
            value = function(value)
        result.append(value)
    return result

clean_ops = [str.strip, remove_punctuation, str.title]
states = [' Alabama ', 'Georgia!', 'Georgia', 'georgia', 'FlOrIda', 'south carolina##', 'West virginia?']

states = clean_strings(states, clean_ops)

print(states)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['Alabama', 'Georgia', 'Georgia', 'Georgia', 'Florida', 'South Carolina', 'West Virginia']</pre>
<p>Подобный <strong>функциональный подход</strong> позволяет задать способ модификации строк на очень высоком уровне. Степень повторной используемости функции <strong>clean_strings</strong> определенно возросла!</p>
<p><strong>Функции можно передавать в качестве аргументов другим функциям</strong>, например встроенной функции <strong>map</strong>, которая применяет переданную функцию к коллекции:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import re # Модуль регулярных выражений

def remove_punctuation(value):
    return re.sub('[!#?]', '', value)

states = [' Alabama ', 'Georgia!', 'Georgia', 'georgia', 'FlOrIda', 'south carolina##', 'West virginia?']

states = list(map(remove_punctuation, states))
states = list(map(str.strip, states))
states = list(map(str.title, states))

print(states)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['Alabama', 'Georgia', 'Georgia', 'Georgia', 'Florida', 'South Carolina', 'West Virginia']</pre>
<h2><strong>Анонимные функции или Лямбда-функции. Lambda Function Python 3</strong></h2>
<ul>
<li><strong>Лямбда-функции</strong> позволяют создавать «встроенные» функции, которые полезны для функционального программирования. Например, с <strong>Map, Filter или Reduce</strong>.</li>
<li><strong>Lambda</strong> &#8212; это инструмент для создания обработчиков обратного вызова (<strong>callback handlers</strong>).</li>
</ul>
<p><strong>Lambda Function &#8212; </strong>это анонимная однострочная функция, которая возвращает всегда 1 результат.</p>
<p>Определяются они с помощью ключевого слова <strong>lambda</strong></p>
<p><span style="color: #008080;"><strong>ИмяФункции</strong> =</span> <span style="color: #ff6600;"><strong>lambda</strong> </span><strong><span style="color: #008000;">переменная_1, переменная_2, &#8230;, переменная_N</span><span style="color: #ff0000;">:</span></strong> <strong><span style="color: #000080;">&lt;выражение, которое использует переменные&gt;</span></strong></p>
<p>Например, функция <strong><span style="color: #008080;">equiv_anon</span></strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">equiv_anon = lambda x: x * 2</pre>
<p>эквивалентна функции <strong><span style="color: #008080;">short_function</span></strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">def short_function(x):
    return x * 2</pre>
<p><strong>Лямбда-функции</strong> особенно удобны в ходе анализа данных, потому что, как вы увидите, во многих случаях функции преобразования данных принимают другие функции в качестве аргументов. Часто быстрее (и чище) передать лямбда-функцию, чем писать полноценное объявление функции или даже присваивать лямбда-функцию локальной переменной.</p>
<p>Рассмотрим такой простенький пример:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def apply_to_list(some_list, f):
    return [f(x) for x in some_list]

ints = [4, 0, 1, 5, 6]

result = apply_to_list(ints, lambda x: x * 2)

print(result)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">[8, 0, 2, 10, 12]</pre>
<p>Можно было бы, конечно, написать <code class="EnlighterJSRAW" data-enlighter-language="null">[x * 2 for x in ints]</code>, но в данном случае нам удалось передать функции <strong>apply_to_list</strong> пользовательский оператор.</p>
<p><strong>Еще пример:</strong> пусть требуется отсортировать коллекцию строк по количеству различных букв в строке.</p>
<p>Для этого можно передать лямбда-функцию методу списка sort:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">strings = ['foo', 'card', 'bar', 'aaaa', 'abab']

strings.sort(key=lambda x: len(set(list(x))))

print(strings)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['aaaa', 'foo', 'abab', 'bar', 'card']</pre>
<h3><strong>Для чего хороша лямбда-функция? Зачем нужная lambda function в Python?</strong></h3>
<p pid="4973"><strong>Ответ:</strong></p>
<ul>
<li><span>Нам не нужна лямбда функция, мы могли бы обойтись без нее. <strong>Но…</strong></span></li>
<li><span>Есть определенные ситуации, когда это удобно &#8212; <strong>lambda</strong> делает написание кода немного легче, а написанный код &#8212; немного чище.</span></li>
</ul>
<p><strong>Какие ситуации?</strong></p>
<p pid="4975"><span>Что ж, ситуации, в которых нам нужна простая одноразовая функция: функция, которая будет использоваться только один раз.</span></p>
<p pid="4976"><span>Обычно функции создаются для одной из двух целей: </span><span>(а) для уменьшения дублирования кода или </span><span>(б) для модульности кода.</span></p>
<ul>
<li><span>Если ваше приложение содержит повторяющиеся фрагменты кода в разных местах, то вы можете поместить одну копию этого кода в функцию, дать имя функции, а затем &#8212; используя это имя функции &#8212; вызвать ее из разных мест в вашем коде.</span></li>
<li><span>Если у вас есть кусок кода, который выполняет одну четко определенную операцию &#8212; но он действительно длинный и грубый и прерывает читаемый поток вашей программы, то вы можете извлечь этот длинный грубый код и поместить его в самостоятельную функцию.</span></li>
</ul>
<p><span>Но предположим, что вам нужно создать функцию, которая будет использоваться только один раз &#8212; вызываться </span><em><span>только </span></em><span>из <em>одного </em>места в вашем приложении. Ну, во-первых, вам не нужно давать имя функции. Это может быть «анонимно». И вы можете просто определить его прямо там, где вы хотите его использовать. Вот где лямбда полезна.</span></p>
<p>Еще один пример использования <strong>lambda функции</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">colors = ["Goldenrod", "Purple", "Salmon", "Turquoise", "Cyan"]

normalized_colors = list(map(lambda s: s.casefold(), colors))

print(normalized_colors)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['goldenrod', 'purple', 'salmon', 'turquoise', 'cyan']</pre>
<h3 id="Misuse:_naming_lambda_expressions"><strong>Неправильное использование: именование лямбда-выражений</strong></h3>
<p><span>PEP8, официальное руководство по стилю Python, советует никогда не писать такой код:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">normalize_case = lambda s: s.casefold()</pre>
<p><span>Вышеприведенный оператор создает анонимную функцию, а затем назначает ее переменной. Приведенный выше код игнорирует причину полезности </span><strong><span>лямбда-функций</span></strong><span>: <strong>лямбда-функции могут передаваться без необходимости вначале присваивать их переменной</strong>.</span></p>
<p><span>Если вы хотите создать однострочную функцию и сохранить ее в переменной, вы должны использовать </span><code>def</code><span>вместо этого:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def normalize_case(s): return s.casefold()</pre>
<p><span><strong>PEP8</strong> рекомендует это, потому что <strong>именованные функции</strong> &#8212; это обычная и понятная вещь. Именованная функция также имеет следующее преимущество: назначая нашей функции правильное имя, Вы упрощаете отладку кода. В отличие от функций, определенных с помощью </span><code>def</code><span>, лямбда-функции никогда не имеют имени (это всегда </span><code>&lt;lambda&gt;</code><span>).</span></p>
<p><strong><span>Если вы хотите создать функцию и сохранить ее в переменной, определите свою функцию с помощью </span><code>def</code></strong><span> . Это именно то, для чего существует именованная функция. Не имеет значения, является ли ваша функция одной строкой кода или вы определяете функцию внутри другой функции, </span><code>def</code> <span>отлично работает для этих случаев использования.</span></p>
<h3 id="Misuse:_needless_function_calls"><strong>Неправильное использование: ненужные вызовы функций</strong></h3>
<p><span>Периодически встречаются лямбда-выражения, которые используются для подстановки в функции python, которые уже содержат функциональность для решения задачи. Нужно только посмотреть в документацию по функциям.</span></p>
<p><span>Например, возьмем этот код:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">sorted_numbers = sorted(numbers, key=lambda n: abs(n))</pre>
<figure class="code">
<figcaption><span></span></figcaption>
</figure>
<p>Программист<span>, написавший этот код, вероятно, узнал, что лямбда-выражения используются для создания функции, которую можно передавать в другую функцию.</span></p>
<p><span>Поскольку </span><code>abs</code><span> (которая возвращает абсолютное значение числа) является функцией и все функции могут быть переданы, мы могли бы написать приведенный выше код следующим образом:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">sorted_numbers = sorted(numbers, key=abs)</pre>
<figure class="code">
<figcaption><span></span></figcaption>
</figure>
<p><span>Теперь этот пример может показаться надуманным, но нередко чрезмерно используют лямбда-выражения таким образом. Вот еще один пример, который иногда встречается:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">pairs = [(4, 11), (8, 8), (5, 7), (11, 3)]
sorted_by_smallest = sorted(pairs, key=lambda items: min(items))</pre>
<figure class="code">
<figcaption><span></span></figcaption>
</figure>
<p><span>Поскольку мы принимаем те же аргументы, что и при передаче </span><code>min</code><span>, нам не нужен этот дополнительный вызов функции. Вместо этого мы можем просто передать </span><code>min</code> <span>функцию </span><code>key</code><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">pairs = [(4, 11), (8, 8), (5, 7), (11, 3)]
sorted_by_smallest = sorted(pairs, key=min)</pre>
<figure class="code">
<figcaption><span></span></figcaption>
</figure>
<p><span>Вам не нужна лямбда-функция, если у вас уже есть другая функция, которая делает то, что вы хотите.</span></p>
<h2><strong>Замыкания: функции, возвращающие функции. Динамически сгенерированная функция</strong></h2>
<p><strong>Замыканием</strong> называется любая <em><strong>динамически сгенерированная функция</strong></em>, возвращенная из другой функции. Основное свойство замыкания состоит в том, что оно имеет доступ к переменным, определенным в том локальном пространстве имен, в котором было создано.</p>
<p>Вот очень простой пример:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def make_closure(a):
    def closure():
        print('Я знаю секрет: %d' % a)
    return closure

closure = make_closure(5)
closure()</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Я знаю секрет: 5</pre>
<p>Разница между замыканием и обычной функцией Python состоит в том, что <strong>замыкание сохраняет доступ к пространству имен (функции)</strong>, в котором было создано, даже если создавшая ее функция уже завершилась.</p>
<p>Так, в примере выше, возвращенное замыкание печатает строку <strong>&#171;Я знаю секрет: 5&#187;</strong>, в какой бы момент ее ни вызвать. Хотя обычно создают замыкания со статическим внутренним состоянием (в данном случае только значение a), ничто не мешает включить в состав состояния изменяемый объект – словарь, множество, список – и затем модифицировать его.</p>
<p>Например, ниже приведена функция, которая возвращает функцию, запоминающую, с какими аргументами вызывалась объемлющая функция:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def make_watcher():
    have_seen = {}

    def has_been_seen(x):
        if x in have_seen:
            return True
        else:
            have_seen[x] = True
        return False

    return has_been_seen

watcher = make_watcher()

vals = [5, 6, 1, 5, 1, 6, 3, 5]

print([watcher(x) for x in vals])</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">[False, False, False, True, True, True, False, True]</pre>
<p>Однако следует иметь в виду одно техническое ограничение: изменять внутреннее состояние объектов (например, добавлять в словарь пары ключ-значение) можно, но связывать переменные в области видимости объемлющей функции – нельзя. Обойти это ограничение можно, например, путем модификации словаря или списка вместо присваивания значений переменным.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def make_counter():
    count = [0]

    def counter():
        # увеличить счетчик и вернуть новое значение
        count[0] += 1
        return count[0]
    return counter

counter = make_counter()
print(counter())</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">1</pre>
<p><strong>Возникает вопрос, зачем все это нужно?</strong> На практике можно написать очень общую функцию с кучей параметров, а затем изготовить на ее основе более простые специализированные функции.</p>
<p>Вот пример функции форматирования строк:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def format_and_pad(template, space):
    def formatter(x):
        return (template % x).rjust(space)
    return formatter

fmt = format_and_pad('%.4f', 15)
print(fmt(1.756))</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">'         1.7560'</pre>
<h2><strong>Каррирование: частичное фиксирование аргументов функции</strong></h2>
<p>В информатике термином каррирование обозначается процедура порождения новых функций из существующих путем фиксирования некоторых аргументов.</p>
<p>Пусть, например, имеется тривиальная функция сложения двух чисел:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def add_numbers(x, y):
    return x + y</pre>
<p>Мы можем породить на ее основе новую функцию одной переменной, <strong>add_five</strong>, которая прибавляет к своему аргументу 5:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">add_five = lambda y: add_numbers(5, y)</pre>
<p>Говорят, что второй аргумент функции <strong>add_numbers</strong> каррирован. Ничего особо примечательного здесь нет, поскольку мы просто определили новую функцию, которая вызывает существующую.</p>
<p>Теперь запустим полный код:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def add_numbers(x, y):
    return x + y

add_five = lambda y: add_numbers(5, y)

print(add_five(10))</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">15</pre>
<p>Стандартный модуль <strong>functools</strong> упрощает эту процедуру за счет функции <strong>partial</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">from functools import partial

def add_numbers(x, y):
    return x + y

add_five = partial(add_numbers, 5)

print(add_five(10))</pre>
<p>Также вернет <code class="EnlighterJSRAW" data-enlighter-language="null">15</code></p>
<p>При обсуждении библиотеки pandas мы будем пользоваться этой техникой для создания специализированных функций преобразования временных рядов:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null"># вычислить скользящее среднее временного ряда x за 60 дней
ma60 = lambda x: pandas.rolling_mean(x, 60)
# вычислить скользящие средние за 60 дней всех временных рядов в data
data.apply(ma60)</pre>


<p></p>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&#038;title=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" data-a2a-url="https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/" data-a2a-title="Функции Python 3: значение, аргументы, вызов, переменные, списки"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/">Функции Python 3: значение, аргументы, вызов, переменные, списки</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
