Pull to refresh

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 и блокчейн!

Зачем нужен возврат нескольких значений из функции когда есть генераторы?
(Очевидно что у этого есть свои недостатки)
image
Серьезно!Yield выглядит в данной ситуации лучше!


def f():
    return 123, 456

или


def f():
    yield 123
    yield 456

решать вам

Эти два варианта используются в разных случаях.

Первый вариант нужен для случаев, когда у нас небольшое количество разных по смыслу значений. Например, функция парсит некий веб-ресурс и возвращает пару из найденного значения и кода ответа сервера.
В то время как вариант с yield, например, идеально подходит для случаев, когда у нас большое и заранее неизвестное количество значений с одинаковой семантикой.

Это Хабр — минус тут может прилететь просто по факту появления вашего комментария и вообще быть несвязанным с изложенным в комменте. Не реагируйте на отдельные оценки, а смотрите за трендами.

Особенно пылает, когда кто-то включает return в if, а дефолтное значения или обработку исключений не делает. И получается весело, в 99.9999% функция возвращает значения и в 0.00001 нет. Потом лови эту багу.

Неплохо, вы переопределили встроенный метод list и положили в него свою бяку.

Функция в python возвращает одно значение же. Благодаря встроенной поддержке кортежей, словарей и ООП можно возвращать много данных внутри одного объекта, да.
ЗЫ: странно, что никто не вспомнил, ведь можно возвращать значения через глобальные переменные, причем неограниченное количество ;)

Sign up to leave a comment.