Возврат кортежа с помощью одного элемента из функции

Просто наткнулся на эту немного странность в Python и подумал, что я запишу, что напишу это как вопрос здесь, если кто-то еще попытается найти ответ с теми же бесплодными поисковыми терминами,

Похоже, что распаковка кортежей делает так, что вы не можете вернуть кортеж длины 1, если вы ожидаете перебрать возвращаемое значение. Хотя кажется, что взгляды обманывают. См. Ответы.

>>> def returns_list_of_one(a): ... return [a] ... >>> def returns_tuple_of_one(a): ... return (a) ... >>> def returns_tuple_of_two(a): ... return (a, a) ... >>> for n in returns_list_of_one(10): ... print n ... 10 >>> for n in returns_tuple_of_two(10): ... print n ... 10 10 >>> for n in returns_tuple_of_one(10): ... print n ... Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not iterable >>> 

4 Solutions collect form web for “Возврат кортежа с помощью одного элемента из функции”

Вы должны явно сделать его кортежем (см. Официальный учебник ):

 def returns_tuple_of_one(a): return (a, ) 

Это не ошибка, один кортеж построен по val, или (val,) . Это запятая, а не круглые скобки, которые определяют кортеж в синтаксисе python.

Ваша функция фактически возвращает себя, что, конечно, не является итерируемым.

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

Особой проблемой является построение кортежей, содержащих 0 или 1 элемент: синтаксис имеет некоторые дополнительные причуды для их размещения. Пустые кортежи создаются пустой парой круглых скобок; кортеж с одним элементом создается, следуя значению с запятой (недостаточно заключить в круглые скобки одно значение). Уродливый, но эффективный.

(a) не является одним кортежем элемента, это просто выражение в скобках. Используйте (a,) .

Вместо этой уродливой запятой вы можете использовать встроенный метод tuple() .

 def returns_tuple_of_one(a): return tuple(a) 
 
Interesting Posts for Van-Lav

Могу ли я «подделать» пакет (или хотя бы модуль) в python для тестирования?

csv.DictWriter – TypeError: __init __ () принимает не менее 3 аргументов (4 данных)

Извлечение медицинской информации с использованием Python

Как мне разрешить конфликт OptionParser и sphinx-build в большом проекте?

Django / MySQL-python – отключено подключение с использованием старого (pre-4.1.1) протокола аутентификации (включена опция «secure_auth» клиента)

поток файлов python ftp или многопроцессорный

Модуль Python C – Malloc не работает в конкретной версии Python

глобальное имя 're' не определено

Флакон Python и сообщения об ошибках пользовательского клиента

Как сделать IPython упорядочивать возможности завершения вкладок по классам?

Правила большого пальца для того, когда использовать перегрузку оператора в python

Захват stdout из скрипта в Python

Вызовите код Python из LLVM JIT

Используйте Часовню для обработки массивной матрицы

Дисбаланс в scikit-learn

Python - лучший язык программирования в мире.