CINXE.COM
Анонимные lambda-функции Python с нуля до бесконечности
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <link rel="stylesheet" href="/pyplanet_tmpl/css/style.css"> <link rel="stylesheet" href="/pyplanet_tmpl/css/pygments.css"> <link rel="stylesheet" href="/pyplanet_tmpl/fonts/stylesheet.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="#ffffff"> <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> <nav class="header-menu"> <ul> <li><a href="/"><img class="text-image" src="/pyplanet_tmpl/img/homepage.png" alt="На главную"></a></li> <li>Категории ↓ <ul> <li><a href="/category/osnovy.html">Основы</a></li> <li><a href="/category/enhanced.html">Продвинутый</a></li> <li><a href="/category/guidebook.html">Справочник</a></li> <li><a href="/category/ege.html">Разборы ЕГЭ</a></li> <li><a href="/category/tasks.html">Решение разных задач</a></li> </ul> <li><a href="/pages/books.html">Книги</a></li> <li><a href="/pages/courses-free.html">Бесплатные курсы</a></li> <li><a target="_blank" href="https://www.tinkoff.ru/cf/6xIycbvJQF9">Поддержать</a></li> </ul> </nav> <div id="main-page"> <article> <header> <h1>Анонимные lambda-функции</h1> </header> <div> <p>Мы разобрались, как писать функции с помощью <tt class="docutils literal">def</tt>, однако это не всегда удобно.</p> <p>Например, есть метод <tt class="docutils literal">sort</tt> у списков, который сортирует список. У него есть аргумент <tt class="docutils literal">key</tt> - это функция, которая применяется к каждому элементу и возвращает значение для сортировки.</p> <p>Например, попробуем отсортировать список по модулю числа (модуль числа - это само число, если оно не меньше нуля, и ему противоположное, если меньше).</p> <pre class="code python3 literal-block"> <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="w"> </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="w"> </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="w"> </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="w"> </span><span class="nb">print</span><span class="p">(</span><span class="n">array</span><span class="p">)</span><span class="w"> </span><span class="c1"># [0, 1, -2, -4, 9, -14, 100]</span> </pre> <p>Это работает, но нам необходимо определить функцию, которая делает несложную операцию, и которая будет использована лишь один раз в качестве аргумента метода sort.</p> <p>lambda-выражение позволяет не тратить несколько строк на запись функции, а записать её короче:</p> <pre class="code python3 literal-block"> <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="w"> </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="w"> </span><span class="nb">print</span><span class="p">(</span><span class="n">array</span><span class="p">)</span><span class="w"> </span><span class="c1"># [0, 1, -2, -4, 9, -14, 100]</span> </pre> <p>Здесь анонимная функция - это <tt class="docutils literal">lambda number: abs(number)</tt>, которая присвоена аргументу key метода sort.</p> <div class="note docutils container"> <p>В данном случае можно написать даже ещё короче (но не всегда функции будут настолько простыми):</p> <pre class="code python3 literal-block"> <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> <p>После инструкции <strong>lambda</strong> в анонимной функции идут аргументы (сколько угодно, или даже ни одного), затем двоеточие; а затем инструкция, как если бы мы в обычной функции (которая через def) сразу написали бы return (однако в lambda-функции инструкция return не нужна).</p> <p>lambda-функцию можно присвоить переменной и затем использовать как обычную функцию:</p> <pre class="code python3 literal-block"> <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> <p>Однако на практике так, как правило, не делают.</p> </div> </article> <nav class="nav-below"> <div class="nav-previous"> <a href="/article/def-return.html">← Предыдущая часть</a> </div> <div class="nav-cat"> <a href="/category/osnovy.html">В категорию "Основы Python"</a> </div> <div class="nav-next"> <a href="/article/args-kwargs.html">Следующая часть →</a> </div> </nav> <nav class="nav-below" style="padding-top:2rem"> <div> <a target="_blank" href="https://t.me/pyplanet"><button class="telegram-button">✈ Telegram</button></a> </div> <div> <a target="_blank" href="https://www.tinkoff.ru/cf/6xIycbvJQF9"><button class="tinkoff-button">Поддержать ₽</button></a> </div> </nav> <nav class="nav-below"> <div id="yandex_rtb_R-A-9079088-1"></div> <script> window.yaContextCb.push(()=>{ Ya.Context.AdvManager.render({ "blockId": "R-A-9079088-1", "renderTo": "yandex_rtb_R-A-9079088-1" }) }) </script> </nav> </div> <footer> <div>(c) 2024 <a href="/">pyplanet - Python с нуля до бесконечности</a></div> </footer> </body> </html>