Функции: часть 3
@Pycoders
Документирование
На читаемость и быстроту понимания вашего кода может повлиять наличие документации.
Строки документации - строковые литералы, которые являются первым оператором в модуле, функции, классе или определении метода. Такая строка документации становится специальным атрибутом __doc__ этого объекта.
Для того, чтобы добавить документацию, используйте три двойные кавычки. На ход выполнения вашей программы это никак не повлияет.
def function(text):
""" This function prints something """
print(text)
Вторая строчка из этого примера и есть документация.
Также можно писать несколько строчек, а не просто одну.
def function(text):
"""
This function prints something.
Here is useless line just for example.
"""
print(text)
Если вы вдруг захотите получить документацию своей или чужой функции, используйте атрибут __doc__
print(function.__doc__)
Вывод программы:
This function prints something. Here is useless line just for example.
Обратите внимание на отступы, которые вывелись, так прописано в самой функции.
Область видимости
- Локальная
Важно понимать, что переменные, объявленные вне области видимости функции, нельзя изменять.
result = 0
def increment():
result += 1
increment()
print(result)
Вылетит ошибка, потому что внутри функции не объявлена переменная result, а с глобальной она контактировать пока что не может. То есть, в локальной области видимости функции нет переменной result.
- global
Однако мы можем использовать ключевое слово global, чтобы взять ту переменную без передачи ее в аргумент. Global даёт понять функции, что мы работаем с глобальной переменной без объявления новой внутри функции.
result = 0
def increment():
global result
result += 1
increment()
print(result)
И вот, наш result стал равен 1 вместо 0.
- nonlocal
Похожая штука на global, но разницу объяснить на словах сложновато, поэтому сразу примеры. Если понять всё, что сейчас увидите, то nonlocal и global запомните навсегда.
Без nonlocal и global:
x = 0
def outer():
x = 1
def inner():
x = 2
print("inner:", x)
inner()
print("outer:", x)
outer()
print("global:", x)
# inner: 2
# outer: 1
# global: 0
Теперь попробуем впихнуть nonlocal:
x = 0
def outer():
x = 1
def inner():
nonlocal x
x = 2
print("inner:", x)
inner()
print("outer:", x)
outer()
print("global:", x)
# inner: 2
# outer: 2
# global: 0
Точно такое же, но с global:
x = 0
def outer():
x = 1
def inner():
global x
x = 2
print("inner:", x)
inner()
print("outer:", x)
outer()
print("global:", x)
# inner: 2
# outer: 1
# global: 2
В принципе, эти три части по функциям - основы, которых пока что достаточно.