Перейти до змісту

Створення функції

Створення функції:

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

function

Приклад функції:

def configure_intf(intf_name, ip, mask):
    print("interface", intf_name)
    print("ip address", ip, mask)

Функція configure_intf створює конфігурацію інтерфейсу із зазначеним ім'ям та IP-адресою. Функція має три параметри: intf_name, ip, mask. При виклику функції ці параметри потраплять реальні дані.

Note

Коли функцію створено, вона ще нічого не виконує. Тільки під час виклику функції дії, які в ній перераховані, виконуватимуться. Це чимось схоже на ACL у мережевому устаткуванні: при створенні ACL у конфігурації він нічого не робить доти, доки не буде кудись застосований.

Виклик функції

Під час виклику функції необхідно вказати її ім'я та передати аргументи, якщо це необхідно.

Note

Параметри - це змінні, які використовуються під час створення функції. Аргументи - це фактичні значення (дані), що передаються функції під час виклику.

Функція configure_intf очікує на виклик три значення, тому що вона була створена з трьома параметрами:

In [2]: configure_intf("F0/0", "10.1.1.1", "255.255.255.0")
interface F0/0
ip address 10.1.1.1 255.255.255.0

In [3]: configure_intf("Fa0/1", "94.150.197.1", "255.255.255.248")
interface Fa0/1
ip address 94.150.197.1 255.255.255.248

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

Наприклад, функція sorted не просто виводить результат сортування на стандартний потік виведення, а повертає його, тому його можна зберегти змінну таким чином:

In [4]: items = [40, 2, 0, 22]

In [5]: sorted(items)
Out[5]: [0, 2, 22, 40] # (1)

In [6]: sorted_items = sorted(items)

In [7]: sorted_items
Out[7]: [0, 2, 22, 40]
  1. Рядок Out[5] в ipython показує, що функція/метод щось повертає і показує, що саме повертає.

Якщо спробувати записати в змінну результат функції configure_intf, в змінній виявиться значення None:

In [8]: result = configure_intf("Fa0/0", "10.1.1.1", "255.255.255.0")
interface Fa0/0
ip address 10.1.1.1 255.255.255.0

In [9]: print(result)
None

Щоб функція могла повертати якесь значення, необхідно використовувати оператор return.

Оператор return

Оператор return використовується для повернення якогось значення, і в той же час він завершує роботу функції. Функція може повертати будь-який об'єкт Python. За замовчуванням функція завжди повертає None.

Для того, щоб функція configure_intf повертала значення, яке потім можна, наприклад, присвоїти змінній, треба використовувати оператор return:

def configure_intf(intf_name, ip, mask):
    config = f"interface {intf_name}\nip address {ip} {mask}"
    return config


In [11]: result = configure_intf("Fa0/0", "10.1.1.1", "255.255.255.0")

In [12]: print(result)
interface Fa0/0
ip address 10.1.1.1 255.255.255.0

In [13]: result
Out[13]: "interface Fa0/0\nip address 10.1.1.1 255.255.255.0"

Тепер у зміні result знаходиться рядок із командами для налаштування інтерфейсу.

У реальному житті зазвичай функція повертатиме якесь значення.

Ще один важливий аспект роботи оператора return: після return, функція завершує роботу, а це означає що вирази, які йдуть після return, не виконуються.

Наприклад, у функції нижче, рядок "Конфігурація готова" не буде виводитися, оскільки вона стоїть після return:

def configure_intf(intf_name, ip, mask):
    config = f"interface {intf_name}\nip address {ip} {mask}"
    return config
    print("Конфігурація готова")


In [15]: configure_intf("Fa0/0", "10.1.1.1", "255.255.255.0")
Out[15]: "interface Fa0/0\nip address 10.1.1.1 255.255.255.0"

Функція може повертати кілька значень. У цьому випадку вони пишуться через кому після оператора return. При цьому фактично функція повертає кортеж:

def configure_intf(intf_name, ip, mask):
    config_intf = f"interface {intf_name}\n"
    config_ip = f"ip address {ip} {mask}"
    return config_intf, config_ip


In [17]: result = configure_intf("Fa0/0", "10.1.1.1", "255.255.255.0")

In [18]: result
Out[18]: ("interface Fa0/0\n", "ip address 10.1.1.1 255.255.255.0")

In [19]: type(result)
Out[19]: tuple

In [20]: intf, ip_addr = configure_intf("Fa0/0", "10.1.1.1", "255.255.255.0")

In [21]: intf
Out[21]: "interface Fa0/0\n"

In [22]: ip_addr
Out[22]: "ip address 10.1.1.1 255.255.255.0"

Опис функції (docstring)

Перший рядок у визначенні функції – це docstring, рядок документації. Це коментар, який використовується як опис функції:

def configure_intf(intf_name, ip, mask):
    """
    Функція генерує конфігурацію інтерфейсу
    """
    config_intf = f"interface {intf_name}\n"
    config_ip = f"ip address {ip} {mask}"
    return config_intf, config_ip


In [24]: configure_intf?
Signature: configure_intf(intf_name, ip, mask)
Docstring: Функція генерує конфігурацію інтерфейсу
File:      ~/repos/examples/examples/06_control_structures/<ipython-input-23-2b2bd970db8f>
Type:      function