В предыдущих примерах данной книги использовались встроенные функции языка Python, такие, как, например, print(). Однако в большинстве программ на языке Python может содержаться значительное число пользовательских функций, вызываемых по мере необходимости. Пользовательскую функцию можно создать, используя ключевое слово def (definition), после которого следует выбранное вами имя функции и скобки. В качестве имени для своей функции программист может выбирать любой идентификатор за исключением ключевых слов языка Python, а также существующих имен встроенных функций. Строка с определением функции обязана заканчиваться символом двоеточия. Инструкции, которые должны выполняться при вызове функции (тело функции), располагаются на строках ниже с использованием отступа.

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

Как и встроенная в Python функция str(), которая возвращает числовое представление значения указанного в ней аргумента, пользовательская функция также может возвращать значения тому оператору, который ее вызвал. Это выполняется с помощью ключевого слова return с указанием после него возвращаемого значения. 

#Если значение меньше нуля, то закончить работу функции
def fun(a):
    while True:
        print(a)
        a -= 1
        if a < 0: return

fun(10)    

"""
возвращаемое значение:
10
9
8
7
6
5
4
3
2
1
0
"""

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

В языке Python существует ключевое слово pass, которое используется в качестве временной заглушки (заполнителя) и может быть добавлено в те места кода, куда впоследствии надо вставить какие-нибудь строки. Ключевое слово pass является «пустым», то есть не делает ничего. Данная возможность позволяет запускать еще не завершенные программы в целях отладки и исправления синтаксиса.

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

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

Те части программы на языке Python, в которых возможно появление ошибок, например работающие с пользовательским вводом, разрешается заключать в специальные блоки try-except, с помощью которых можно обрабатывать «исключительные ситуации». Инструкции, которые способны вызвать ошибки при выполнении, группируются в блок try, а те команды, которым предстоит обрабатывать эти ошибки, — в последующий блок except. После него может стоять необязательный блок finally, где содержатся инструкции, выполняющиеся после того, как все исключения будут обработаны.