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