Функции в Python3
Функция — это организованный, многократно используемый блок кода, предназначенный для реализации одной или связанной функциональности.
Функции повышают модульность приложений и коэффициент повторного использования кода. Вы уже знаете, что Python предоставляет множество встроенных функций, таких как print(). Но вы также можете создавать собственные функции, которые называются пользовательскими функциями.
Определение функции
Вы можете определить функцию с нужной вам функциональностью. Вот простые правила:
- Блок кода функции начинается с ключевого словаdef, за которым следуют имя идентификатора функции и круглые скобки.()。
- Любые входные параметры и аргументы должны быть помещены в круглые скобки; круглые скобки можно использовать для определения параметров.
- Первым оператором функции необязательно может быть docstring — он используется для хранения описания функции.
- Тело функции начинается с двоеточия:и имеет отступ.
- return [expression]Завершает функцию, необязательно возвращая значение вызывающему коду. return без выражения эквивалентен возврату None.

Синтаксис
Python определяет функции с помощью ключевого слова def; общий формат выглядит следующим образом:
def 函数名(参数列表):
函数体
По умолчанию значения параметров и имена параметров сопоставляются в порядке, определённом в объявлении функции.
Пример
Давайте используем функцию для вывода "Hello World!":
def hello() :
print("Hello World!")
привет()
Более сложное приложение: добавление переменных-параметров в функцию:
Пример (Python 3.0+)
Сравните два числа и верните большее:
Вывод приведенного выше примера:
5
Пример (Python 3.0+)
Функция для вычисления площади:
Вывод приведенного выше примера:
Welcome Example width = 4 height = 5 area = 20
Вызов функции
Определение функции: даёт функции имя, задаёт параметры, включённые в функцию, и структуру блока кода.
После того как базовая структура этой функции завершена, вы можете выполнить её, вызвав из другой функции или напрямую из командной строки Python.
В следующем примере вызывается функцияprintme():
Пример (Python 3.0+)
Вывод приведенного выше примера:
I want to call a user-defined function! Call the same function again.
Передача параметров
В Python типы принадлежат объектам; объекты имеют разные типы, а переменные не имеют типа:
a=[1,2,3] a="Example"
В приведённом выше коде,[1,2,3]имеет тип List,"Example"имеет тип String, тогда как переменная a не имеет типа. Это всего лишь ссылка на объект (указатель), и она может указывать либо на объект типа List, либо на объект типа String.
Изменяемые и неизменяемые объекты
В Python строки, кортежи и числа являются неизменяемыми объектами, тогда как list, dict и т. д. — изменяемыми объектами.
Неизменяемые типы:Присваивание переменнойa=5затем снова присваиваемa=10Здесь фактически создаётся новый объект значения int 10, затем a заставляют указывать на него, а 5 отбрасывается. Это не изменяет значение a; это эквивалентно созданию a заново.
Изменяемые типы:Присваивание переменнойla=[1,2,3,4]затем снова присваиваемla[2]=5Это изменяет значение третьего элемента списка la; сам la не перемещается, изменяются только некоторые его внутренние значения.
Передача параметров в функциях Python:
Неизменяемые типы:Подобно передаче по значению в C++, например целые числа, строки, кортежи. Например, fun(a) передаёт только значение a, не влияя на сам объект a. Если значение a изменяется внутри fun(a), создаётся новый объект для a.
Изменяемые типы:Подобно передаче по ссылке в C++, например списки, словари. Например, fun(la) действительно передаёт la; после изменения la вне fun также изменяется.
В Python всё является объектом. Строго говоря, нельзя говорить «передача по значению» или «передача по ссылке»; следует говорить о передаче неизменяемых объектов и передаче изменяемых объектов.
Пример передачи неизменяемых объектов в Python
С помощью функцииid()для проверки изменения адреса памяти:
Пример (Python 3.0+)
Вывод приведенного выше примера:
4379369136 4379369136 4379369424
Видно, что до и после вызова функции формальный параметр и фактический параметр указывают на один и тот же объект (id объекта совпадает). После изменения формального параметра внутри функции формальный параметр указывает на другой id.
Пример передачи изменяемого объекта
Если параметр изменяемого объекта изменяется внутри функции, то в функции, вызвавшей эту функцию, исходный параметр также изменяется. Например:
Пример (Python 3.0+)
Объект, переданный в функцию, и объект, к которому в конце добавляется новое содержимое, используют одну и ту же ссылку. Поэтому вывод выглядит следующим образом:
函数内取值: [10, 20, 30, [1, 2, 3, 4]] 函数外取值: [10, 20, 30, [1, 2, 3, 4]]
Parameters
Ниже перечислены типы формальных параметров, которые можно использовать при вызове функции:
- Обязательные параметры
- Именованные аргументы
- Параметры по умолчанию
- Параметры переменной длины
Обязательные параметры
Обязательные параметры должны передаваться в функцию в правильном порядке. Количество при вызове должно совпадать с количеством при объявлении.
Чтобы вызвать функцию printme(), необходимо передать один параметр; иначе возникнет синтаксическая ошибка:
Пример (Python 3.0+)
Вывод приведенного выше примера:
Traceback (most recent call last):
File "test.py", line 10, in <module>
printme()
TypeError: printme() missing 1 required positional argument: 'str'
Именованные аргументы
Именованные аргументы тесно связаны с вызовами функций. Вызовы функций используют именованные аргументы для определения передаваемых значений параметров.
Использование именованных аргументов позволяет порядку параметров в вызове функции отличаться от порядка в объявлении, потому что интерпретатор Python может сопоставлять значения параметров по имени параметра.
В следующем примере используются имена параметров при вызове функции printme():
Пример (Python 3.0+)
Вывод приведенного выше примера:
Example
Следующий пример демонстрирует, что использование параметров функции не требует заданного порядка:
Пример (Python 3.0+)
Вывод приведенного выше примера:
名字: example 年龄: 50
Параметры по умолчанию
При вызове функции, если аргумент не передан, используется параметр по умолчанию. В следующем примере, если аргумент age не передан, используется значение по умолчанию:
Пример (Python 3.0+)
Вывод вышеприведённого примера:
名字: example 年龄: 50 ------------------------ 名字: example 年龄: 35
Параметры переменной длины
Возможно, вам понадобится функция, которая может обрабатывать больше аргументов, чем было объявлено изначально. Такие аргументы называются параметрами переменной длины. В отличие от двух типов параметров, упомянутых выше, они не именуются при объявлении. Базовый синтаксис выглядит следующим образом:
def functionname([formal_args,] *var_args_tuple ): "函数_文档字符串" function_suite return [expression]
При добавлении звёздочки*параметры принимаются как кортеж, сохраняя все неименованные переменные параметры.
Пример (Python 3.0+)
Вывод вышеприведённого примера:
输出: 70 (60, 50)Если при вызове функции не указано ни одного аргумента, это пустой кортеж. Мы также можем не передавать в функцию неименованные переменные. Как в следующем примере:
Пример (Python 3.0+)
Вывод вышеприведённого примера:
输出: 10 输出: 70 60 50
Также существует случай, когда параметры имеют две звёздочки**Базовый синтаксис выглядит так:
def functionname([formal_args,] **var_args_dict ): "函数_文档字符串" function_suite return [expression]
При добавлении двух звёздочек**параметры принимаются как словарь.
Пример (Python 3.0+)
Вывод вышеприведённого примера:
输出:
1
{'a': 2, 'b': 3}
При объявлении функции звёздочка в параметрах*может стоять отдельно, например:
def f(a,b,*,c):
return a+b+c
Если звёздочка стоит отдельно*, то параметры после звёздочки*должны передаваться по ключевому слову:
>>> def f(a,b,*,c): ... return a+b+c ... >>> f(1,2,3) # 报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: f() takes 2 positional arguments but 3 were given >>> f(1,2,c=3) # 正常 6 >>>
Анонимные функции
Python используетlambdaдля создания анонимных функций.
Так называемая анонимность означает, что больше не используетсяdefстандартная форма инструкции def для определения функции.
- lambda— это всего лишь выражение, а тело функцииdefнамного проще, чем def.
- Тело lambda — это выражение, а не блок кода. В lambda-выражении можно инкапсулировать лишь ограниченную логику.
- Лямбда-функции имеют собственное пространство имён и не могут обращаться к параметрам вне своего списка аргументов или в глобальном пространстве имён.
- Хотя лямбда-функция выглядит так, будто её можно записать только в одну строку, она не эквивалентна встраиваемой функции в C или C++. Цель встраиваемых функций — избежать занятия стековой памяти при вызове небольших функций, тем самым снижая накладные расходы на вызовы функций и повышая скорость выполнения кода.
Синтаксис
Синтаксис лямбда-функции содержит только один оператор, как показано ниже:
lambda [arg1 [,arg2,.....argn]]:expression
Задать параметр a плюс 10:
Пример
Вывод вышеприведённого примера:
15
В следующем примере задаётся анонимная функция с двумя параметрами:
Пример (Python 3.0+)
Вывод вышеприведённого примера:
相加后的值为 : 30 相加后的值为 : 40
Мы можем инкапсулировать анонимную функцию внутри функции, чтобы один и тот же код можно было использовать для создания нескольких анонимных функций.
В следующем примере анонимная функция инкапсулируется в функции myfunc, что позволяет создавать разные анонимные функции, передавая разные параметры:
Пример
Вывод вышеприведённого примера:
22 33
Для получения дополнительной информации об анонимных функциях вы также можете обратиться к:Python lambda (анонимные функции)
Оператор return
return [expression]Оператор используется для выхода из функции и выборочного возврата выражения вызывающей стороне. Оператор return без аргумента возвращает None. В предыдущих примерах не было показано, как вернуть значение; следующий пример демонстрирует использование оператора return:
Пример (Python 3.0+)
Вывод вышеприведённого примера:
函数内 : 30 函数外 : 30
Только позиционные параметры
Python 3.8 добавляет синтаксис параметров функции /, чтобы указать, что параметры функции должны использовать указанные позиционные параметры и не могут использовать ключевые аргументы.
В следующем примере параметры a и b должны быть указаны как позиционные аргументы, c или d могут быть позиционными или ключевыми параметрами, а e и f должны быть ключевыми параметрами:def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
Следующее использование корректно:
f(10, 20, 30, d=40, e=50, f=60)
Следующее использование вызовет ошибку:
f(10, b=20, c=30, d=40, e=50, f=60) # b 不能使用关键字参数的形式 f(10, 20, 30, 40, 50, f=60) # e 必须使用关键字参数的形式Другие расширения