Comments 16
Вы забыли возврат значений с помощью set'а, возврат значений с помощью frozenset'а, возврат значений с помощью OrderedDict, возврат значений с помощью namespace'ов,… В питоне много типов переменных. Можно для каждого типа написать целую главу для статьи. Длиииная статья будет.
Правда, зачем его переводить?
Я всегда namedtuple
/NamedTuple
использую, когда не лень. Получаешь immutable return-тип, значения хочешь распаковывай, хочешь по индексу забирай, хочешь по имени.
Способ 6: Возврат с помощью исключений
Элегантный способ позволяющий использовать любой из предыдущих способов, при этом возврат осуществляется сразу через любое количество вызовов функций.
def getData():
raise Exception('test')
try:
getData()
except Exception as e:
print(e)
Способ 7: Возврат с помощью файловой системы
А вдруг ваша функция вызвана другим процессом, а про межпроцессорное взаимодействие вы и не слыхали ( или банально лень. ) Тогда файловая система спешит на помощь.
def getData():
with open('ipc.bin', 'wb') as f:
f.write(b'test')
def readData():
with open('ipc.bin', 'rb') as f:
return f.read().decode('utf8')
# process A
getData()
# process B
print(readData())
и наконец метод 8: возврат значений из космоса
Метод такой. Вначале записываем возвращаемое значение в /dev/null
Казалось бы значения уничтожены, но нет, ведь как каждому известно при очистке значений переменных ножки процессора приобретут остаточную намагниченность, так как электроны снятые с переменных повиснут на ножках. Их то мы и будем считывать.
(Осторожно не повторяйте это дома, уберите от терминалов беременных родителей и их детей ).
def killData(data):
with open('/dev/null', 'wb') as f:
f.write(data)
def restoreData():
with open('/dev/urandom', 'rb') as f:
return f.read(4)
killData(b'test')
while True:
dt = restoreData()
if dt == b'test':
print('yey! restored "test"')
break
Впрочем это только начало, я подумываю также над алгоритмами возврата значений через
— мигание светодиода
— ускорение и замедление вентилятора процессора
— изменение разрешения экрана
— переустановку операционной системы
также я работаю над сервисом по возврату значений. Доколе можно плодить однообразные решения. Нас ждет переиспользование кода, SAAS, PAAS выход на IPO и блокчейн!
также я работаю над сервисом
Напомнило: https://devnull-as-a-service.com
Зачем нужен возврат нескольких значений из функции когда есть генераторы?
(Очевидно что у этого есть свои недостатки)
Серьезно!Yield выглядит в данной ситуации лучше!
def f():
return 123, 456
или
def f():
yield 123
yield 456
решать вам
Первый вариант нужен для случаев, когда у нас небольшое количество разных по смыслу значений. Например, функция парсит некий веб-ресурс и возвращает пару из найденного значения и кода ответа сервера.
В то время как вариант с yield, например, идеально подходит для случаев, когда у нас большое и заранее неизвестное количество значений с одинаковой семантикой.
Функция в python возвращает одно значение же. Благодаря встроенной поддержке кортежей, словарей и ООП можно возвращать много данных внутри одного объекта, да.
ЗЫ: странно, что никто не вспомнил, ведь можно возвращать значения через глобальные переменные, причем неограниченное количество ;)
Как вернуть сразу несколько значений из функции в Python 3