---
title: Функции и их особенности
questionDates:
  q-transfer-0147: '2026-10-01'
  q-transfer-0148: '2026-10-01'
  q-transfer-0149: '2026-10-01'
  q-transfer-0150: '2026-10-01'
  q-transfer-0151: '2026-10-01'
  q-transfer-0152: '2026-10-01'
  q-transfer-0153: '2026-10-01'
  q-transfer-0258: '2026-10-01'
  q-transfer-0259: '2026-10-01'
  q-transfer-0260: '2026-10-01'
  q-transfer-0283: '2026-10-01'
seo:
  description: >-
    Тема «Функции и их особенности» для собеседования Python Developer. Какие
    способы существуют для определения функций в Python и в чем заключаются их
    различия? Каким образом параметры передаются в функции Python?
  title: Функции и их особенности — Python Developer
---

[Все темы Python Developer](/prep/python-developer)

## <strong>Какие способы существуют для определения функций в Python и в чем заключаются их различия?</strong> [#q-14bee738d69b81a09bc6cc40984525eb]

Обычные функции в Python определяют с помощью def или lambda. Ниже также показано применение функций высшего порядка.

#### <strong>Определение функции с использованием ключевого слова</strong> <code>def</code>&#58;

- Этот способ наиболее распространен.

- Функции, определенные с помощью <code>def</code>, могут иметь имя и список параметров.

- Используются для определения пользовательских функций.

<strong>Пример&#58;</strong>

```python
def my_function(x):
    return x * 2
```

#### <strong>Лямбда-функции (анонимные функции)</strong>&#58;

- Определяются с помощью ключевого слова <code>lambda</code>.

- Обычно используются для создания простых однострочных функций.

- Могут принимать любое количество аргументов, но содержат только одно выражение.

<strong>Пример&#58;</strong>

```python
multiply = lambda x: x * 2
```

#### Применение функций высшего порядка&#58; map(), filter() и functools.reduce().

- Функции высшего порядка принимают другие функции как аргументы или возвращают их. map() и filter() встроены, reduce() импортируется из functools.

- Используются для выполнения операций над другими функциями или структурами данных.

<strong>Пример&#58;</strong>

```python
# Пример с map()
result = map(lambda x: x * 2, [1, 2, 3, 4])
print(list(result))  # Вывод: [2, 4, 6, 8]
```

:::note[Ссылки для изучения]

