pythonの解凍シーケンス付与

3545 ワード

この言葉はみんなよく知られていないと信じています.聞いたこともありませんが、pythonが持っているこの機能は本当にアメリカ映画で興ったextra eggのように素晴らしいと言わざるを得ません.たとえば、n要素を含むメタグループやシーケンスがあるという問題に遭遇しました.その値を解凍して新しい変数に割り当てるにはどうすればいいですか.任意のシーケンス(または反復可能なオブジェクト)は、単純な付与文によって複数の変数に解凍され、付与されます.変数の数がシーケンス要素の数と同じであることが唯一の前提です.例:
>>>p = (4,5)
>>>x, y = p
#     
>>>x
>>>4
>>>y
>>>5
>>>data = ['Charlie', 50, 91.1,(1993,12,21)]
>>> name, shares, price, my_birhday = data
>>> name
'Charlie'
>>>my_birthday
(1993,12,21)
>>>name, shares,price, (year,mon,day)=data
>>>year
1993
>>>mon
12
>>>day
21

変数の個数と要素の個数が一致しない場合、ValueError: need more than xx values to unpack(xxは入力が少ない個数)という異常が発生しますが、実際には、リストやメタグループだけでなく、任意の反復オブジェクトにも使用できます.
複数の変数への割り当てを解除
反復可能なオブジェクトの要素数が変数を超えると、解凍値の異常が多すぎます.Pythonのアスタリスク式はこの問題を解決するために使用できます.例えば、ある授業を勉強して、期末の時、クラス全体の平均成績を統計したいのですが、最初と最後の点数を廃止して、4つの点数しかありません.私たちは手動で値をつけることができますが、もし成績がたくさんあれば?この場合、*で表すことができます.
def drop_grade(grades):
    first,*middle,last = grades
    return avg(middle)

もう1つのアプリケーションシーンは、名前、電話、雑多な情報を含むユーザーの記録リストを持っていると仮定して、ユーザーの記録を分解することができます.
>>>user_info = ('Charlie', '12345678909', '   ','   ', '996')
>>>name, phone, *info = user_info
>>> name
'Charlie'
>>>phone 
'12345678909'
>>>info
['   ','   ', '996']

解凍された変数は常にリストタイプであり、解凍されたinfoの数(0個を含む)にかかわらず、この方法を使用すると、そのタイプをチェックする必要はありません.
解凍構文は、文字列の分割など、文字列操作にも役立ちます.
>>> line = 'line = 'wo:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false'
>>>uname, *fields, homedir, sh = line.spilt(':')
>>>uname
'wo'
>>> homdir
'var/empty'
>>>sh
'/usr/bin/false'

使い終わったら、正規表現やループを使うべき場所があるのではないでしょうか.便利ではないでしょうか.