Возвращение кортежа с одним элементом из функции - PullRequest
16 голосов
/ 13 июля 2011

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

32 голосов
/ 13 июля 2011

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

def returns_tuple_of_one(a):
    return (a, )
13 голосов
/ 13 июля 2011

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

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

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

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

2 голосов
/ 13 июля 2011

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

0 голосов
/ 28 марта 2014

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

def returns_tuple_of_one(a):
    return tuple(a)
...