从函数返回单个项的元组
我刚遇到一个在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 个回答
2
(a)
其实不是一个包含单个元素的元组,它只是一个用括号括起来的表达式。要表示一个只有一个元素的元组,应该用 (a,)
。
14
这不是一个错误,只有一个元素的元组是通过 val,
或者 (val,)
来创建的。在Python的语法中,定义元组的是逗号,而不是括号。
你的函数实际上返回的就是 a
本身,而 a
当然是不可迭代的。
引用一下 关于序列和元组的文档:
一个特殊的问题是构造包含0个或1个元素的元组:这个语法有一些额外的细节来处理这些情况。空元组是通过一对空的括号来构造的;而一个包含单个元素的元组是通过在值后面加一个逗号来构造的(仅仅把一个值放在括号里是不够的)。虽然看起来有点奇怪,但确实有效。
33
你需要明确地把它变成一个元组(可以参考官方的教程):
def returns_tuple_of_one(a):
return (a, )