Повторное использование одного и того же кода требуется много раз в пределах одной программы. Функции помогают нам это делать. Мы записываем действия, которые должны выполняться повторно, в функцию, а затем вызываем её везде, где это необходимо. Мы уже видели встроенные функции, такие как len(), divmod().
Определение функции
Мы используем ключевое слово def для определения функции. Общая синтаксис выглядит так:
def functionname(params):
statement1
statement2
Давайте напишем функцию, которая будет принимать два целых числа в качестве входных данных и затем возвращать их сумму.
>>> def sum(a, b):
... return a + b
Во второй строке с ключевым словом return мы возвращаем значение a + b вызывающему объекту. Вы должны вызвать его следующим образом:
>>> res = sum(234234, 34453546464)
>>> res
34453780698L
Помните программу проверки палиндрома, которую мы написали в прошлой главе. Давайте напишем функцию, которая будет проверять, является ли заданная строка палиндромом, и затем возвращать True или False.
#!/usr/bin/env python3
def palindrome(s):
return s == s[::-1]
if __name__ == '__main__':
s = input("Enter a string: ")
if palindrome(s):
print("Yay a palindrome")
else:
print("Oh no, not a palindrome")
Теперь запустите код :)
Локальные и глобальные переменные
Чтобы понять локальные и глобальные переменные, мы рассмотрим два примера.
#!/usr/bin/env python3
def change(b):
a = 90
print(a)
a = 9
print("Перед вызовом функции ", a)
print("внутри функции change", end=' ')
change(a)
print("После вызова функции ", a)
Вывод
$ ./local.py
Перед вызовом функции 9
внутри функции change 90
После вызова функции 9
Сначала мы присваиваем 9 переменной a, затем вызываем функцию change, внутри которой присваиваем 90 переменной a и выводим a. После вызова функции мы снова выводим значение a. Когда мы пишем a = 90 внутри функции, на самом деле создается новая переменная с именем a, которая доступна только внутри функции и будет уничтожена после завершения функции. Таким образом, хотя имя переменной a одинаково, они различаются внутри и вне функции.
#!/usr/bin/env python3
def change(b):
global a
a = 90
print(a)
a = 9
print("Перед вызовом функции ", a)
print("внутри функции change", end=' ')
change(a)
print("После вызова функции ", a)
Здесь, используя ключевое слово global, мы указываем, что a определено глобально, поэтому когда мы изменяем значение a внутри функции, это фактически изменяет значение a и вне функции.
Значение аргумента по умолчанию
В функции переменные могут иметь значения аргументов по умолчанию, что означает, что если мы не предоставим значение для этой конкретной переменной, оно будет назначено автоматически.
>>> def test(a , b=-99):
... if a > b:
... return True
... else:
... return False
В приведенном выше примере мы написали b = -99 в списке параметров функции. Это означает, что если значение для b не задано, то значение b будет -99. Это очень простой пример аргументов по умолчанию. Вы можете протестировать код следующим образом:
>>> test(12, 23)
False
>>> test(12)
True
Важно
Помните, что вы не можете иметь аргумент без значения по умолчанию, если перед ним уже есть аргумент со значением по умолчанию. Например, f(a, b=90, c) является незаконным, так как b имеет значение по умолчанию, но после него c не имеет значения по умолчанию.
Также помните, что значение по умолчанию вычисляется только один раз, поэтому если у вас есть изменяемый объект, такой как список, это может иметь значение. Смотрите следующий пример:
>>> def f(a, data=[]):
... data.append(a)
... return data
...
>>> print f(1)
[1]
>>> print f(2)
[1, 2]
>>> print f(3)
[1, 2, 3]
Чтобы избежать этого, вы можете написать более идиоматический Python, например, следующий:
>>> def f(a, data=None):
... if data is None:
... data = []
... data.append(a)
... return data
...
>>> print f(1)
[1]
>>> print f(2)
[2]
Примечание
Для более глубокого понимания прочитайте эту ссылку .
Аргументы по ключевым словам
>>> def func(a, b=5, c=10):
... print('a is', a, 'and b is', b, 'and c is', c)
...
>>> func(12, 24)
a is 12 and b is 24 and c is 10
>>> func(12, c = 24)
a is 12 and b is 5 and c is 24
>>> func(b=12, c = 24, a = -1)
a is -1 and b is 12 and c is 24
В приведенном выше примере видно, что мы вызываем функцию с именами переменных, например func(12, c = 24), тем самым присваивая 24 переменной c, а b получает свое значение по умолчанию. Также помните, что после аргумента по ключевому слову не может идти аргумент без ключевого слова, как в следующем примере:
>>> def func(a, b=13, v):
... print(a, b, v)
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
Аргумент только по ключевому слову
Мы также можем пометить аргументы функции как только по ключевому слову. Таким образом, при вызове функции пользователь будет вынужден использовать правильное ключевое слово для каждого параметра.
>>> def hello(*, name='User'):
... print("Hello %s" % name)
...
>>> hello('Kushal')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: hello() takes 0 positional arguments but 1 was given
>>> hello(name='Kushal')
Hello Kushal
Примечание
Для более подробного изучения прочитайте PEP-3102 .
Докстринги
В Python мы используем докстринги для объяснения того, как использовать код, это будет полезно в интерактивном режиме и для создания автоматической документации. Ниже мы видим пример докстринга для функции под названием longest_side.
#!/usr/bin/env python3
import math
def longest_side(a, b):
"""
Функция для нахождения длины самой длинной стороны прямоугольного треугольника.
:arg a: Сторона a треугольника
:arg b: Сторона b треугольника
:return: Длина самой длинной стороны c как float
"""
return math.sqrt(a*a + b*b)
if __name__ == '__main__':
print(longest_side(4, 5))
Мы узнаем больше о докстрингах в главе о reStructuredText.
Функция высшего порядка
Функция высшего порядка или функтор — это функция, которая выполняет хотя бы одно из следующих действий внутри:
- Принимает одну или несколько функций в качестве аргумента.
- Возвращает другую функцию в качестве вывода.
В Python любая функция может выступать в роли функции высшего порядка.
>>> def high(func, value):
... return func(value)
...
>>> lst = high(dir, int)
>>> print(lst[-3:])
['imag', 'numerator', 'real']
>>> print(lst)
Примечание
Для более подробной информации прочитайте эту ссылку .
функция map
map — это очень полезная функция высшего порядка в Python. Она принимает одну функцию и итератор в качестве входных данных, затем применяет функцию к каждому значению итератора и возвращает список результатов.
Пример:
>>> lst = [1, 2, 3, 4, 5]
>>> def square(num):
... "Возвращает квадрат заданного числа."
... return num * num
...
>>> print(map(square, lst))
[1, 4, 9, 16, 25]