Параметры и аргументы функций в Python (без *args, **kwargs)
- Определения
Параметр — имя переменной в объявлении функции.
Аргумент — конкретное значение, передаваемое при вызове функции.
Пример:
def add(a, b): # a, b — параметры
return a + b
add(2, 3) # 2, 3 — аргументы
⸻
- Позиционные параметры (Positional Parameters)
Передача значений происходит по порядку.
def power(base, exponent):
return base ** exponent
result = power(2, 3) # base=2, exponent=3
Требования:
- количество аргументов должно совпадать с количеством параметров
- порядок важен
Ошибка:
power(2)
TypeError: missing required positional argument#
⸻
- Именованные аргументы (Keyword Arguments)
Аргументы передаются по имени параметра.
def connect(host, port):
return f"{host}:{port}"
connect(host="localhost", port=8080)
connect(port=8080, host="localhost")
Свойства:
- порядок не важен
- имена должны совпадать с параметрами
⸻
- Параметры со значениями по умолчанию (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
⸻
- Позиционные и именованные аргументы вместе
Позиционные аргументы должны идти до именованных.
def create_user(name, age, city):
pass
create_user("Ivan", age=30, city="Berlin")
Ошибка:
create_user(name="Ivan", 30, city="Berlin")
SyntaxError#
⸻
- Обязательные и необязательные параметры
Обязательные — без значения по умолчанию.
Необязательные — имеют значение по умолчанию.
def login(username, password, remember=False):
pass
Здесь:
- username — обязательный
- password — обязательный
- remember — необязательный
⸻
- Передача изменяемых объектов как параметров
Если параметр — изменяемый объект (list, dict), изменения внутри функции сохраняются.
def add_item(items):
items.append("new")
data = ["a", "b"]
add_item(data)
print(data)
['a', 'b', 'new']#
Причина:
Передаётся ссылка на объект.
⸻
- Опасность изменяемых значений по умолчанию
Ошибка проектирования.
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
⸻
- Возврат значений и параметры
Функция может использовать параметры для вычислений и возвращать результат.
def rectangle_area(width, height):
return width * height
Использование:
area = rectangle_area(5, 10)
⸻
- Аннотации типов параметров (Type Hints)
Используются для документации и проверки типов.
def multiply(a: int, b: int) -> int:
return a * b
Не выполняют проверку автоматически, но используются:
- линтерами
- IDE
- статическими анализаторами
⸻
- Параметры только для позиционной передачи (/)
Позволяют запретить передачу по имени.
def divide(a, b, /):
return a / b
divide(10, 2) # работает
divide(a=10, b=2) # ошибка
Назначение:
- защита API
- повышение производительности
- предотвращение конфликтов имён
⸻
- Параметры только для именованной передачи (*)
Требуют указывать имя аргумента.
def create_file(name, *, encoding):
print(name, encoding)
create_file("data.txt", encoding="utf-8")
Ошибка:
create_file("data.txt", "utf-8")
TypeError#
Назначение:
- улучшение читаемости
- снижение ошибок
⸻
- Порядок объявления параметров
Полный порядок:
def func(
pos_only, # позиционные (/)
/,
pos_or_kw, # позиционные или именованные
default=1, # со значением по умолчанию
*,
kw_only, # только именованные
kw_default=2 # именованные со значением по умолчанию
):
pass
⸻
- Распаковка аргументов при вызове
Передача значений из коллекций.
Распаковка списка:
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 внутри функции.)
⸻
- Передача функций как аргументов
Функции — объекты.
def apply(func, value):
return func(value)
def square(x):
return x * x
apply(square, 5)
⸻
- Проверка количества аргументов
Python проверяет автоматически.
Ошибка:
def add(a, b):
return a + b
add(1, 2, 3)
TypeError: takes 2 positional arguments but 3 were given#
⸻
- Передача аргументов по ссылке (семантика объектов)
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]#
⸻
- Документирование параметров
Через docstring.
def calculate_tax(price: float, rate: float) -> float:
"""
Вычисляет налог.
:param price: цена товара
:param rate: ставка налога
:return: сумма налога
"""
return price * rate
⸻
-
Типичные ошибки
-
Несоответствие количества аргументов
-
Нарушение порядка позиционных и именованных
-
Использование изменяемых значений по умолчанию
-
Опечатки в именах аргументов
-
Передача неподходящих типов
Пример:
def area(width, height):
return width * height
area(width=10, heigth=5)
TypeError: unexpected keyword argument#
⸻
- Минимальный шаблон правильной функции
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