Игнорировать множественное возвращаемое значение python

Скажем, у меня есть функция Python, которая возвращает несколько значений в кортеже:

def func():
    return 1, 2

Есть ли хороший способ игнорировать один из результатов, а не просто назначать временную переменную? Скажем, если меня интересует только первое значение, есть ли лучший способ:

x, temp = func()

Ответ 1

Одно общее соглашение - использовать "_" в качестве имени переменной для элементов кортежа, который вы хотите игнорировать. Например:

def f():
    return 1, 2, 3

_, _, x = f()

Ответ 2

Вы можете использовать x = func()[0], чтобы вернуть первое значение, x = func()[1], чтобы вернуть второе и т.д.

Если вы хотите получить несколько значений за раз, используйте что-то вроде x, y = func()[2:4].

Ответ 3

Если вы используете Python 3, вы можете использовать звезду перед переменной (в левой части задания), чтобы она была списком при распаковке.

# Example 1: a is 1 and b is [2, 3]

a, *b = [1, 2, 3]

# Example 2: a is 1, b is [2, 3], and c is 4

a, *b, c = [1, 2, 3, 4]

# Example 3: b is [1, 2] and c is 3

*b, c = [1, 2, 3]       

# Example 4: a is 1 and b is []

a, *b = [1]

Ответ 4

Помните, что когда вы возвращаете более одного элемента, вы действительно возвращаете кортеж. Поэтому вы можете делать такие вещи:

def func():
    return 1, 2

print func()[0] # prints 1
print func()[1] # prints 2

Ответ 5

Три простых выбора.

Очевидные

x, _ = func()

x, junk = func()

Отвратительный

x = func()[0]

И есть способы сделать это с помощью декоратора.

def val0( aFunc ):
    def pick0( *args, **kw ):
        return aFunc(*args,**kw)[0]
    return pick0

func0= val0(func)

Ответ 6

Общей практикой является использование фиктивной переменной _ (одно подчеркивание), как многие из них указывали здесь раньше.

Однако, чтобы избежать столкновений с другими видами использования этого имени переменной (см. этот ответ), может быть, лучше использовать __ (double underscore) вместо как переменная, как указано ncoghlan. Например:.

x, __ = func()

Ответ 7

Это не прямой ответ на вопрос. Скорее он отвечает на этот вопрос: "Как выбрать конкретную функцию, выводимую из множества возможных параметров?".

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

    def fancy_function( arg1, arg2, return_type=1 ):
        ret_val = None
        if( 1 == return_type ):
            ret_val = arg1 + arg2
        elif( 2 == return_type ):
            ret_val = [ arg1, arg2, arg1 * arg2 ]
        else:
            ret_val = ( arg1, arg2, arg1 + arg2, arg1 * arg2 ) 
        return( ret_val )

Этот метод дает функцию "расширенного предупреждения" относительно желаемого выхода. Следовательно, он может пропустить ненужную обработку и выполнять только работу, необходимую для получения желаемого результата. Кроме того, поскольку Python выполняет динамическую типизацию, тип возврата может измениться. Обратите внимание, как пример возвращает скаляр, список или кортеж... что угодно!

Ответ 8

Мне кажется, это лучший выбор:

val1, val2, ignored1, ignored2 = some_function()

Это не загадочно или уродливо (например, метод func() [index]) и четко указывает вашу цель.

Ответ 9

Когда у вас много выходных данных из функции, и вы не хотите называть ее несколько раз, я думаю, что самый лучший способ для выбора результатов:

results = fct()
a,b = [results[i] for i in list_of_index]

Как минимум рабочий пример, также демонстрирующий, что функция вызывается только один раз:

def fct(a):
    b=a*2
    c=a+2
    d=a+b
    e=b*2
    f=a*a
    print("fct called")
    return[a,b,c,d,e,f]

results=fct(3)
> fct called

a,b = [results[i] for i in [1,4]]

И значения будут такими, как ожидалось:

results
> [3,6,5,9,12,9]
a
> 6
b
> 12

Для удобства можно также использовать индексы списка Python:

a,b = [results[i] for i in [0,-2]]

Возвращает: a = 3 и b = 12

Ответ 10

Если это функция, которую вы используете все время, но всегда отбрасываете второй аргумент, я бы сказал, что менее беспорядочно создавать псевдоним для функции без второго возвращаемого значения с помощью lambda.

def func():
    return 1, 2

func_ = lambda: func()[0] 

func_()  # Prints 1