Найти тему
Удалёнка

Функции в Python

Оглавление

Создание функции

Существуют некоторые правила для создания функций в Python.

  • Блок функции начинается с ключевого слова def, после которого следуют название функции и круглые скобки ( () ).
  • Любые аргументы, которые принимает функция должны находиться внутри этих скобок.
  • После скобок идет двоеточие ( : ) и с новой строки с отступом начинается тело функции.

Пример функции в Python:

?

1

2

def my_function(argument):

print argument

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

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

Например:

?

1

my_function("abracadabra")

Аргументы функции в Python

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

  • Обязательные аргументы (Required arguments)
  • Аргументы-ключевые слова (Keyword argument)
  • Аргументы по умолчанию (Default argument)
  • Аргументы произвольной длины (Variable-length argumens)

Обязательные аргументы функции:

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

Например:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

def bigger(a,b):

if a > b:

print a

else:

print b

# В описании функции указано, что она принимает 2 аргумента

# Корректное использование функции

bigger(5,6)

# Некорректное использование функции

bigger()

bigger(3)

bigger(12,7,3)

Аргументы - ключевые слова

Аргументы - ключевые слова используются при вызове функции. Благодаря ключевым аргументам, вы можете задавать произвольный (то есть не такой каким он описа при создании функции) порядок аргументов.

Например:

?

1

2

3

4

5

6

def person(name, age):

print name, "is", age, "years old"

# Хотя в описании функции первым аргументом идет имя, мы можем вызвать функцию вот так

person(age=23, name="John")

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

Аргумент по умолчанию, это аргумент, значение для которого задано изначально, при создании функции.

Например:

?

1

2

3

4

5

6

7

8

9

10

def space(planet_name, center="Star"):

print planet_name, "is orbiting a", center

# Можно вызвать функцию space так:

space("Mars")

# В результате получим: Mars is orbiting a Star

# Можно вызвать функцию space иначе:

space("Mars", "Black Hole")

# В результате получим: Mars is orbiting a Black Hole

Аргументы произвольной длины

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

Например:

?

1

2

3

4

5

6

7

def unknown(*args):

for argument in args:

print argument

unknown("hello","world") # напечатает оба слова, каждое с новой строки

unknown(1,2,3,4,5) # напечатает все числа, каждое с новой строки

unknown() # ничего не выведет

Ключевое слово return

Выражение return прекращает выполнение функции и возвращает указанное после выражения значение. Выражение return без аргументов это то же самое, что и выражение return None. Соответственно, теперь становится возможным, например, присваивать результат выполнения функции какой либо переменной.

Например:

?

1

2

3

4

5

6

7

def bigger(a,b):

if a > b:

return a # Если a больше чем b, то возвращаем a и прекращаем выполнение функции

return b # Незачем использовать else. Если мы дошли до этой строки, то b, точно не меньше чем a

# присваиваем результат функции bigger переменной num

num = bigger(23,42)

Область видимости

Некоторые переменные скрипта могут быть недоступны некоторым областям программы. Все зависит от того, где вы объявили эти переменные.

В Python две базовых области видимости переменных:

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

Переменные объявленные внутри тела функции имеют локальную область видимости, те что объявлены вне какой-либо функции имеют глобальную область видимости.

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

Например:

?

1

2

3

4

5

6

7

8

9

10

11

12

# глобальная переменная age

age = 44

def info():

print age # Печатаем глобальную переменную age

def local_info():

age = 22 # создаем локальную переменную age

print age

info() # напечатает 44

local_info() # напечатает 22

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

Например:

?

1

2

3

4

5

6

7

8

9

10

11

# глобальная переменная age

age = 13

# функция изменяющая глобальную переменную

def get_older():

global age

age += 1

print age # напечатает 13

get_older() # увеличиваем age на 1

print age # напечатает 14

Рекурсия

Рекурсией в программировании называется ситуация, в которой функция вызывает саму себя. Классическим примером рекурсии может послужить функция вычисления факториала числа.

Напомним, что факториалом числа, например, 5 является произведение всех натуральных (целых) чисел от 1 до 5. То есть, 1 * 2 * 3 * 4 * 5

Рекурсивная функция вычисления факториала на языке Python будет выглядеть так:

?

1

2

3

4

5

def fact(num):

if num == 0:

return 1 # По договоренности факториал нуля равен единице

else:

return num * fact(num - 1) # возвращаем результат произведения num и результата возвращенного функцией fact(num - 1)

Однако следует помнить, что использование рекурсии часто может быть неоправданным. Дело в том, что в момент вызова функции в оперативной памяти компьютера резервируется определенное количество памяти, соответственно чем больше функций одновременно мы запускаем - тем больше памяти потребуется, что может привести к переполнению стека (stack overflow) и программа завершится аварийно, не так как предполагалось. Учитывая это, там где это возможно, вместо рекурсии лучше применять циклы.

Рецепт создания функции в Python

Существует следующий алгоритм - рекомендация по созданию функции в Python. Например, мы создаем функцию вычисления площади прямоугольника.

  1. Начинать следует с примеров того, что делает функция, и подобрать подходящее название. В нашем случае это будет выглядеть так:?12345678# На данном этапе мы еще не указываем имена переменныхdef rectangle_area_finder( ):""">>> rectangle_area_finder(3, 5)15>>> rectangle_area_finder(17.2, 6)103.2"""
  2. Указать типы данных, которые принимает функция и тип данных, который она возвращает?12345678910# функция принимает два числа, а возвращает одноdef rectangle_area_finder( ):"""(num, num) -> num>>> rectangle_area_finder(3, 5)15>>> rectangle_area_finder(17.2, 6)103.2"""
  3. Подобрать подходящие названия для переменных?12345678910# Поскольку это математическая функция нам вполне подойдут имена a и bdef rectangle_area_finder(a, b):"""(num, num) -> num>>> rectangle_area_finder(3, 5)15>>> rectangle_area_finder(17.2, 6)103.2"""
  4. Написать краткое, но содержательное описание функции?1234567891011def rectangle_area_finder(a, b):"""(num, num) -> numReturns an area of a rectangle with given sides a and b.>>> rectangle_area_finder(3, 5)15>>> rectangle_area_finder(17.2, 6)103.2"""
  5. Написать собственно тело функции?123456789101112def rectangle_area_finder(a, b):"""(num, num) -> numReturns an area of a rectangle with given sides a and b.>>> rectangle_area_finder(3, 5)15>>> rectangle_area_finder(17.2, 6)103.2"""return a * b
  6. Функция готова! Осталось вызвать ее с указанными в примерах аргументами
-2

Как видно, при вызове команды help() с именем нашей функции в качестве аргумента мы получаем написанную нами документацию.

-3