JustCaptain kod-buduschego
27a7473e506a4bc52e95e3c8e2b1d9daa4087b34
Перейти к файлу
Код
MATERIAL.md

Параметры и аргументы функций в Python (без *args, **kwargs)

  1. Определения

Параметр — имя переменной в объявлении функции.
Аргумент — конкретное значение, передаваемое при вызове функции.

Пример:

def add(a, b): # a, b — параметры
return a + b
add(2, 3) # 2, 3 — аргументы

⸻

  1. Позиционные параметры (Positional Parameters)

Передача значений происходит по порядку.

def power(base, exponent):
return base ** exponent
result = power(2, 3) # base=2, exponent=3

Требования:

  • количество аргументов должно совпадать с количеством параметров
  • порядок важен

Ошибка:

power(2)

TypeError: missing required positional argument#

⸻

  1. Именованные аргументы (Keyword Arguments)

Аргументы передаются по имени параметра.

def connect(host, port):
return f"{host}:{port}"
connect(host="localhost", port=8080)
connect(port=8080, host="localhost")

Свойства:

  • порядок не важен
  • имена должны совпадать с параметрами

⸻

  1. Параметры со значениями по умолчанию (Default Parameters)

Если аргумент не передан — используется значение по умолчанию.

def greet(name, message="Hello"):
return f"{message}, {name}"
greet("Ivan")

message="Hello"#

greet("Ivan", "Hi")

message="Hi"#

Правило:

Параметры со значениями по умолчанию должны идти после обычных параметров.

Ошибка:

def func(a=1, b):
pass

SyntaxError#

Правильно:

def func(a, b=1):
pass

⸻

  1. Позиционные и именованные аргументы вместе

Позиционные аргументы должны идти до именованных.

def create_user(name, age, city):
pass
create_user("Ivan", age=30, city="Berlin")

Ошибка:

create_user(name="Ivan", 30, city="Berlin")

SyntaxError#

⸻

  1. Обязательные и необязательные параметры

Обязательные — без значения по умолчанию.
Необязательные — имеют значение по умолчанию.

def login(username, password, remember=False):
pass

Здесь:

  • username — обязательный
  • password — обязательный
  • remember — необязательный

⸻

  1. Передача изменяемых объектов как параметров

Если параметр — изменяемый объект (list, dict), изменения внутри функции сохраняются.

def add_item(items):
items.append("new")
data = ["a", "b"]
add_item(data)
print(data)

['a', 'b', 'new']#

Причина:

Передаётся ссылка на объект.

⸻

  1. Опасность изменяемых значений по умолчанию

Ошибка проектирования.

def add_item(item, items=[]):
items.append(item)
return items
print(add_item(1))
print(add_item(2))

Результат:

[1]
[1, 2]

Причина:

Список создаётся один раз, при объявлении функции.

Правильный вариант:

def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items

⸻

  1. Возврат значений и параметры

Функция может использовать параметры для вычислений и возвращать результат.

def rectangle_area(width, height):
return width * height

Использование:

area = rectangle_area(5, 10)

⸻

  1. Аннотации типов параметров (Type Hints)

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

def multiply(a: int, b: int) -> int:
return a * b

Не выполняют проверку автоматически, но используются:

  • линтерами
  • IDE
  • статическими анализаторами

⸻

  1. Параметры только для позиционной передачи (/)

Позволяют запретить передачу по имени.

def divide(a, b, /):
return a / b
divide(10, 2) # работает
divide(a=10, b=2) # ошибка

Назначение:

  • защита API
  • повышение производительности
  • предотвращение конфликтов имён

⸻

  1. Параметры только для именованной передачи (*)

Требуют указывать имя аргумента.

def create_file(name, *, encoding):
print(name, encoding)
create_file("data.txt", encoding="utf-8")

Ошибка:

create_file("data.txt", "utf-8")

TypeError#

Назначение:

  • улучшение читаемости
  • снижение ошибок

⸻

  1. Порядок объявления параметров

Полный порядок:

def func(
pos_only, # позиционные (/)
/,
pos_or_kw, # позиционные или именованные
default=1, # со значением по умолчанию
*,
kw_only, # только именованные
kw_default=2 # именованные со значением по умолчанию
):
pass

⸻

  1. Распаковка аргументов при вызове

Передача значений из коллекций.

Распаковка списка:

def add(a, b, c):
return a + b + c
numbers = [1, 2, 3]
add(*numbers)

Распаковка словаря:

def connect(host, port):
pass
config = {
"host": "localhost",
"port": 8080
}
connect(**config)

(Без описания механики *args, **kwargs внутри функции.)

⸻

  1. Передача функций как аргументов

Функции — объекты.

def apply(func, value):
return func(value)
def square(x):
return x * x
apply(square, 5)

⸻

  1. Проверка количества аргументов

Python проверяет автоматически.

Ошибка:

def add(a, b):
return a + b
add(1, 2, 3)

TypeError: takes 2 positional arguments but 3 were given#

⸻

  1. Передача аргументов по ссылке (семантика объектов)

Python использует передачу ссылки на объект.

Следствия:

  • неизменяемые объекты — не меняются
  • изменяемые — могут изменяться

Пример неизменяемого:

def change(x):
x = 10
a = 5
change(a)
print(a)

5#

Пример изменяемого:

def change(lst):
lst.append(10)
data = [1, 2]
change(data)
print(data)

[1, 2, 10]#

⸻

  1. Документирование параметров

Через docstring.

def calculate_tax(price: float, rate: float) -> float:
"""
Вычисляет налог.
:param price: цена товара
:param rate: ставка налога
:return: сумма налога
"""
return price * rate

⸻

  1. Типичные ошибки

  2. Несоответствие количества аргументов

  3. Нарушение порядка позиционных и именованных

  4. Использование изменяемых значений по умолчанию

  5. Опечатки в именах аргументов

  6. Передача неподходящих типов

Пример:

def area(width, height):
return width * height
area(width=10, heigth=5)

TypeError: unexpected keyword argument#

⸻

  1. Минимальный шаблон правильной функции

def function_name(
required_param,
optional_param=default_value,
*,
keyword_only_param=None
) -> return_type:
"""
Краткое описание.
:param required_param: описание
:param optional_param: описание
:param keyword_only_param: описание
:return: описание результата
"""
result = required_param
return result