Параметры функции

Последнее обновление: 16.01.2022

Функция может принимать параметры. Через параметры в функцию можно передавать данные. Банальный пример - функция print(), которая с помощью параметра принимает значение, выводимое на консоль.

Теперь определим и используем свою функцию с параметрами:

def say_hello(name):
    print(f"Hello, {name}")

say_hello("Tom")
say_hello("Bob")
say_hello("Alice")

Функция say_hello имеет параметр name, и при вызове функции мы можем передать этому параметру какой-либо значение. Внутри функции мы можем использовать параметр как обычную переменную, например, вывести значение этого параметра на консоль функцией print. Так, в выражении:

say_hello("Tom")

Строка "Tom" будет передаваться параметру name. В итоге при выполнении программы мы получим следующий консольный вывод:

Hello, Tom
Hello, Bob
Hello, Alice

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

def print_person(name, age):
    print(f"Name: {name}")
    print(f"Age: {age}")


print_person("Tom", 37)

Здесь функция print_person принимает два параметра: name и age. При вызове функции:

print_person("Tom", 37)

Первое значение - "Tom" передается первому параметру, то есть параметру name. Второе значение - 37 передается второму параметру - age. И внутри функции значения параметров выводятся на консоль:

Name: Tom
Age: 37

Значения по умолчанию

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

def say_hello(name="Tom"):
    print(f"Hello, {name}")


say_hello()         # здесь параметр name будет иметь значение "Tom"
say_hello("Bob")    # здесь name = "Bob"

Здесь параметр name является необязательным. И если мы не передаем при вызове функции для него значение, то применяется значение по умолчанию, то есть строка "Tom". Консольный вывод данной программы:

Hello, Tom
Hello, Bob

Если функция имеет несколько параметров, то необязательные параметры должны идти после обязательных. Например:

def print_person(name, age = 18):
    print(f"Name: {name}  Age: {age}")


print_person("Bob")
print_person("Tom", 37)

Здесь параметр age является необязательным и по умолчанию имеет значение 18. Перед ним расположен обязательный параметр name. Поэтому при вызове функции мы можем не передавать значение параметру age, но параметру name передать значение необходимо.

При необходимости мы можем сделать все параметры необязательными:

def print_person(name = "Tom", age = 18):
    print(f"Name: {name}  Age: {age}")


print_person()              # Name: Tom  Age: 18
print_person("Bob")         # Name: Bob  Age: 18
print_person("Sam", 37)     # Name: Sam  Age: 37

Передача значений параметрам по имени. Именованные параметры

В примерах выше при вызове функции значения передаются параметрами функции по позиции. Но также можно передавать значения параметрам по имени. Для этого при вызове функции указывается имя параметра и ему присваивается значение:

def print_person(name, age):
    print(f"Name: {name}  Age: {age}")


print_person(age = 22, name = "Tom")

В данном случае значения параметрам age и name передаются по имени. И несмотря на то, что параметр name идет первым в определении функции, мы можем при вызове функции написать print_person(age = 22, name = "Tom") и таким образом передать число 22 параметру age, а строку "Tom" параметру name.

Символ * позволяет установить, какие параметры будут именнованными - то есть такие параметры, которым можно передать значения только по имени. Все параметры, которые располагаются справа от символа *, получают значения только по имени:

def print_person(name, *,  age, company):
    print(f"Name: {name}  Age: {age}  Company: {company}")


print_person("Bob", age = 41, company ="Microsoft")    # Name: Bob  Age: 41  company: Microsoft

В данном случае параметры age и company являются именнованными.

Можно сделать все параметры именнованными, поставив перед списком параметров символ *:

def print_person(*,  name, age, company):
    print(f"Name: {name}  Age: {age}  Company: {company}")

Если наоборот надо определить параметры, которым можно передавать значения только по позиции, то есть позиционные параметры, то можно использовать символ /: все параметры, которые идут до символа / , являются позиционными и могут получать значения только по позиции

def print_person(name, /, age, company="Microsoft"):
    print(f"Name: {name}  Age: {age}  Company: {company}")


print_person("Tom", company="JetBrains", age = 24)     # Name: Tom  Age: 24  company: JetBrains
print_person("Bob", 41)                 # Name: Bob  Age: 41  company: Microsoft

В данном случае параметр name является позиционным.

Для одной функции можно определять одновременно позиционные и именнованные параметры.

def print_person(name, /,  age = 18, *, company):
    print(f"Name: {name}  Age: {age}  Company: {company}")


print_person("Sam", company ="Google")               # Name: Sam  Age: 18  company: Google
print_person("Tom", 37, company ="JetBrains")        # Name: Tom  Age: 37  company: JetBrains
print_person("Bob", company ="Microsoft", age = 42)  # Name: Bob  Age: 42  company: Microsoft

В данном случае параметр name располагается слева от символа /, поэтому является позиционным и обязательным - ему можно передать значение только по позиции.

Параметр company является именнованным, так как располагается справа от символа *. Параметр age может получать значение по имени и по позиции.

Неопределенное количество параметров

С помощью символа звездочки можно определить параметр, через который можно передавать неопределенное количество значений. Это может быть полезно, когда мы хотим, чтобы функция получала несколько значений, но мы точно не знаем, сколько именно. Например, определим функцию подсчета суммы чисел:

def sum(*numbers):
    result = 0
    for n in numbers:
        result += n
    print(f"sum = {result}")


sum(1, 2, 3, 4, 5)		# sum = 15
sum(3, 4, 5, 6)			# sum = 18

В данном случае функция sum принимает один параметр - *numbers, но звездочка перед названием параметра указывает, что фактически на место этого параметра мы можем передать неопределенное количество значений или набор значений. В самой функции с помощью цикла for можно пройтись по этому набору, получить каждое значение из этого набора в переменную n и произвести с ним какие-нибудь действия. Например, в данном случае вычисляется сумма переданных чисел.

Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850