Основы передачи параметров в функциях языка Python
Основные способы передачи параметров
Позиционные параметры
Как передать аргументы строго по порядку?
Самый простой способ - указать значения в том же порядке, что и параметры в определении функции. Каждый аргумент привязывается к соответствующей позиции.
def greet(name, age):
print(f"Привет, {name}! Тебе {age} лет.")
greet("Анна", 25)аргументы print python (аргументы функции print в python)
Привет, Анна! Тебе 25 лет.
Python 3 аргументы (аргументы в python 3)
Типичная ошибка - передача аргументов в неправильном порядке. Если поменять местами "Анна" и 25, программа может выдать логическую ошибку (например, возраст станет именем). Решение - строго следить за порядком или использовать именованные аргументы.
Как передать аргументы в произвольном порядке?
Именованные аргументы
При вызове функции можно указывать имя параметра и значение. Это делает код более читаемым и устраняет зависимость от порядка.
def greet(name, age):
print(f"Привет, {name}! Тебе {age} лет.")
greet(age=30, name="Олег")аргумент параметр python (аргументы и параметры в python)
Привет, Олег! Тебе 30 лет.
аргумент класса python (аргументы класса python)
Ошибка: если после именованного аргумента идёт позиционный, возникнет SyntaxError. Все именованные аргументы должны следовать после позиционных.
Как задать значение параметра по умолчанию?
Параметры со значениями по умолчанию
Можно указать значения, которые будут использоваться, если аргумент не передан. Такие параметры должны располагаться после обязательных.
def power(base, exponent=2):
return base ** exponent
print(power(3)) # использует exponent=2
print(power(3, 3)) # явное значение exponentPython аргументы строки (аргументы строки в python (командная строка))
9 27
аргумент метода python (аргументы метода python)
Опасная ловушка: значение по умолчанию вычисляется один раз при определении функции. Для изменяемых объектов (например, списков) это приводит к накоплению изменений между вызовами. Решение - использовать None и создавать новый объект внутри функции.
# НЕПРАВИЛЬНО
def append_to_list(value, lst=[]):
lst.append(value)
return lst
print(append_to_list(1))
print(append_to_list(2))
# ПРАВИЛЬНО
def append_to_list(value, lst=None):
if lst is None:
lst = []
lst.append(value)
return lst
print(append_to_list(1))
print(append_to_list(2))Python args (аргументы в python)
[1] [1, 2] [1] [2]
именованные аргументы функции python (именованные аргументы функции python)
Как передать произвольное количество позиционных аргументов?
*args (упаковка позиционных аргументов в кортеж)
Если количество аргументов заранее неизвестно, используется звёздочка перед именем параметра. Внутри функции все переданные позиционные аргументы становятся кортежем.
def sum_all(*numbers):
return sum(numbers)
print(sum_all(1, 2, 3, 4))именованные аргументы python (именованные аргументы python)
10
количество аргументов функции python (количество аргументов функции python)
Путаница: *args можно использовать только как последний позиционный параметр (если только не используется **kwargs). Нельзя передать дополнительные позиционные аргументы после *args.
Как передать произвольное количество именованных аргументов?
**kwargs (упаковка именованных аргументов в словарь)
Две звёздочки перед именем параметра собирают все переданные именованные аргументы в словарь. Это полезно для функций-обёрток или настроек.
def print_settings(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_settings(host="localhost", port=8080, debug=True)параметры и аргументы функции python (параметры и аргументы функции python)
host: localhost port: 8080 debug: True
Python передать аргументы (передача аргументов в python)
Ошибка: **kwargs должен быть последним в списке параметров. Если после него указать ещё один именованный параметр - SyntaxError.
Как передать изменяемый объект и не изменить оригинал?
Передача по ссылке и копирование
В Python все параметры передаются по ссылке (точнее, по значению ссылки). Изменение изменяемых объектов внутри функции влияет на внешнюю переменную. Чтобы избежать этого, нужно создавать копию.
def add_item(item, lst):
lst = lst.copy() # или lst[:]
lst.append(item)
return lst
original = [1, 2]
new = add_item(3, original)
print(original)
print(new)Python принять аргументы (приём аргументов в python)
[1, 2] [1, 2, 3]
Частая ошибка - забыть скопировать список и затем удивляться, что исходный список изменился. Для неизменяемых типов (int, str, tuple) такой проблемы нет, так как операция «изменения» фактически создаёт новый объект.
Расширенные примеры передачи параметров
1. Объединение *args и **kwargs в одной функции
def wrapper(*args, **kwargs):
print("Позиционные:", args)
print("Именованные:", kwargs)
wrapper(1, 2, 3, name="Alice", age=30)
Позиционные: (1, 2, 3)
Именованные: {'name': 'Alice', 'age': 30}
2. Использование * для разделения позиционных и только именованных параметров (Python 3+)
После * все параметры становятся именованными (keyword-only).
def compare(a, b, *, key=lambda x: x):
return key(a) > key(b)
# compare(5, 3, key=abs) - правильно
# compare(5, 3, abs) - ошибка, abs должен быть именованным
print(compare(5, 3, key=abs))
True
3. Распаковка последовательностей и словарей при вызове функции
def multiply(x, y, z):
return x * y * z
# распаковка списка/кортежа через *
values = [2, 3, 4]
print(multiply(*values))
# распаковка словаря через **
data = {'x': 2, 'y': 3, 'z': 4}
print(multiply(**data))
24 24
4. Функция с аннотациями типов для параметров
Аннотации не влияют на выполнение, но помогают статическим анализаторам и документируют код.
def greeting(name: str, times: int = 1) -> str:
return (name + " ") * times
print(greeting("Привет", 3))
print(greeting.__annotations__)
Привет Привет Привет
{'name': str, 'times': int, 'return': str}
5. Передача функции как аргумента (callback)
def apply(func, *args, **kwargs):
return func(*args, **kwargs)
def square(x):
return x ** 2
print(apply(square, 5))
print(apply(sum, [1,2,3]))
25 6
6. Параметр с изменяемым значением по умолчанию - проблема и её исправление
# Проблемный вариант (накопление)
def add_person(name, persons=[]):
persons.append(name)
return persons
print(add_person("Alice"))
print(add_person("Bob"))
# Исправленный вариант
def add_person(name, persons=None):
if persons is None:
persons = []
persons.append(name)
return persons
print(add_person("Alice"))
print(add_person("Bob"))
['Alice'] ['Alice', 'Bob'] ['Alice'] ['Bob']
7. Использование *args для передачи произвольного количества аргументов в функцию, ожидающую фиксированное число
def show(a, b, c):
return a + b + c
values = (10, 20, 30)
print(show(*values)) # распаковка кортежа
60
8. Частичное применение (functools.partial) с передачей фиксированных аргументов
from functools import partial
def power(base, exp):
return base ** exp
square = partial(power, exp=2)
cube = partial(power, exp=3)
print(square(4))
print(cube(4))
16 64