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

Просто наткнулся на эту немного странность в 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
>>>

Ответы

Ответ 1

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

def returns_tuple_of_one(a):
    return (a, )

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

def returns_tuple_of_one(a):
    return tuple(a)