1. [Функции в Python](https://python-school.ru/blog/python/python-functions-types/)
   :::

---

## <strong>Каким образом параметры передаются в функции Python?</strong> [#q-14bee738d69b81de954df6679f5b4e40]

Параметры в Python могут передаваться в функции двумя основными способами&#58;

#### <strong>Позиционные параметры</strong>&#58;

- Параметры передаются в том порядке, в котором они определены в сигнатуре функции.

- Позиционные параметры связываются с аргументами в вызове функции по их порядку.

- Передаваемые значения связываются с параметрами согласно их позиции.

<strong>Пример&#58;</strong>

```python
def greet(name, age):
    print(f"Привет, {name}! Тебе {age} лет.")

greet("Иван", 30)  # Передача параметров по позиции
```

#### <strong>Именованные параметры</strong>&#58;

- Параметры передаются с указанием их имени в вызове функции.

- Позволяют передавать параметры в любом порядке, если указаны их имена.

- Улучшают читаемость кода и делают его более ясным.

<strong>Пример&#58;</strong>

```python
def greet(name, age):
    print(f"Привет, {name}! Тебе {age} лет.")

greet(age=30, name="Иван")  # Передача параметров по именам
```

:::note[Ссылки для изучения]

1. [Параметры функции в Python](https://metanit.com/python/tutorial/2.15.php)
   :::

---

## <strong>Что такое лямбда-функции?</strong> [#q-14bee738d69b811fbaf4e26419c0c5e6]

Это анонимные функции, которые могут быть определены без использования ключевого слова <code>def</code>. Они обычно используются для создания простых функций в одну строку кода, обычно для передачи встроенным функциям высшего порядка, таким как <code>map&#40;&#41;</code>, <code>filter&#40;&#41;</code> и <code>sorted&#40;&#41;</code>. Лямбда-функции могут принимать любое количество аргументов, но содержат только одно выражение.

:::note[Ссылки для изучения]

1. [Лямбда-выражения Python: анонимная функция и ограничение одним выражением](https://docs.python.org/ru/3/tutorial/controlflow.html#lambda-expressions)
   :::

---

## <strong>В чем отличие позиционных аргументов от именованных?</strong> [#q-14bee738d69b8136ac33c7f2c72a399c]

Позиционные аргументы передаются в функцию в порядке их расположения в вызове функции. Именованные аргументы передаются с указанием их имени в вызове функции. Использование именованных аргументов позволяет передавать параметры в любом порядке и улучшает читаемость кода, в то время как позиционные аргументы привязываются к параметрам по их позиции.

:::note[Ссылки для изучения]

1. [Позиционные и именованные аргументы в Python](https://education.yandex.ru/handbook/python/article/pozicionnye-i-imenovannye-argumenty-funkcii-vysshih-poryadkov-lyambda-funkcii)
   :::

---

## <strong>Лямбда функции, зачем нужны и чего точно не может быть в них?</strong> [#q-14bee738d69b81de85dcf964d332b0c4]

Лямбда-функции в Python - это анонимные (безымянные) функции, которые могут содержать только одно выражение. Они полезны в случаях, когда требуется передать небольшую функцию в качестве аргумента другой функции или создать функцию на лету без необходимости определения ее имени.

Вот основные применения лямбда-функций&#58;

<strong>Передача функции в качестве аргумента&#58;</strong>

```python
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
```

Альтернатива map() с lambda&#58; списковое включение без отдельной функции.

```python
numbers = [1, 2, 3, 4, 5]
squared = [x**2 for x in numbers]
```

<strong>Создание коротких функций на лету&#58;</strong>

```python
add = lambda x, y: x + y
```

:::note[Ссылки для изучения]

1. [Лямбда-выражения Python: анонимная функция и ограничение одним выражением](https://docs.python.org/ru/3/tutorial/controlflow.html#lambda-expressions)
   :::

---

## Чем пространство имен отличается от области видимости? [#q-transfer-0147]

Пространство имен хранит соответствие имен объектам, например словарь глобальных имен модуля. Область видимости определяет участок программы и порядок, в котором эти пространства ищутся. Для функций действует LEGB: local, enclosing, global, built-ins. `global` направляет присваивание в пространство модуля, а `nonlocal` в ближайшую охватывающую функцию. Они меняют место привязки имени, а не сам объект. На собеседовании полезно отдельно назвать момент связывания имени и отличить изменение объекта от новой привязки.

:::note[Ссылки для изучения]

1. [Пространства имён и области видимости — официальный учебник Python](https://docs.python.org/ru/3/tutorial/classes.html#python-scopes-and-namespaces)
   :::

---

## Как Python ищет имя по правилу LEGB? [#q-transfer-0148]

Python ищет имя в local, затем в enclosing-функциях, global-пространстве модуля и built-ins. Если в теле функции есть присваивание имени, компилятор считает его локальным, пока не объявлены `global` или `nonlocal`. Поэтому чтение такого имени до присваивания дает `UnboundLocalError`, а полное отсутствие имени дает `NameError`. Поиск атрибутов объекта устроен отдельно и правилу LEGB не подчиняется. На собеседовании полезно отдельно назвать момент связывания имени и отличить изменение объекта от новой привязки.

:::note[Ссылки для изучения]

1. [Порядок поиска имён: локальная, охватывающая, глобальная и встроенная области Python](https://docs.python.org/ru/3/tutorial/classes.html#python-scopes-and-namespaces)
2. [Пространства имён и поиск переменных. Лекторий ФПМИ, с 19:44](https://www.youtube.com/watch?v=dFaH4WPwjD4&t=1184s)

:::

---

## Как работает замыкание и зачем нужен nonlocal? [#q-transfer-0149]

Замыкание сохраняет не снимок значения, а ячейку переменной из охватывающей функции, поэтому она живет после завершения внешнего вызова. Несколько внутренних функций могут видеть одну ячейку. Имена разрешаются при вызове, что создает эффект позднего связывания в циклах; текущее значение можно зафиксировать аргументом по умолчанию. `nonlocal` нужен для перепривязки этой переменной, а изменение уже захваченного списка возможно и без него. На собеседовании полезно отдельно назвать момент связывания имени и отличить изменение объекта от новой привязки.

:::note[Ссылки для изучения]

1. [Замыкание-счётчик и nonlocal: сохранение и изменение переменной между вызовами](https://proproprogs.ru/python_base/python3-zamykaniya-v-python)
2. [Замыкание. Лекторий ФПМИ, с 55:19](https://www.youtube.com/watch?v=dFaH4WPwjD4&t=3319s)

:::

---

## Почему изменяемый аргумент по умолчанию сохраняет состояние? [#q-transfer-0150]

Значение аргумента по умолчанию вычисляется один раз при выполнении `def`, а не при каждом вызове. Поэтому список или словарь накапливает изменения между вызовами. Обычно ставят `None` и создают объект внутри функции. Если `None` является допустимым значением, используют отдельный sentinel-объект, чтобы различать отсутствие аргумента и явно переданный `None`. На собеседовании полезно отдельно назвать момент связывания имени и отличить изменение объекта от новой привязки.

:::note[Ссылки для изучения]

1. [Изменяемые аргументы по умолчанию: один объект на несколько вызовов — Python](https://docs.python.org/ru/3/tutorial/controlflow.html#default-argument-values)
   :::

---

## Когда уместен `*args` и чем он усложняет интерфейс функции? [#q-transfer-0151]

`*args` собирает лишние позиционные аргументы в кортеж и удобен в обертках, делегировании и функциях с естественным переменным числом элементов. Тем же синтаксисом последовательность распаковывают при вызове. Для обычного публичного API явные параметры лучше: они видны в подсказках, документируют смысл и позволяют анализатору проверить вызов. Обязательные значения не стоит прятать в безымянной позиции `args`. На собеседовании полезно отдельно назвать момент связывания имени и отличить изменение объекта от новой привязки.

:::note[Ссылки для изучения]

1. [Переменное число аргументов: args, явные параметры и распаковка — Python](https://docs.python.org/ru/3/tutorial/controlflow.html#arbitrary-argument-lists)
   :::

---

## Когда уместен `**kwargs` и как не потерять контракт функции? [#q-transfer-0152]

`**kwargs` собирает дополнительные именованные аргументы в словарь; при вызове словарь тем же синтаксисом распаковывают. Это уместно в декораторах и адаптерах, которые прозрачно передают параметры дальше. Собственный API должен явно объявлять обязательные и устойчивые параметры. Если набор дополнительных ключей ограничен, его проверяют и типизируют, например через `TypedDict`; молчаливое игнорирование опечатки превращает ошибку в скрытое поведение. На собеседовании полезно отдельно назвать момент связывания имени и отличить изменение объекта от новой привязки.

:::note[Ссылки для изучения]

1. [kwargs, распаковка словаря и явный интерфейс параметров — Python](https://docs.python.org/ru/3/tutorial/controlflow.html#keyword-arguments)
   :::

---

## Какие объекты в Python можно вызывать? [#q-transfer-0153]

Вызывать можно функции, связанные методы, классы и экземпляры, класс которых реализует `__call__`. Класс при вызове создает экземпляр через `__new__` и `__init__`. `callable(obj)` проверяет только наличие механизма вызова. Он не гарантирует, что объект примет конкретные аргументы или что вызов завершится успешно; совместимость сигнатуры проверяет типизатор либо `inspect.signature` там, где интроспекция поддерживается. На собеседовании полезно отдельно назвать момент связывания имени и отличить изменение объекта от новой привязки.

:::note[Ссылки для изучения]

1. [callable: вызываемые классы и экземпляры с `__call__`, без гарантии успеха — Python](https://docs.python.org/ru/3/library/functions.html#callable)
   :::

---

## Что входит в сигнатуру функции? [#q-transfer-0258]

Сигнатура задает порядок и виды параметров: positional-only, positional-or-keyword, var-positional, keyword-only и var-keyword, а также значения по умолчанию и аннотации. `inspect.signature()` показывает их и умеет связывать набор аргументов. Для связанного метода `self` уже привязан и обычно не виден вызывающему. Аннотация возврата относится к метаданным функции, но Python не обеспечивает ее соблюдение автоматически. На собеседовании полезно отдельно назвать момент связывания имени и отличить изменение объекта от новой привязки.

:::note[Ссылки для изучения]

1. [Состав сигнатуры: виды параметров, значения по умолчанию и аннотации — Python](https://docs.python.org/ru/3/tutorial/controlflow.html#special-parameters)
   :::

---

## Как работают positional-only и keyword-only параметры? [#q-transfer-0259]

Символ `/` завершает positional-only параметры, а `*` начинает keyword-only параметры. Первые полезны, когда имя аргумента не является частью публичного API; вторые делают смысл вызова явным и позволяют безопаснее добавлять параметры. Python связывает каждый аргумент ровно один раз: передача значения и позиционно, и по имени дает ошибку, как и неизвестное имя без `**kwargs`. На собеседовании полезно отдельно назвать момент связывания имени и отличить изменение объекта от новой привязки.

:::note[Ссылки для изучения]

1. [Параметры до слэша и после звёздочки: positional-only и keyword-only — Python](https://docs.python.org/ru/3/tutorial/controlflow.html#special-parameters)
   :::

---

## Почему append не требует global, а присваивание требует? [#q-transfer-0260]

`append` изменяет объект, на который уже указывает найденное глобальное имя, и не создает локальную привязку. Обычное присваивание имени внутри функции делает его локальным, если не указать `global`. `+=` является ловушкой: для list он часто мутирует объект, но операция все равно включает присваивание имени и потому подчиняется правилам области видимости. Для внешней функции аналогично применяют `nonlocal`. На собеседовании полезно отдельно назвать момент связывания имени и отличить изменение объекта от новой привязки.

:::note[Ссылки для изучения]

1. [Изменение общего объекта и привязка имени: что делает global — Python](https://docs.python.org/ru/3/tutorial/classes.html#python-scopes-and-namespaces)
   :::

---

## Чем чистая функция полезна в backend-коде? [#q-transfer-0283]

Чистая функция при одинаковых аргументах дает одинаковый результат и не меняет наблюдаемое внешнее состояние. Ее проще тестировать, кэшировать и безопасно повторять. В backend полностью убрать эффекты нельзя, поэтому I/O, часы и случайность оставляют на границах, а правила расчета передают чистым функциям как данные. Это также делает транзакционные и retry-сценарии понятнее. На собеседовании полезно отдельно назвать момент связывания имени и отличить изменение объекта от новой привязки.

:::note[Ссылки для изучения]

1. [Чистые функции: повторяемый результат, тестирование и I/O на границах — Роман Провазник](https://habr.com/ru/articles/415193/)
   :::
