- 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
может быть лучшим вариантом в некоторых случаях, но не в большинстве.