Функции с возвратом нескольких значений python

How does Python return multiple values from a function?

Whenever multiple values are returned from a function in python, does it always convert the multiple values to a list of multiple values and then returns it from the function? Is the whole process same as converting the multiple values to a list explicitly and then returning the list, for example in Java, as one can return only one object from a function in Java?

If you return two items from a function, then you are returning a tuple of length two, because that is how returning multiple items works. It’s not a list.

@khelwood: So, is it a special feature in python?? One which is not present in languages like JAVA, C++ .

@khelwood: So, actually it does not return multiple values but a tuple of multiple values. Am I right??

6 Answers 6

Since the return statement in getName specifies multiple elements:

def getName(self): return self.first_name, self.last_name 

Python will return a container object that basically contains them.

In this case, returning a comma separated set of elements creates a tuple. Multiple values can only be returned inside containers.

Let’s use a simpler function that returns multiple values:

You can look at the byte code generated by using dis.dis , a disassembler for Python bytecode. For comma separated values w/o any brackets, it looks like this:

>>> import dis >>> def foo(a, b): . return a,b >>> dis.dis(foo) 2 0 LOAD_FAST 0 (a) 3 LOAD_FAST 1 (b) 6 BUILD_TUPLE 2 9 RETURN_VALUE 

As you can see the values are first loaded on the internal stack with LOAD_FAST and then a BUILD_TUPLE (grabbing the previous 2 elements placed on the stack) is generated. Python knows to create a tuple due to the commas being present.

You could alternatively specify another return type, for example a list, by using [] . For this case, a BUILD_LIST is going to be issued following the same semantics as it’s tuple equivalent:

>>> def foo_list(a, b): . return [a, b] >>> dis.dis(foo_list) 2 0 LOAD_FAST 0 (a) 3 LOAD_FAST 1 (b) 6 BUILD_LIST 2 9 RETURN_VALUE 

The type of object returned really depends on the presence of brackets (for tuples () can be omitted if there’s at least one comma). [] creates lists and <> sets. Dictionaries need key:val pairs.

To summarize, one actual object is returned. If that object is of a container type, it can contain multiple values giving the impression of multiple results returned. The usual method then is to unpack them directly:

>>> first_name, last_name = f.getName() >>> print (first_name, last_name) 

As an aside to all this, your Java ways are leaking into Python 🙂

Don’t use getters when writing classes in Python, use properties . Properties are the idiomatic way to manage attributes, for more on these, see a nice answer here.

Moreover, getThis and setThat are obsolete hold-overs from the Java bean days. I would like to see an end to this paradigm once and for all. object.foo() implies a «get» and object.foo(value) already implies a set.

Although it looks like myfun() returns multiple values, a tuple is actually being created. It looks a bit peculiar, but it’s actually the comma that forms a tuple, not the parentheses

So yes, what’s going on in Python is an internal transformation from multiple comma separated values to a tuple and vice-versa.

Though there’s no equivalent in java you can easily create this behaviour using array ‘s or some Collection s like List s:

private static int[] sumAndRest(int x, int y)
public static void main(String[] args) < int[] results = sumAndRest(10, 5); int sum = results[0]; int rest = results[1]; System.out.println("sum = " + sum + "\nrest mt24"> 
)" data-controller="se-share-sheet" data-se-share-sheet-title="Share a link to this answer" data-se-share-sheet-subtitle="" data-se-share-sheet-post-type="answer" data-se-share-sheet-social="facebook twitter devto" data-se-share-sheet-location="2" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f3.0%2f" data-se-share-sheet-license-name="CC BY-SA 3.0" data-s-popover-placement="bottom-start">Share
)" title="">Improve this answer
)">edited Jul 10, 2017 at 17:49
Dimitris Fasarakis Hilliard
150k 31 gold badges 265 silver badges 251 bronze badges
answered Sep 6, 2016 at 9:59
Add a comment |
6

Here It is actually returning tuple.

If you execute this code in Python 3:

def get(): a = 3 b = 5 return a,b number = get() print(type(number)) print(number) 

But if you change the code line return [a,b] instead of return a,b and execute :

def get(): a = 3 b = 5 return [a,b] number = get() print(type(number)) print(number) 

It is only returning single object which contains multiple values.

There is another alternative to return statement for returning multiple values, use yield ( to check in details see this What does the "yield" keyword do in Python?)

Sample Example :

def get(): for i in range(5): yield i number = get() print(type(number)) print(number) for i in number: print(i) 

Источник

Возврат нескольких значений из функции

Python позволяет вам возвращать из функции несколько значений.

Для этого необходимо вернуть структуру данных, содержащую эти несколько значений. Например, список количества миль, которые надо пробежать за неделю.

def miles_to_run(minimum_miles): week_1 = minimum_miles + 2 week_2 = minimum_miles + 4 week_3 = minimum_miles + 6 return [week_1, week_2, week_3] print(miles_to_run(2)) # result: [4, 6, 8]

Структура данных — контейнер, хранящий однотипные данные. Эти данные могут быть возвращены из функций. В этой статье мы узнаем, как возвращать несколько значений из структур вроде кортежа, списка и словаря.

