• en
  • Language: ru
  • Documentation version: latest

8. Глобальный и возвратный

Возможно, вы встречали некоторые функции, написанные на языке python, которые содержат ключевое слово return в конце функции. Знаете ли вы, что оно делает? Это похоже на return в других языках. Давайте рассмотрим эту маленькую функцию:

def add(value1, value2):
    return value1 + value2

result = add(3, 5)
print(result)
# Output: 8

Приведенная выше функция принимает на вход два значения, а затем выводит их сложение. Мы могли бы также сделать:

def add(value1,value2):
    global result
    result = value1 + value2

add(3,5)
print(result)
# Output: 8

Итак, сначала поговорим о первой части кода, в которой используется ключевое слово return. Эта функция делает то, что присваивает значение переменной, вызывающей эту функцию, которая в нашем случае является result. В большинстве случаев и вам не понадобится использовать ключевое слово global. Однако давайте рассмотрим другой фрагмент кода, который также включает ключевое слово global. Итак, функция делает глобальную переменную result. Что здесь означает глобальная переменная? Глобальная переменная означает, что мы можем получить доступ к этой переменной и за пределами области видимости функции. Позвольте мне продемонстрировать это на примере:

# first without the global variable
def add(value1, value2):
    result = value1 + value2

add(2, 4)
print(result)

# Oh crap, we encountered an exception. Why is it so?
# the python interpreter is telling us that we do not
# have any variable with the name of result. It is so
# because the result variable is only accessible inside
# the function in which it is created if it is not global.
Traceback (most recent call last):
  File "", line 1, in
    result
NameError: name 'result' is not defined

# Now lets run the same code but after making the result
# variable global
def add(value1, value2):
    global result
    result = value1 + value2

add(2, 4)
result
6

Так что, надеюсь, во втором запуске ошибок не будет, как и ожидалось. В практическом программировании вы должны стараться держаться подальше от ключевого слова global, поскольку оно только усложняет жизнь, вводя нежелательные переменные в глобальную область видимости.

8.1. Множественные возвращаемые значения

Что же делать, если вы хотите вернуть из функции две переменные вместо одной? Есть несколько подходов, которые используют начинающие программисты. Самый известный подход - использовать ключевое слово global. Давайте рассмотрим бесполезный пример:

def profile():
    global name
    global age
    name = "Danny"
    age = 30

profile()
print(name)
# Output: Danny

print(age)
# Output: 30

**Примечание:**Не пытайтесь использовать вышеупомянутый метод. Повторяю, не пытайтесь использовать вышеупомянутый метод!

Некоторые пытаются решить эту проблему, возвращая tuple, list или dict с требуемыми значениями после завершения функции. Это один из способов, который работает как шарм:

def profile():
    name = "Danny"
    age = 30
    return (name, age)

profile_data = profile()
print(profile_data[0])
# Output: Danny

print(profile_data[1])
# Output: 30

Или по более распространенной традиции:

def profile():
    name = "Danny"
    age = 30
    return name, age

profile_name, profile_age = profile()
print(profile_name)
# Output: Danny
print(profile_age)
# Output: 30

Помните, что даже в приведенном выше примере мы возвращаем кортеж (несмотря на отсутствие парантезы), а не отдельные множественные значения. Если вы хотите сделать еще один шаг вперед, вы также можете использовать namedtuple. Вот пример:

from collections import namedtuple
def profile():
    Person = namedtuple('Person', 'name age')
    return Person(name="Danny", age=31)

# Use as namedtuple
p = profile()
print(p, type(p))
# Person(name='Danny', age=31) <class '__main__.Person'>
print(p.name)
# Danny
print(p.age)
#31

# Use as plain tuple
p = profile()
print(p[0])
# Danny
print(p[1])
#31

# Unpack it immediatly
name, age = profile()
print(name)
# Danny
print(age)
#31

Это лучший способ наряду с возвратом lists и dicts. Не используйте ключевое слово global, если не знаете, что делаете. global может быть лучшим вариантом в некоторых случаях, но не в большинстве.