2017-12-15 1 views
2

2つの浮動小数点数を含むタプルを作成しようとしました。例えば、(4.0, 4.0)である。しかし、2つのフロートが同じであったので、私は4.0, * 2を書きました。タプルを掛けるときのPython構文の詳細

私がしたいことは、(4.0,) * 2と書くことができます。 Pythonでは、タプルを整数で乗算して、この回数だけタプルを連結するようにPythonに指示します。従って(4.0,) * 2 = (4.0,) + (4.0,) = (4.0, 4.0)。 OK。

私がしたくなかったのは、4.0 * 2(カンマなし)です。実際には、浮動小数点4.0自体を24.0 * 2 = 8.0で乗算します。 OK。

しかし、これらの調整は起こっていません。代わりに8.0または(4.0, 4.0)の、私はかなりこの回答で驚いています

TypeError: 'int' object is not iterable 

を得ました。この構文がどのようにして2(この式の唯一の整数)の反復につながりますか?

答えて

6

これは、誤ったオペレータの解釈と混在する優先順位の問題です。

*(乗算)は、,4.0, 4.0 * 2 = 4.0, (4.0 * 2) = (4.0, 8.0)より高い優先度を持ちます。私の表現では、これは2つに何も乗算できないため、理解できません:4.0, <nothing> * 2。乗算は2項演算子であるため、左側に値がなければなりません。この値は4.0,でなければなりません。

バイナリ*オペレータの場合はこれが本当です。しかし、Pythonには単項の*演算子があり、その優先順位は,よりも高い。この単項演算子は、反復可能な場所を拡張するために使用されます。これは、さまざまな引数を持つ関数を定義または呼び出すときによく見られます。

def min(first, *others): ... 
data = tuple(4, 5, 6, 7) 
min(*data) 

私の式で使用されるのは、この演算子です。 Pythonは4.0, * 24.0, (*2)と解釈します。「タプルは4.0を最初の要素とし、その後にすべての要素を2に含めます。実際、整数は反復可能ではなく、Pythonはそれについて文句を言う。

>>> 4.0 , * (5.0 , 6.0) # equivalent of (4.0, (*(5.0, 6.0))) 
(4.0, 5.0, 6.0) 

証拠として、我々は実際に*単項演算子へのiterableを与えるこの式を計算することができます

関連する問題