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

Просто наткнулся на эту немного странность в 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) 
Python - лучший язык программирования в мире.