Переменные переменные в python для конкретного случая

#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,}