Скажем, у меня есть функция Python, которая возвращает несколько значений в кортеже:
def func():
return 1, 2
Есть ли хороший способ игнорировать один из результатов, а не просто присваивать временную переменную? Скажите, если бы меня интересовало только первое значение, есть ли лучший способ, чем этот:
x, temp = func()
~
в качестве синтаксиса игнорирование определенной возвращаемой переменнойОтветы:
Одно общее соглашение заключается в использовании «_» в качестве имени переменной для элементов кортежа, которые вы хотите игнорировать. Например:
источник
Вы можете использовать,
x = func()[0]
чтобы вернуть первое значение,x = func()[1]
вернуть второе и так далее.Если вы хотите получить несколько значений одновременно, используйте что-то вроде
x, y = func()[2:4]
.источник
func()[2:4]
если вы хотите только некоторые из возвращаемых значений._, _, _, _, _, _, _, _, _, _, _, _, _, a, _, _, _, _, _, _, _, _, _, _, _, b, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, c, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, d, _, _, _, _, _, _, _, _, e, _ = func()
это менее понятно, чем многократный вызов функции, но это только мое мнение. Если ваша функция возвращает столько элементов, я думаю, что было бы предпочтительнее использовать numpy:a, b, c, d, e = func()[[13, 25, 58, 89, 98]]
result = func()
a = result[13]
b = result[25]
...x, __, y = func()
Если вы используете Python 3, вы можете использовать звездочку перед переменной (слева от присваивания), чтобы она была списком при распаковке.
источник
a, *_ = f()
чтобы игнорировать произвольное количество возвращаемых значений послеa
.Помните, что когда вы возвращаете более одного предмета, вы действительно возвращаете кортеж. Так что вы можете делать такие вещи:
источник
Обычная практика - использовать фиктивную переменную
_
(одиночное подчеркивание), как многие указывали здесь ранее.Однако, чтобы избежать коллизий с другими использованиями этого имени переменной (см. Этот ответ), было бы лучше использовать
__
вместо этого (двойное подчеркивание) в качестве одноразовой переменной, как указано ncoghlan . Например:источник
a, _, _ = 1,8,9
. До этого момента он хранит результат последнего выполненного оператора, который, если вы хотите перехватить, обычно использует переменную для хранения этого значения. И именно поэтому «_» - это рекомендуемое имя переменной для перехвата ненужных значений. '_' значения перезаписываются вскоре после выполнения другого оператора. В случае '_ _' значение будет оставаться там до тех пор, пока GC не очистит его.Три простых варианта
очевидный
отвратительный
И есть способы сделать это с декоратором.
источник
_
переменную. Совершенно очевидно, что вы игнорируете значениеx, _ = func()
отвратительно иx = func()[0]
очевидно. Присваивание переменной, а затем ее не использование? Функция возвращает кортеж; индексировать это как кортеж.;)
, список таких как методы доступаa[0]
,a[:]
(список копия),a[::2]
(каждые два элемента), иa[i:] + a[:i]
(вращать список), действительно, также очевидно и каноническим.Лучшее решение, вероятно, состоит в том, чтобы называть вещи, а не возвращать бессмысленные кортежи. Если за порядком возвращенных товаров нет логики.
Вы даже можете использовать namedtuple, если хотите добавить дополнительную информацию о том, что вы возвращаете (это не просто словарь, это координаты):
Если объекты в вашем словаре / кортеже сильно связаны друг с другом, то было бы неплохо даже определить класс для него. Таким образом, вы также сможете определить взаимодействие между объектами этого типа и дать API о том, как с ними работать. Естественный вопрос: когда мне следует использовать классы в Python? ,
источник
Это кажется лучшим выбором для меня:
Он не загадочный и не уродливый (как метод func () [index]), и в нем четко указана ваша цель.
источник
Это не прямой ответ на вопрос. Скорее, он отвечает на этот вопрос: «Как выбрать вывод конкретной функции из множества возможных вариантов?».
Если вы можете написать функцию (т. Е. Ее нет в библиотеке, которую вы не можете изменить), то добавьте входной аргумент, который указывает, что вы хотите от функции. Сделайте его именованным аргументом со значением по умолчанию, чтобы в «общем случае» вам даже не приходилось его указывать.
Этот метод дает функцию «расширенное предупреждение» относительно желаемого выхода. Следовательно, он может пропустить ненужную обработку и выполнять только работу, необходимую для получения желаемого результата. Кроме того, поскольку Python выполняет динамическую типизацию, тип возвращаемого значения может измениться. Обратите внимание, как пример возвращает скаляр, список или кортеж ... что угодно!
источник
Если это функция, которую вы используете все время, но всегда отбрасываете второй аргумент, я бы сказал, что создавать псевдоним для функции без использования второго возвращаемого значения не так уж и сложно
lambda
.источник
Если у вас много выходных данных из функции, и вы не хотите вызывать ее несколько раз, я думаю, что самый простой способ выбрать результаты:
Как минимальный рабочий пример, также демонстрирующий, что функция вызывается только один раз:
И значения, как и ожидалось:
Для удобства можно также использовать индексы списка Python:
Возвращает: а = 3 и б = 12
источник