Створення функції¶
Створення функції:
- функції створюються за допомогою зарезервованого слова def
- за def слідують ім'я функції та круглі дужки
- всередині дужок можуть вказуватись параметри, які функція приймає
- після круглих дужок йде двокрапка і з нового рядка, з відступом, йде блок коду, який виконує функція
- першим рядком, опціонально, може бути коментар, так звана docstring
- у функціях може використовуватись оператор return
- він використовується для припинення роботи функції та виходу з неї
- найчастіше оператор return повертає якесь значення
Приклад функції:
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]
- Рядок 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