18

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

4 に答える 4

33

明示的にタプルにする必要があります (公式チュートリアルを参照してください):

def returns_tuple_of_one(a):
    return (a, )
于 2011-07-13T16:16:13.607 に答える
14

val,これはバグではなく、 orによって 1 タプルが構築され(val,)ます。Python 構文でタプルを定義するのは括弧ではなくコンマです。

あなたの関数は実際にはaそれ自体を返していますが、これはもちろん反復可能ではありません。

シーケンスとタプルのドキュメントを引用するには:

特別な問題は、0 個または 1 個のアイテムを含むタプルの構築です。構文には、これらに対応するためのいくつかの特別な癖があります。空のタプルは、括弧の空のペアで構成されます。1 つの項目を持つタプルは、値の後にコンマを付けることによって作成されます (単一の値を括弧で囲むだけでは十分ではありません)。醜いが効果的。

于 2011-07-13T16:18:08.020 に答える
2

(a)単一要素のタプルではなく、括弧で囲まれた式です。を使用し(a,)ます。

于 2011-07-13T16:18:22.390 に答える
-2

tuple()その醜いコンマの代わりに、組み込みメソッドを使用できます。

def returns_tuple_of_one(a):
    return tuple(a)
于 2014-03-27T20:49:10.487 に答える