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

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

Решение

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

def returns_tuple_of_one(a):
    return (a, )

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

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

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

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

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

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

def returns_tuple_of_one(a):
    return tuple(a)
Другие вопросы по тегам