#python #list #dictionary
#python #Список #словарь
Вопрос:
Есть ли способ создать переменные переменные в Python для следующего конкретного случая: скажем, у меня есть функция, которая выводит множество объектов (фиксированное, но большое число, скажем, 20), например
a1, a2, a3, a4, ..., a20 = f(20),
где a1, a2, a3, …, a20 являются объектами.
В SE было задано много вопросов по этой теме, где люди обычно говорят использовать списки или словари. Чего я не понимаю, так это как использовать списки / словари в этом конкретном случае.
Если бы у меня было:
a1 = g(1)
a2 = g(2)
...
Я бы понял, как это сделать, но я не уверен в приведенном выше случае, как «захватить» все объекты в список без явного указания всех имен переменных.
Комментарии:
1. Функция Python может возвращать одно значение. Так что это немного сбивает с толку, когда вы говорите: «функция, которая выводит много объектов». Вы имеете в виду, что он выводит список объектов? Было бы очень полезно, если бы вы могли показать минимальный пример вашей проблемы.
2. если ваша функция вернула много объектов… они уже находятся в контейнере — вероятно, a
tuple
. Вы могли бы сделатьfoo = f(20)
, а затем, скажем,a2
было быfoo[1]
.3. Ах, спасибо! Я думал о plt.subplots matplotlib с fig, (ax1, ax2, ax3, …) = plt.subplot() . Но я только что просмотрел документацию, и я могу использовать fig, ax = plt.subplot(), чтобы получить все это вместо этого. Как мне принять комментарий в качестве ответа?
Ответ №1:
Функция python всегда возвращает один объект. Этим объектом может быть None
одно значение или контейнер, содержащий значения. При возврате контейнера python позволяет вам распаковать этот контейнер в несколько переменных или сохранить его в виде одной переменной.
Вы можете распаковать
>>> def f(val):
... return list(range(val))
...
>>> a1, a2, a3 = f(3)
Или просто сохраните контейнер
>>> foo = f(3)
>>> type(foo)
<class 'list'>
>>> foo
[0, 1, 2]
>>> a2 == foo[1]
True
Ответ №2:
Я не уверен, спрашиваете ли вы, как получить доступ к вашим 20 значениям после их возврата или как вернуть 20 разных значений.
Я скажу, скорее в качестве совета, что в большинстве случаев вы пытаетесь вернуть структуру данных из 20 частей, возможно, было бы проще сделать это классом и вернуть класс.
Но это не отвечает на ваш вопрос. Для этого примера, предполагая, что вы действительно просто хотите получить список из 20 переданных объектов, я предлагаю кортежи. Смотрите Пример ниже для функции, которая создает кортеж, и этот же кортеж был распакован ранее.
# My function get_information returns the latitude,
# longitude, time, and number of likes a given post has
def get_post(post_id):
# Get post information here
long = 12.4213
lat = 12351.34
time = '12:00'
num_likes = -3
# Now to return all these values
return ( long, lat, time, num_likes )
# Outside of the function, we can access the values in this way
my_long, my_lat, my_time, my_num_likes = get_post(10)
# Python unpacks the tuple into these variables in the order they are put into the tuple.
Ответ №3:
Скажем, у вас есть функция, которая возвращает кортеж из 20 объектов, здесь вам не нужно создавать много переменных для хранения этих объектов, но вместо этого вы можете использовать словарь, например:
# Say it's your function
def f(x):
return a0, a1, a2, ..., a19
Затем вы можете легко поместить все возвращаемые значения в словарь, подобный этому:
foo = f(x)
dic = {f'a{i}': foo[i] for i in range(len(foo))}
И здесь вы получите словарь, подобный:
dic = {'a0': first_return_value,
'a1': second_return_value,
etc,}