Как сделать несколько return в одной функции в Python?
Функция в python может вернуть значение только один раз. Если нужно вернуть разные значения в зависимости от условий, то можно воспользоваться условной конструкцией if :
def function(): . if condition1: return result1 if condition2: return result2
Также можно вернуть несколько значений одновременно в виде кортежа:
def function(): . return result1, result2
Возврат нескольких значений из функции
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]
Структура данных — контейнер, хранящий однотипные данные. Эти данные могут быть возвращены из функций. В этой статье мы узнаем, как возвращать несколько значений из структур вроде кортежа, списка и словаря.
Кортежи
Кортеж — упорядоченная, неизменяемая последовательность. То есть, значения внутри кортежа мы изменять не можем.
Мы можем использовать кортеж, например, для хранения информации о человеке (о его имени, возрасте, месте жительства).
nancy = ("Нэнси", 55, "Чикаго")
Пример функции, которая возвращает кортеж:
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]
Спутать кортеж со списком довольно просто. Все-таки обе структуры хранят несколько значений. Важно запомнить ключевые отличия:
- Кортежи изменять нельзя.
- Списки изменять можно.
Словари
Словарь — структура, в которой хранятся пары значений в виде «ключ-значение». Заключены эти значения в фигурные скобки <> . Каждому ключу соответствует свое значение.
Рассмотрим пример. В следующем словаре содержатся имена сотрудников. Имя сотрудника — ключ, его должность — значение.
employees =
Пример функции, возвращающей словарь в виде «ключ-значение».
def city_country(city, country): location = <> location[city] = country return location favorite_location = city_country(«Бостон», «США») print(favorite_location) # result:
В примере выше «Бостон» — ключ, а «США» — значение.
Мы проделали долгий путь… Подытожим — вы можете вернуть несколько значений из функции и существует несколько способов сделать это.
Возврат нескольких значений из функции в Python
В этом посте мы обсудим, как вернуть несколько значений из функции в Python.
1. Использование кортежей
Наиболее распространенный подход к возврату нескольких значений из функции в Python — использование кортежа. Идея состоит в том, чтобы упаковать возвращаемые значения в кортеж, вернуть кортеж из функции и распаковать его внутри вызывающей функции.
Это предпочтительный подход, когда вам нужно вернуть только два или три поля из функции. В следующем примере показано, как можно использовать кортежи для возврата двух полей разных типов из функции.
return ‘A’ , 65
if __name__ == ‘__main__’ :
print ( ( x , type ( x ) ) ) # (‘A’,
print ( ( y , type ( y ) ) ) # (65,
Главное преимущество кортежей в том, что их очень легко создавать и распаковывать. Кортежи отлично работают, когда общее количество возвращаемых значений меньше. Однако это легко становится проблематичным, когда общее количество возвращаемых значений увеличивается. Чем больше значений, тем сложнее ими управлять и правильно распаковывать.
2. Использование именованных кортежей
Чтобы справиться с проблемами, связанными с кортежем, вы можете использовать именованные кортежи, которые представляют собой объекты, подобные кортежу, но имеющие поля, доступные при поиске по атрибуту. В следующем примере кода показано, как реализовать именованные кортежи:
Возврат нескольких значений одновременно из функции в Python
помогите пожалуйста с моим небольшим вопросом. У меня не получается вывести из функции Python два значения. Либо могу вывести поочередно одно из двух, либо получается вывести просто в виде какого то кода. В результате хотелось бы получить чтобы выводилась таблица и под ней следом график. Я в принципе прописал уже return в конце кода, но не знаю как заставить их работать одновременно. Заранее благодарю.
def calculate_rolling_ret(installs, logins): import pandas as pd import numpy as np installs = installs.drop_duplicates().dropna() logins = logins.drop_duplicates().dropna() logins = logins[(logins['is_tester'] ==0) & (logins['is_youtuber'] ==0)][['client_id','event_timestamp']] work_table = logins.merge( installs, on='client_id', how='inner') work_table work_table['event_timestamp'] = pd.to_datetime(work_table['event_timestamp'], format='%Y-%m-%d') work_table['install_date'] = pd.to_datetime(work_table['install_date'], format='%Y-%m-%d') work_table['week_start'] = work_table['install_date'].dt.to_period('W').dt.start_time work_table['lifetime'] = work_table['event_timestamp'] - work_table['install_date'] work_table['lifetime'] = work_table['lifetime'] / np.timedelta64(1, 'D') work_table['lifetime'] = work_table['lifetime'].astype('int') work_table['event_timestamp'] = work_table['event_timestamp'].dt.date work_table min_lifetime = work_table['lifetime'].min() max_lifetime = work_table['lifetime'].max() count_id=<> for lifetime in range(0, max_lifetime+1): result = work_table[work_table['lifetime'] >= lifetime]['client_id'].nunique() count_id[lifetime] = result rol_ret_table = pd.DataFrame.from_dict((count_id), orient='index').reset_index() rol_ret_table.columns = ['lifetime', 'count_user'] rol_ret_table['rol_ret'] = round(rol_ret_table['count_user']/rol_ret_table['count_user'][0], 2) rol_ret_table = rol_ret_table.rename(columns=) import plotly.express as px ret_fig=px.line( rol_ret_table, x='lifetime', y='rol_ret', title='Rolling retention', labels= ) ret_fig.update_yaxes(dict(tickformat=".0%")) return rol_ret_table #return ret_fig
