Функции: часть 3

Функции: часть 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

В принципе, эти три части по функциям - основы, которых пока что достаточно.

Report Page