Создание функции:
Код функций, которые используются в этом подразделе, можно скопировать из файла create_func.py
Пример функции:
In [1]: def open_file( filename ): ...: """Documentation string""" ...: with open(filename) as f: ...: print(f.read()) ...:
Когда функция создана, она ещё ничего не выполняет. Только при вызыве функции действия, которые в ней перечислены, будут выполняться. Это чем-то похоже на ACL в сетевом оборудовании: при создании ACL в конфигурации, он ничего не делает до тех пор, пока не будет куда-то применен.
При вызове функции нужно указать её имя и передать аргументы, если нужно.
Параметры - это переменные, которые используются при создании функции.
Аргументы - это фактические значения (данные), которые передаются функции при вызове.
Эта функция в качестве аргумента ожидает имя файла и затем выводит содержимое файла:
In [2]: open_file('r1.txt') ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 ! In [3]: open_file('ospf.txt') router ospf 1 router-id 10.0.0.3 auto-cost reference-bandwidth 10000 network 10.0.1.0 0.0.0.255 area 0 network 10.0.2.0 0.0.0.255 area 2 network 10.1.1.0 0.0.0.255 area 0
Первая строка в определении функции - это docstring, строка документации. Это комментарий, который используется как описание функции. Его можно отобразить так:
In [4]: open_file.__doc__ Out[4]: 'Documentation string'
Лучше не лениться писать краткие комментарии, которые описывают работу функции. Например, описать, что функция ожидает на вход, какого типа должны быть аргументы и что будет на выходе. Кроме того, лучше написать пару предложений о том, что делает функция. Это очень поможет, когда через месяц-два Вы будете пытаться понять, что делает функция, которую Вы же написали.
Оператор return используется для прекращения работы функции, выхода из нее, и, как правило, возврата какого-то значения. Функция может возвращать любой объект Python.
Функция open_file в примере выше просто выводит на стандартный поток вывода содержимое файла. Но, чаще всего, от функции нужно получить результат её работы.
В данном случае, если присвоить вывод функции переменной result, результат будет таким:
In [5]: result = open_file('ospf.txt') router ospf 1 router-id 10.0.0.3 auto-cost reference-bandwidth 10000 network 10.0.1.0 0.0.0.255 area 0 network 10.0.2.0 0.0.0.255 area 2 network 10.1.1.0 0.0.0.255 area 0 In [6]: print(result) None
Переменная result равна None
. Так получилось из-за того, что функция ничего не возвращает. Она просто выводит сообщение на стандартный поток вывода.
Для того, чтобы функция возвращала значение, которое потом можно, например, присвоить переменной, используется оператор return
:
In [7]: def open_file( filename ): ...: """Documentation string""" ...: with open(filename) as f: ...: return f.read() ...: In [8]: result = open_file('r1.txt') In [9]: print(result) ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
Теперь в переменой result находится содержимое файла.
В реальной жизни практически всегда функция будет возвращать какое-то значение. Вместе с тем можно использовать выражение print, чтобы дополнительно выводить какие-то сообщения.
Ещё один важный аспект работы оператора return: выражения, которые идут после return, не выполняются.
То есть, в функции ниже, строка "Done" не будет выводиться, так как она стоит после return:
In [10]: def open_file( filename ): ...: print("Reading file", filename) ...: with open(filename) as f: ...: return f.read() ...: print("Done") ...: In [11]: result = open_file('r1.txt') Reading file r1.txt