Кортежи

Кортеж — упорядоченная, неизменяемая последовательность. То есть, значения внутри кортежа мы изменять не можем.

Мы можем использовать кортеж, например, для хранения информации о человеке (о его имени, возрасте, месте жительства).

Пример функции, которая возвращает кортеж:

def person(): return "Боб", 32, "Бостон" print(person()) # result: ('Боб', 32, 'Бостон')

Заметьте, что в предложении return мы не использовали круглые скобки для возврата значения. Это потому, что кортеж можно вернуть, просто отделив каждый элемент запятой, как в нашем примере.

«Кортеж образуют запятые, а не круглые скобки» — так написано в документации. Но для создания пустых кортежей круглые скобки необходимы. Также это помогает избежать путаницы.

Пример функции, которая использует () для возврата кортежа:

def person(name, age): return (name, age) print(person("Генри", 5)) #result: ('Генри', 5)

Список

Список — упорядоченная, изменяемая последовательность. Элементы списка можно изменять.

cities = ["Бостон", "Чикаго", "Джексонвилл"]
test_scores = [55, 99, 100, 68, 85, 78]

Взгляните на функцию ниже. Она возвращает список, содержащий десять чисел.

def ten_numbers(): numbers = [] for i in range(1, 11): numbers.append(i) return numbers print(ten_numbers()) #result: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Еще один пример. В этот раз мы передаем несколько аргументов в функцию.

def miles_ran(week_1, week_2, week_3, week_4): return [week_1, week_2, week_3, week_4] monthly_mileage = miles_ran(25, 30, 28, 40) print(monthly_mileage) #result: [25, 30, 28, 40]

Спутать кортеж со списком довольно просто. Все-таки обе структуры хранят несколько значений. Важно запомнить ключевые отличия:

Словари

Словарь — структура, в которой хранятся пары значений в виде «ключ-значение». Заключены эти значения в фигурные скобки <> . Каждому ключу соответствует свое значение.

Рассмотрим пример. В следующем словаре содержатся имена сотрудников. Имя сотрудника — ключ, его должность — значение.

Пример функции, возвращающей словарь в виде «ключ-значение».

def city_country(city, country): location = <> location[city] = country return location favorite_location = city_country("Бостон", "США") print(favorite_location) # result:

В примере выше «Бостон» — ключ, а «США» — значение.

Мы проделали долгий путь… Подытожим — вы можете вернуть несколько значений из функции и существует несколько способов сделать это.

Источник

Использование объекта (object)

Это похоже на C/C++ и Java, мы можем создать класс (в C, структуру) для хранения нескольких значений и возврата объекта класса.

# A Python program to return multiple # values from a method using class class Test: def __init__(self): self.str = "string example" self.x = 20 # This function returns an object of Test def fun(): return Test() # Driver code to test above method t = fun() print(t.str) print(t.x)

Результат работы кода:

Использование кортежа (tuple)

Кортеж представляет собой последовательность элементов, разделенных запятыми. Он создается с или без (). Кортежи неизменны.

# A Python program to return multiple # values from a method using tuple # This function returns a tuple def fun(): str = "string example" x = 20 return str, x; # Return tuple, we could also # write (str, x) # Driver code to test above method str, x = fun() # Assign returned tuple print(str) print(x)

Результат работы кода:

Использование списка (list)

Список похож на массив элементов, созданный с помощью квадратных скобок. Они отличаются от массивов тем, что могут содержать элементы разных типов. Списки отличаются от кортежей тем, что они изменяемы.

# A Python program to return multiple # values from a method using list # This function returns a list def fun(): str = "string example" x = 20 return [str, x]; # Driver code to test above method list = fun() print(list)

Результат работы кода:

Использование словаря (dictionary)

Словарь похож на хэш или карту на других языках.

# A Python program to return multiple # values from a method using dictionary # This function returns a dictionary def fun(): d = dict(); d['str'] = "string example" d['x'] = 20 return d # Driver code to test above method d = fun() print(d)

Результат работы кода:

Использование класса данных (Data Class)

В Python 3.7 и более поздних версиях класс данных можно использовать для возврата класса с автоматически добавленными уникальными методами. Модуль класса данных имеет декоратор и функции для автоматического добавления сгенерированных специальных методов, таких как __init__() и __repr__() в пользовательские классы.

from dataclasses import dataclass @dataclass class Book_list: name: str perunit_cost: float quantity_available: int = 0 # function to calculate total cost def total_cost(self) -> float: return self.perunit_cost * self.quantity_available book = Book_list("Introduction to programming.", 300, 3) x = book.total_cost() # print the total cost # of the book print(x) # print book details print(book) # 900 Book_list(name='Python programming.', perunit_cost=200, quantity_available=3)

Результат работы кода:

900 Book_list(name='Introduction to programming.', perunit_cost=300, quantity_available=3) Book_list(name='Python programming.', perunit_cost=200, quantity_available=3)

Источник

Читайте также:  How to Convert Number into Words in PHP - NiceSnippets.com
Оцените статью