最初に次のコードを見てください
x =1
y =2
tmp = x
x = y
y = tmp
print(x, y)
コードの出力は次のとおりです。21
次のコードを見てください。
x =1
y =2
x, y = y, x
print(x, y)
コードの出力は次のとおりです。21
x、y = y、x
このコードの背後にある意味は分解とカプセル化です
In [1]: t =1,2
In [2]: t
Out[2]:(1,2)
In [3]:type(t)
Out[3]: tuple #タプルを定義するときは、括弧を省略できます。
In [4]: t1 =(1,2)
In [5]: t2 =1,2
#t1とt2は同等です
In [6]: t1
Out[6]:(1,2)
In [7]: t2
Out[7]:(1,2)
したがって、カプセル化の結果はタプルである必要があります。
x、y = y、x
このコードの右側は(y、x)としてカプセル化されます
In [8]: lst =[1,2]
In [9]: first, second = lst
In [10]:print(first, second)12
要素の順序に従って、線形構造lstの要素を最初に変数に割り当てます。
In [11]: lst =list(range(5))
In [12]: head,*tail = lst
In [13]: head
Out[13]:0
In [14]: tail
Out[14]:[1,2,3,4]
In [15]:*lst2 = lst #左側にアスタリスクの付いた変数が必要です
File "<ipython-input-15-98211a44ccfb>", line 1*lst2 = lst
^
SyntaxError: starred assignment target must be in a list or tuple
In [16]:*head, tail = lst
In [17]: head
Out[17]:[0,1,2,3]
In [18]: lst
Out[18]:[0,1,2,3,4]
In [19]: tail
Out[19]:4
In [20]: head,*m1,*m2, tail = lst #複数のアスタリスクを含めることはできません。1つだけです。
File "<ipython-input-20-1fc1a52caa8e>", line 1
head,*m1,*m2, tail = lst
^
SyntaxError: two starred expressions in assignment
In [21]: v1, v2, v3, v4, v5, v6, v7 = lst #左側の変数の数は、右側の要素の数を超えることはできません
---------------------------------------------------------------------------
ValueError Traceback(most recent call last)<ipython-input-21-9366cfb498a1>in<module>()---->1 v1, v2, v3, v4, v5, v6, v7 = lst
ValueError: not enough values to unpack(expected 7, got 5)
In [22]: v1, v2 = lst #左側の変数の数は、右側の要素の数より少なくすることはできません
---------------------------------------------------------------------------
ValueError Traceback(most recent call last)<ipython-input-22-d7b0a4e7871e>in<module>()---->1 v1, v2 = lst
ValueError: too many values to unpack(expected 2)
次のルールとして要約されます。
解体は複数のレベルをサポートします
In [23]: lst =[1,(2,3),5]
In [24]: _, v,*_ = lst #vはに解決します(2,3)
In [25]: v
Out[25]:(2,3)
In [26]: _, val = v #vさらに分解することができます
In [27]: val
Out[27]:3
In [28]: _,(_, val),*_ = lst #ワンステップで分解可能
In [29]: val
Out[29]:3
In [30]: _,[*_, val],*_ = lst #中央部分をリストに分解します
In [31]: val
Out[31]:3
In [32]: _, _, val,*_ = lst # (2,3)2番目に解決_
In [33]: val
Out[33]:5
単一の下線_を使用することは、変数を破棄することを意味します。これはPythonの規則です。単一のアンダースコアもPythonの有効な識別子ですが、変数を破棄したくない場合は、通常、意味のある変数を示すために単一のアンダースコアを使用しません。それは慣習として理解することができます。
非常に複雑なデータ構造、多層のネストされた線形構造。分解を使用して値をすばやく抽出できます。これは非常に便利です。
たとえば、次の使用方法
In [1]: key, _, value ='I love Python'.partition(' love ')
In [2]: key
Out[2]:'I'
In [3]: value
Out[3]:'Python'
Recommended Posts