CINXE.COM
Анонимные lambda-функции Python с нуля до бесконечности
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <link rel="stylesheet" href="/pyplanet_tmpl/fonts/style.css"> <link rel="stylesheet" href="/pyplanet_tmpl/css/new_style.css"> <title>Анонимные lambda-функции Python с нуля до бесконечности</title> <meta name="description" content='Изучение анонимных функций lambda в Python. Синтаксис, примеры и области применения.'> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> <link rel="manifest" href="/site.webmanifest"> <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"> <meta name="msapplication-TileColor" content="#da532c"> <meta name="theme-color" content="#f5f5f5"> <script type="text/javascript" > (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(97429815, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true }); </script> <noscript><div><img src="https://mc.yandex.ru/watch/97429815" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <script>window.yaContextCb=window.yaContextCb||[]</script> <script src="https://yandex.ru/ads/system/context.js" async></script> </head> <body> <header> <div class="logo"><a href="/"><img src="/pyplanet_tmpl/img/python-3.png"></a></div> <div class="logo-letters"><a href="/">Pyplanet — Python с нуля до бесконечности</a></div> </header> <div class="category-menu"> <a href="/category/osnovy.html">Основы</a> <a href="/category/enhanced.html">Продвинутый</a> <a href="/category/guidebook.html">Справочник</a> <a href="/pages/tutorials.html">Руководства</a> <a href="/pages/books.html">Книги</a> <a href="/pages/courses.html">Курсы</a> </div> <div class="main-content"> <div class="content"> <article class="post"> <h1>Анонимные lambda-функции</h1> <div class="text-block"> <div id="yandex_rtb_R-A-9079088-3" style="max-height: 10%"></div> <div id="content_top" style="display: none"> <a target="_blank" href="https://zallj.com/g/qqb62fps0r99b979a60661cec322b98fba714163/?erid=5jtCeReNwxHpfQTDve31wmc"> <img src="/pyplanet_tmpl/img/content_top.png"> </a> </div> <script> window.yaContextCb.push(() => { Ya.Context.AdvManager.render({ "blockId": "R-A-9079088-3", "renderTo": "yandex_rtb_R-A-9079088-3" }); }) setTimeout( function () { if (document.getElementById("yandex_rtb_R-A-9079088-3").clientHeight === 0) { document.getElementById("content_top").style.display = 'block'; } }, 500); </script> <p>Мы разобрались, как писать функции с помощью <tt class="docutils literal">def</tt>, однако это не всегда удобно.</p> <p>Например, есть метод <tt class="docutils literal">sort</tt> у списков, который сортирует список. У него есть аргумент <tt class="docutils literal">key</tt> - это функция, которая применяется к каждому элементу и возвращает значение для сортировки.</p> <p>Например, попробуем отсортировать список по модулю числа (модуль числа - это само число, если оно не меньше нуля, и ему противоположное, если меньше).</p> <div class="highlight"><pre><span></span><span class="n">array</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="o">-</span><span class="mi">4</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">14</span><span class="p">]</span> <span class="k">def</span> <span class="nf">modulo</span><span class="p">(</span><span class="n">number</span><span class="p">):</span> <span class="k">return</span> <span class="nb">abs</span><span class="p">(</span><span class="n">number</span><span class="p">)</span> <span class="n">array</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">modulo</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">array</span><span class="p">)</span> <span class="c1"># [0, 1, -2, -4, 9, -14, 100]</span> </pre></div> <p>Это работает, но нам необходимо определить функцию, которая делает несложную операцию, и которая будет использована лишь один раз в качестве аргумента метода sort.</p> <p>lambda-выражение позволяет не тратить несколько строк на запись функции, а записать её короче:</p> <div class="highlight"><pre><span></span><span class="n">array</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="o">-</span><span class="mi">4</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">14</span><span class="p">]</span> <span class="n">array</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">number</span><span class="p">:</span> <span class="nb">abs</span><span class="p">(</span><span class="n">number</span><span class="p">))</span> <span class="nb">print</span><span class="p">(</span><span class="n">array</span><span class="p">)</span> <span class="c1"># [0, 1, -2, -4, 9, -14, 100]</span> </pre></div> <p>Здесь анонимная функция - это <tt class="docutils literal">lambda number: abs(number)</tt>, которая присвоена аргументу key метода sort.</p> <div class="note docutils container"> <p>В данном случае можно написать даже ещё короче (но не всегда функции будут настолько простыми):</p> <div class="highlight"><pre><span></span><span class="n">array</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="nb">abs</span><span class="p">)</span> </pre></div> </div> <p>После инструкции <strong>lambda</strong> в анонимной функции идут аргументы (сколько угодно, или даже ни одного), затем двоеточие; а затем инструкция, как если бы мы в обычной функции (которая через def) сразу написали бы return (однако в lambda-функции инструкция return не нужна).</p> <p>lambda-функцию можно присвоить переменной и затем использовать как обычную функцию:</p> <div class="highlight"><pre><span></span><span class="n">modulo</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">number</span><span class="p">:</span> <span class="nb">abs</span><span class="p">(</span><span class="n">number</span><span class="p">)</span> </pre></div> <p>Однако на практике так, как правило, не делают.</p> <div id="yandex_rtb_R-A-9079088-1" style="max-height: 25%"></div> <div id="content_bottom" style="display: none"> <a target="_blank" href="https://zallj.com/g/qqb62fps0r99b979a60661cec322b98fba714163/?erid=5jtCeReNwxHpfQTDve31wmc"> <img src="/pyplanet_tmpl/img/content_bottom.png"> </a> </div> <script> window.yaContextCb.push(() => { Ya.Context.AdvManager.render({ "blockId": "R-A-9079088-1", "renderTo": "yandex_rtb_R-A-9079088-1" }); }) setTimeout( function () { if (document.getElementById("yandex_rtb_R-A-9079088-3").clientHeight === 0) { document.getElementById("content_bottom").style.display = 'block'; } }, 1000); </script> <nav class="nav-cycle"> <div> <a href="/article/def-return.html">← Предыдущая часть</a> </div> <div> <a href="/category/osnovy.html">В категорию "Основы Python"</a> </div> <div> <a href="/article/args-kwargs.html">Следующая часть →</a> </div> </nav> </div> </article> </div> <div class="sidebar"> <div class="sticky"> <div class="button-group"> <a target="_blank" href="https://t.me/pyplanet"><button class="telegram-button">✈ Telegram</button></a> <a target="_blank" href="https://www.tinkoff.ru/cf/6xIycbvJQF9"><button class="tinkoff-button">❤️ Поддержать</button></a> <a target="_blank" href="https://forms.gle/Trx4h8zZwKyBpsyY6"><button class="ask-button">❓ Задать вопрос</button></a> </div> <div class="latest-articles"> <h3>Популярные статьи</h3> <div class="article"> <h4><a href="https://pyplanet.ru/article/range-object.html">Объект range</a></h4> <p>Изучение объекта range в Python. Создание последовательностей чисел, использование в циклах и примеры применения.</p> </div> <div class="article"> <h4><a href="https://pyplanet.ru/article/pep-0257.html">PEP 257 - соглашения для строк документации (docstrings)</a></h4> <p>Целью данного PEP является стандартизация структуры строк документации: что они должны содержать и что должны объяснять.</p> </div> <div class="article"> <h4><a href="https://pyplanet.ru/pages/courses-free.html">Бесплатные курсы Python</a></h4> <p>Обзор бесплатных курсов, обучающих видео по языку программирования Python</p> </div> </div> </div> </div> </div> <footer> <p>© 2025 <a href="https://pyplanet.ru/">pyplanet - Python с нуля до бесконечности</a></p> </footer> </body> </html>