Возвращение кортежа с одним элементом из функции
Просто наткнулся на эту небольшую странность в 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)