English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
ВФункция, определенная пользователемВ статье мы изучили знания о определении функций и вызове функций. Если не懂 способа вызова функции, это может привести к непредсказуемым ошибкам. Вот пример.
def greet(name, msg): """Это функция для приветствия" У function name, msg два параметра print("Привет", name + ', ' + msg) greet("Monica", "доброе утро!")
Результат вывода
Привет, Monica, доброе утро!
Функция greet() имеет два аргумента.
Поскольку мы вызвали функцию с двумя аргументами, функция работает нормально и не вызывает ошибок.
Если вызывать функцию с разным количеством аргументов, интерпретатор покажет ошибку сообщения. Вот пример вызова функции, который демонстрирует ошибку при вызове с одним аргументом и без аргументов, а также сообщения об ошибках, которые они вызывают после выполнения.
>>> greet("Monica") TypeError: отсутствует 1 необходимый позиционный аргумент: 'msg'
>>> greet() # не переданы никакие параметры TypeError: greet() missing 2 required positional arguments: 'name' and 'msg'
До сих пор функция имела фиксированное количество параметров. В Python также есть другие методы для определения функций, которые могут принимать переменное количество параметров.
Давайте рассмотрим три различных формы этого типа.
В Python параметры функции могут иметь значение по умолчанию.
Мы можем использовать оператор присваивания (=) для предоставления значения по умолчанию для параметра. Вот пример.
def greet(name, msg = "早上好!"): """ Эта функция здоровается с тем, кто предоставляет сообщение. Если не предоставлено сообщение: по умолчанию будет "Утро доброе!" """ print("你好", name + ', ' + msg) greet("张三") greet("李四", "最近怎么样?")
Результат вывода
Привет, Захар Захарович, утро доброе! Привет, Ли Сихуа, как дела?
В этой функции параметр name не имеет значения по умолчанию, поэтому при вызове этой функции параметр name必须要 передаваться (обязательное условие).
С другой стороны, параметр msg имеет значение по умолчанию "Good morning!", поэтому при вызове функции можно не передавать значение. Если при вызове функции предоставляется значение, оно будет заменять значение по умолчанию.
Любое количество параметров функции может иметь значение по умолчанию. Но как только появляются параметры по умолчанию, все параметры справа также должны иметь значение по умолчанию.
Это означает, что параметры по умолчанию не могут следовать параметрам без умолчания. Например, если мы определим заголовок функции следующим образом:
def greet(msg = "Good morning!", name):
Мы получим следующее сообщение об ошибке:
SyntaxError: non-default argument follows default argument
Когда мы вызываем функцию с определенными значениями, эти значения присваиваются параметрам в зависимости от их положения.
Например, в функции greet() выше, когда мы ее вызываем как greet("Bruce", "How do you do?") значение "Bruce" присваивается параметруnameа "How do you do?" была присвоена переменной msg.
Python позволяет вызывать функции с помощью ключевых параметров. При вызове функции таким образом, порядок параметров (их положение) может быть изменен. Следующие вызовы этой функции также будут эффективны и приведут к одному и тому же результату.
# 2 ключевых параметра greet(name="Bruce", msg="How do you do?") # 2 ключевых параметра, порядок параметров изменен greet(msg="How do you do?", name="Bruce") # 1 позиционный параметр, 1 ключевой параметр greet("Bruce", msg="How do you do?")
Как мы видим, мы можем комбинировать позиционные и ключевые параметры при вызове функции. Но我们必须 помнить, что ключевые параметры должны следовать за позиционными.
Размещение позиционных параметров после ключевых параметров приводит к ошибке. Например, вызов функции выглядит так:
greet(name="Bruce","How do you do?")
Это приведет к ошибке:
SyntaxError: non-keyword arg after keyword arg
Иногда мы заранее не знаем, сколько параметров будет передано функции. Python позволяет нам обрабатывать这种情况 с помощью вызова функции с любым количеством параметров.
В определении функции мы используем звездочку (*) перед именем параметра, чтобы указать на такой параметр. Вот пример.
def greet(*names): """Этот функцией здороваются с Все в списке кортежей. """ # Имя - это кортеж с параметрами for name in names: print("Hello", name) greet("Monica", "Luke", "Steve", "John")
Результат вывода
Привет, Monica Привет, Luke Привет, Steve Привет, John
Здесь мы вызвали функцию с несколькими параметрами. Эти параметры перед передачей функции 包装成一个元组. Внутри функции мы используем цикл for, чтобы получить все параметры.