Функции Python

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

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


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

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

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

Синтаксис

def functionname( parameters ): "function_docstring" function_suite return [expression]

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

Пример

Ниже приведена простая функция Python, которая принимает строку в качестве входящего параметра и выводит её на стандартное устройство отображения.

Пример (Python 2.0+)

def printme( str ): "Выводит переданную строку на стандартное устройство отображения." print str return

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

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

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

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

Пример (Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- # Определение функции 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="Пример"

В приведённом выше коде,[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

Пример (Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- def ChangeInt( a ): a = 10 b = 2 ChangeInt(b) print b # Результат — 2

В примере есть объект int 2, и переменная, указывающая на него, — b. При передаче в функцию ChangeInt переменная b копируется способом передачи по значению, поэтому и a, и b указывают на один и тот же объект int. При a=10 создаётся новый объект значения int 10, и a начинает указывать на него.

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

Пример (Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- # Определение функции 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 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- # Определение функции def printme( str ): "Вывести любую переданную строку" print str return # Вызов функции printme printme()

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

Traceback (most recent call last):
  File "test.py", line 11, in <module>
    printme()
TypeError: printme() takes exactly 1 argument (0 given)

Именованные аргументы

Именованные аргументы тесно связаны с вызовами функций. Вызовы функций используют именованные аргументы для определения передаваемых значений параметров.

Использование именованных аргументов позволяет порядку параметров в вызове функции не совпадать с порядком в объявлении, потому что интерпретатор Python может сопоставлять значения параметров по именам параметров.

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

Пример (Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- # Определение функции def printme( str ): "Вывести любую переданную строку" print str return # Вызов функции printme printme( str = "Моя строка")

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

My string

В следующем примере более наглядно показано, что порядок именованных аргументов не имеет значения:

Пример (Python 2.0+)

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

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

Name:  miki
Age  50

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

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

Пример (Python 2.0+)

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

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

Name:  miki
Age  50
Name:  miki
Age  35

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

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

def functionname([formal_args,] *var_args_tuple ): "function_docstring" function_suite return [expression]

Имена переменных с префиксом в виде звёздочки (*) будут хранить все неименованные параметры переменной длины. Пример параметров переменной длины выглядит следующим образом:

Пример (Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- # Определение функции 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

Анонимные функции

Python использует lambda для создания анонимных функций.

  • Lambda — это просто выражение; тело функции гораздо проще, чем def.
  • Тело lambda — это выражение, а не блок кода. В lambda-выражении можно инкапсулировать только ограниченную логику.
  • Лямбда-функции имеют собственное пространство имён и не могут обращаться к параметрам вне своего списка параметров или в глобальном пространстве имён.
  • Хотя лямбда-функции кажутся записанными всего в одну строку, они не эквивалентны inline-функциям в C или C++, цель которых — избежать занятия стековой памяти при вызове небольших функций для повышения эффективности работы.

Синтаксис

Синтаксис лямбда-функции содержит только один оператор, как показано ниже:

lambda [arg1 [,arg2,.....argn]]:expression

Следующий пример:

Пример (Python 2.0+)

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

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

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

Оператор return

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

Пример (Python 2.0+)

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

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

函数内 :  30

Область видимости переменных

Не все переменные в программе доступны из любого места. Права доступа зависят от того, где переменная присвоена.

Область видимости переменной определяет, в какой части программы можно получить доступ к конкретному имени переменной. Две самые базовые области видимости переменных таковы:
  • Глобальные переменные
  • Локальные переменные

Глобальные и локальные переменные

Переменные, определённые внутри функции, имеют локальную область видимости, а определённые вне функции — глобальную область видимости.

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

Пример (Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- total = 0 # Это глобальная переменная # Описание функции def sum( arg1, arg2 ): # Возвращает сумму 2 параметров." total = arg1 + arg2 # здесь total — локальная переменная. print "Внутри функции это локальная переменная:", total return total # Вызов функции sum sum( 10, 20 ) print "Вне функции это глобальная переменная:", total

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

函数内是局部变量 :  30
函数外是全局变量 :  0
Другие расширения