【问题标题】:Returning tuple with a single item from a function从函数返回带有单个项目的元组
【发布时间】:2011-07-13 16:14:04
【问题描述】:

刚刚在 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
>>>

【问题讨论】:

  • 感谢大家的解释。这很有意义。谁能解释投票否决?您可以看到我最初的想法是如何从函数返回值而不是元组本身的实际构造导致我进行了一堆徒劳的搜索和实验,因此提出来似乎很合适。 (虽然显然我选择的词可能会更好,请参阅上面的编辑。)

标签: python function return-value iterable-unpacking


【解决方案1】:

你需要明确地把它做成一个元组(见官方tutorial):

def returns_tuple_of_one(a):
    return (a, )

【讨论】:

  • 是的。实际上,构成元组的是逗号,而不是括号。
  • 是的。也很漂亮well documented
【解决方案2】:

这不是错误,单元组是由val,(val,) 构造的。在 python 语法中定义元组的是逗号而不是括号。

你的函数实际上是返回 a 本身,这当然是不可迭代的。

引用sequence and tuple docs

一个特殊的问题是包含 0 或 1 的元组的构造 items:语法有一些额外的怪癖来适应这些。空的 元组由一对空括号构成;一个元组 一个项目是通过在一个带有逗号的值后面构造的(它不是 足以将单个值括在括号中)。丑,但是 有效。

【讨论】:

    【解决方案3】:

    (a) 不是单个元素元组,它只是一个带括号的表达式。使用(a,)

    【讨论】:

      【解决方案4】:

      您可以使用tuple() 内置方法来代替那个难看的逗号。

      def returns_tuple_of_one(a):
          return tuple(a)
      

      【讨论】:

      • 我同意这更漂亮,但不幸的是tuple(10) 给出了相同的TypeError: 'int' object is not iterable
      • 同样不幸的是,tuple('HELLO') 产生了 ('H', 'E', 'L', 'L', 'O'),我不希望 returns_tuple_of_one('HELLO') 产生这种结果。
      猜你喜欢
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多