Функции в Python3

Функция — это организованный, многократно используемый блок кода, предназначенный для реализации одной или связанной функциональности.

Функции повышают модульность приложений и коэффициент повторного использования кода. Вы уже знаете, что Python предоставляет множество встроенных функций, таких как print(). Но вы также можете создавать собственные функции, которые называются пользовательскими функциями.


Определение функции

Вы можете определить функцию с нужной вам функциональностью. Вот простые правила:

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


Синтаксис

Python определяет функции с помощью ключевого слова def; общий формат выглядит следующим образом:

def 函数名(参数列表):
    函数体

По умолчанию значения параметров и имена параметров сопоставляются в порядке, определённом в объявлении функции.

Пример

Давайте используем функцию для вывода "Hello World!":

#!/usr/bin/python3

def hello() :
    print("Hello World!")

привет()

Более сложное приложение: добавление переменных-параметров в функцию:

Пример (Python 3.0+)

Сравните два числа и верните большее:

#!/usr/bin/python3 def max(a, b): if a > b: return a else: return b a = 4 b = 5 print(max(a, b))

Вывод приведенного выше примера:

5

Пример (Python 3.0+)

Функция для вычисления площади:

#!/usr/bin/python3 # Функция для вычисления площади def area(width, height): return width * height def print_welcome(name): print("Welcome", name) print_welcome("Example") w = 4 h = 5 print("width =", w, " height =", h, " area =", area(w, h))

Вывод приведенного выше примера:

Welcome Example
width = 4  height = 5  area = 20

Вызов функции

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

После того как базовая структура этой функции завершена, вы можете выполнить её, вызвав из другой функции или напрямую из командной строки Python.

В следующем примере вызывается функцияprintme():

Пример (Python 3.0+)

#!/usr/bin/python3 # Определить функцию def printme( str ): # Вывести любую переданную строку print (str) return # Вызов функции printme("Я хочу вызвать пользовательскую функцию!") printme("Вызовите ту же функцию снова")

Вывод приведенного выше примера:

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+)

def change(a): print(id(a)) # Указывает на тот же объект a=10 print(id(a)) # Новый объект a=1 print(id(a)) change(a)

Вывод приведенного выше примера:

4379369136
4379369136
4379369424

Видно, что до и после вызова функции формальный параметр и фактический параметр указывают на один и тот же объект (id объекта совпадает). После изменения формального параметра внутри функции формальный параметр указывает на другой id.

Пример передачи изменяемого объекта

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

Пример (Python 3.0+)

#!/usr/bin/python3 # Описание изменяемой функции def changeme( mylist ): "Изменить переданный список." mylist.append([1,2,3,4]) print ("Значение внутри функции:", mylist) return # Вызов функции changeme mylist = [10,20,30] changeme( mylist ) print ("Значение вне функции:", mylist)

Объект, переданный в функцию, и объект, к которому в конце добавляется новое содержимое, используют одну и ту же ссылку. Поэтому вывод выглядит следующим образом:

函数内取值:  [10, 20, 30, [1, 2, 3, 4]]
函数外取值:  [10, 20, 30, [1, 2, 3, 4]]

Parameters

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

  • Обязательные параметры
  • Именованные аргументы
  • Параметры по умолчанию
  • Параметры переменной длины

Обязательные параметры

Обязательные параметры должны передаваться в функцию в правильном порядке. Количество при вызове должно совпадать с количеством при объявлении.

Чтобы вызвать функцию printme(), необходимо передать один параметр; иначе возникнет синтаксическая ошибка:

Пример (Python 3.0+)

#!/usr/bin/python3 # Описание изменяемой функции def printme( str ): "Напечатать любую переданную строку." print (str) return # Вызов функции printme; пропуск параметра приведёт к ошибке printme()

Вывод приведенного выше примера:

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+)

#!/usr/bin/python3 # Описание изменяемой функции def printme( str ): "Напечатать любую переданную строку." print (str) return # Вызов функции printme printme( str = "Учебный пример")

Вывод приведенного выше примера:

Example

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

Пример (Python 3.0+)

