Книга: PyNEng
Назад: 9. Функции
Дальше: Пространства имен. Области видимости

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

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

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

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

Код функций, которые используются в этом подразделе, можно скопировать из файла 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

Оператор 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 
Назад: 9. Функции
Дальше: Пространства имен. Области видимости