def rect_extend(x):
m, n = 1
while 1 < x:
m = m + 1
n = n + 1
return m, n
この単純な関数は次を返します。
'int' オブジェクトは反復可能ではありません
iPython のエラー。なぜこれを行うのかわかりません。while
機能が動作しません - 状態のようですtrue
。
( whileの条件は意図的に単純化されています。元のコードにはありません)
これを行うと、タプルのアンパックm, n = 1
と呼ばれ、次のように機能します。
>>> m, n = ('a','b')
>>> m
'a'
>>> n
'b'
1
はタプルではなく整数であるため、この奇妙なエラーが発生します。Pythonは整数を「ステップスルー」(または反復)して展開できないためです。そのため、エラーは 'int' object is not iterableです
私はあなたが欲しいと思います
m = 1
n = 1
また
m = n = 1
の代わりにm, n = 1
。
これ (シーケンスの解凍)[http://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences]:
x, y = z
あなたが思っていることとは違うことをします。
これは実際には次のことを意味します。
x = z[0] # The first item in z
y = z[1] # The second element of z
たとえば、次のようにします。
x, y, z = (1, 2, 4)
それで:
>>> x
1
>>> y
2
>>> z
4
あなたの場合、これは機能しません。これは1
整数であり、要素がないため、エラーが発生します。
タプル (およびスプラット演算子 - ) と組み合わせたシーケンス アンパックの便利な機能*
:
これ:
a, b = b, a
a
との値を交換しますb
。
アンパックrange
、定数に便利:
>>> RED, GREEN, BLUE = range(3)
>>> RED
0
>>> GREEN
1
>>> BLUE
2
スプラット演算子:
>>> first, *middle, last = 1, 2, 3, 4, 5, 6, 7, 8, 9
>>> first
1
>>> middle
[2, 3, 4, 5, 6, 7, 8]
>>> last
9