#!/usr/bin/python3 # Описание изменяемой функции def printinfo( name, age ): "Выводит любую переданную строку." print ("Имя:", name) print ("Возраст:", age) return # Вызов функции printinfo printinfo( age=50, name="пример" )

Вывод приведенного выше примера:

名字:  example
年龄:  50

Параметры по умолчанию

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

Пример (Python 3.0+)

#!/usr/bin/python3 # Описание функции def printinfo( name, age = 35 ): "Выводит любую переданную строку" print ("Имя:", name) print ("Возраст:", age) return # Вызов функции printinfo printinfo( age=50, name="example" ) print ("------------------------") printinfo( name="example" )

Вывод вышеприведённого примера:

名字:  example
年龄:  50
------------------------
名字:  example
年龄:  35

Параметры переменной длины

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

def functionname([formal_args,] *var_args_tuple ):
   "函数_文档字符串"
   function_suite
   return [expression]

При добавлении звёздочки*параметры принимаются как кортеж, сохраняя все неименованные переменные параметры.

Пример (Python 3.0+)

#!/usr/bin/python3 # Описание функции def printinfo( arg1, *vartuple ): "Вывести любые переданные аргументы" print ("Вывод:") print (arg1) print (vartuple) # Вызов функции printinfo printinfo( 70, 60, 50 )

Вывод вышеприведённого примера:

输出: 
70
(60, 50)
Если при вызове функции не указано ни одного аргумента, это пустой кортеж. Мы также можем не передавать в функцию неименованные переменные. Как в следующем примере:

Пример (Python 3.0+)

#!/usr/bin/python3 # Описание функции def printinfo( arg1, *vartuple ): "Вывести любые переданные аргументы" print ("Вывод:") print (arg1) for var in vartuple: print (var) return # Вызов функции printinfo printinfo( 10 ) printinfo( 70, 60, 50 )

Вывод вышеприведённого примера:

输出:
10
输出:
70
60
50

Также существует случай, когда параметры имеют две звёздочки**Базовый синтаксис выглядит так:

def functionname([formal_args,] **var_args_dict ):
   "函数_文档字符串"
   function_suite
   return [expression]

При добавлении двух звёздочек**параметры принимаются как словарь.

Пример (Python 3.0+)

#!/usr/bin/python3 # Описание функции def printinfo( arg1, **vardict ): "Вывести любые переданные аргументы" print ("Вывод:") print (arg1) print (vardict) # Вызов функции printinfo printinfo(1, a=2,b=3)

Вывод вышеприведённого примера:

输出: 
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:

Пример

x = lambda a : a + 10 print(x(5))

Вывод вышеприведённого примера:

15

В следующем примере задаётся анонимная функция с двумя параметрами:

Пример (Python 3.0+)

#!/usr/bin/python3 # Описание функции sum = lambda arg1, arg2: arg1 + arg2 # Вызов функции sum print ("Значение после сложения:", sum( 10, 20 )) print ("Значение после сложения:", sum( 20, 20 ))

Вывод вышеприведённого примера:

相加后的值为 :  30
相加后的值为 :  40

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

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

Пример

def myfunc(n): return lambda a : a * n mydoubler = myfunc(2) mytripler = myfunc(3) print(mydoubler(11)) print(mytripler(11))

Вывод вышеприведённого примера:

22
33

Для получения дополнительной информации об анонимных функциях вы также можете обратиться к:Python lambda (анонимные функции)


Оператор return

return [expression]Оператор используется для выхода из функции и выборочного возврата выражения вызывающей стороне. Оператор return без аргумента возвращает None. В предыдущих примерах не было показано, как вернуть значение; следующий пример демонстрирует использование оператора return:

Пример (Python 3.0+)

#!/usr/bin/python3 # Описание функции def sum( arg1, arg2 ): # Возвращает сумму двух параметров. total = arg1 + arg2 print ("Внутри функции :", total) return total # Вызов функции sum total = sum( 10, 20 ) print ("Вне функции :", total)

Вывод вышеприведённого примера:

函数内 :  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 必须使用关键字参数的形式
Другие расширения