Фото с сайта Unsplash. Автор: Vipul Jha
Python удобен в том числе тем, что позволяет одновременно возвращать из функции сразу несколько значений. Для этого нужно воспользоваться оператором
return
и вернуть структуру данных с несколькими значениями — например, список общего количества рабочих часов за каждую неделю.def hours_to_write(happy_hours):
week1 = happy_hours + 2
week2 = happy_hours + 4
week3 = happy_hours + 6
return [week1, week2, week3]
print(hours_to_write(4))
# [6, 8, 10]
Структуры данных в Python используются для хранения коллекций данных, которые могут быть возвращены посредством оператора
return
. В этой статье мы рассмотрим способы возврата нескольких значений с помощью подобных структур (словарей, списков и кортежей), а также с помощью классов и классов данных (Python 3.7+).Способ 1: возврат значений с помощью словарей
Словари содержат комбинации элементов, которые представляют собой пары «ключ — значение» (
key:value
), заключенные в фигурные скобки ({}
).Словари, на мой взгляд, это оптимальный вариант для работы, если вы знаете ключ для доступа к значениям. Далее представлен словарь, где ключом является имя человека, а соответствующим значением — возраст.
people={
'Robin': 24,
'Odin': 26,
'David': 25
}
А теперь перейдем к функции, которая возвращает словарь с парами «ключ — значение».
# A Python program to return multiple values using dictionary
# This function returns a dictionary
def people_age():
d = dict();
d['Jack'] = 30
d['Kim'] = 28
d['Bob'] = 27
return d
d = people_age()
print(d)
# {'Bob': 27, 'Jack': 30, 'Kim': 28}
Способ 2: возврат значений с помощью списков
Списки похожи на массивы, сформированные с использованием квадратных скобок, однако они могут содержать элементы разных типов. Списки также отличаются от кортежей, поскольку являются изменяемым типом данных. То есть любой список может меняться.
Списки — одна из наиболее универсальных структур данных в Python, потому что им не обязательно сохранять однородность (в них можно включать строки, числа и элементы). Иногда списки даже используют вместе со стеками или очередями.
# A Python program to return multiple values using list
def test():
str1 = "Happy"
str2 = "Coding"
return [str1, str2];
list = test()
print(list)
# ['Happy', 'Coding']
Вот пример, где возвращается список с натуральными числами.
def natural_numbers(numbers = []):
for i in range(1, 16):
numbers.append(i)
return numbers
print(natural_numbers())
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
Способ 3: возврат значений с помощью кортежей
Кортежи — это упорядоченные неизменяемые объекты в Python, которые обычно используются для хранения коллекций неоднородных данных.
Кортежи напоминают списки, однако их нельзя изменить после того, как они были объявлены. А еще, как правило, кортежи быстрее в работе, чем списки. Кортеж можно создать, отделив элементы запятыми:
x, y, z
или (x, y, z)
.На этом примере кортеж используется для хранения данных о сотруднике (имя, опыт работы в годах и название компании).
Bob = ("Bob", 7, "Google")
А вот пример написания функции для возврата кортежа.
# A Python program to return multiple values using tuple
# This function returns a tuple
def fun():
str1 = "Happy"
str2 = "Coding"
return str1, str2; # we could also write (str1, str2)
str1, str2= fun()
print(str1)
print(str2)
# Happy
Coding
Обратите внимание: мы опустили круглые скобки в операторе
return
, поскольку для возврата кортежа достаточно просто отделить каждый элемент запятой (как показано выше).Не забывайте, что кортеж можно создать с помощью запятой вместо круглых скобок. Круглые скобки требуются только в тех случаях, когда используются пустые кортежи или вам нужно избежать синтаксической неточности.
Чтобы лучше разобраться в кортежах, обратитесь к официальной документации Python 3 (документация приведена на английском языке. — Прим. ред.).
Ниже показан пример функции, которая использует для возврата кортежа круглые скобки.
def student(name, class):
return (name, class)
print(student("Brayan", 10))
# ('Brayan', 10)
Повторюсь, кортежи легко перепутать со списками (в конце концов, и те, и другие представляют собой контейнер, состоящий из элементов). Однако нужно помнить о фундаментальном различии: кортежи изменить нельзя, а списки — можно.
Способ 4: возврат значений с помощью объектов
Тут все так же, как в C/C++ или в Java. Можно просто сформировать класс (в C он называется структурой) для сохранения нескольких признаков и возврата объекта класса.
# A Python program to return multiple values using class
class Intro:
def __init__(self):
self.str1 = "hello"
self.str2 = "world"
# This function returns an object of Intro
def message():
return Intro()
x = message()
print(x.str1)
print(x.str2)
# hello
world
Способ 5: возврат значений с помощью классов данных (Python 3.7+)
Классы данных в Python 3.7+ как раз помогают вернуть класс с автоматически добавленными уникальными методами, модулем
typing
и другими полезными инструментами. from dataclasses import dataclass
@dataclass
class Item_list:
name: str
perunit_cost: float
quantity_available: int = 0
def total_cost(self) -> float:
return self.perunit_cost * self.quantity_available
book = Item_list("better programming.", 50, 2)
x = book.total_cost()
print(x)
print(book)
# 100
Item_list(name='better programming.', perunit_cost=50,
quantity_available=2)
Чтобы лучше разобраться в классах данных, обратитесь к официальной документации Python 3 (документация приведена на английском языке. — Прим. ред.).
Вывод
Цель этой статьи — ознакомить вас со способами возврата нескольких значений из функции в Python. И, как вы видите, этих способов действительно много.
Учите матчасть и постоянно развивайте свои навыки программирования. Спасибо за внимание!
amarao
Вы забыли возврат значений с помощью set'а, возврат значений с помощью frozenset'а, возврат значений с помощью OrderedDict, возврат значений с помощью namespace'ов,… В питоне много типов переменных. Можно для каждого типа написать целую главу для статьи. Длиииная статья будет.
Neusser
А так же с помощью строки (это несколько символов) и с помощью числа (несколько цифр).
olegborzov
Это же Медиум. Там подобного хлама навалом.
Правда, зачем его переводить?
idegree
А также передать значения в замыкание и вернуть их с помощью другой функции!
iroln
Я всегда
namedtuple
/NamedTuple
использую, когда не лень. Получаешь immutable return-тип, значения хочешь распаковывай, хочешь по индексу забирай, хочешь по имени.bogolt
ну ок, «выпускайте кракена»
Способ 6: Возврат с помощью исключений
Элегантный способ позволяющий использовать любой из предыдущих способов, при этом возврат осуществляется сразу через любое количество вызовов функций.
Способ 7: Возврат с помощью файловой системы
А вдруг ваша функция вызвана другим процессом, а про межпроцессорное взаимодействие вы и не слыхали ( или банально лень. ) Тогда файловая система спешит на помощь.
и наконец метод 8: возврат значений из космоса
Метод такой. Вначале записываем возвращаемое значение в /dev/null
Казалось бы значения уничтожены, но нет, ведь как каждому известно при очистке значений переменных ножки процессора приобретут остаточную намагниченность, так как электроны снятые с переменных повиснут на ножках. Их то мы и будем считывать.
(Осторожно не повторяйте это дома, уберите от терминалов беременных родителей и их детей ).
Впрочем это только начало, я подумываю также над алгоритмами возврата значений через
— мигание светодиода
— ускорение и замедление вентилятора процессора
— изменение разрешения экрана
— переустановку операционной системы
также я работаю над сервисом по возврату значений. Доколе можно плодить однообразные решения. Нас ждет переиспользование кода, SAAS, PAAS выход на IPO и блокчейн!