Основы передачи параметров в функциях языка Python

Раздел: Основы 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))   # явное значение exponent

Python аргументы строки (аргументы строки в 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) такой проблемы нет, так как операция «изменения» фактически создаёт новый объект.

- Python функция в качестве аргумента (функция как аргумент в python)
- Python return value (возвращаемое значение функции в python)
- абсолютное значение python (абсолютное значение в python)

Расширенные примеры передачи параметров

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

Передача параметров в функцию в Python - comments

En
Python передача параметров (python)