Python のアスタリスクは、乗算の数値演算や累乗演算に使用されるだけでなく、複数のパラメーターの受信や変数の逆アセンブリを実現するために「変数の前に 1 つまたは 2 つのアスタリスクを追加する」という特別な使用法もあります。 「アスタリスクパラメータ」の使い方を詳しく紹介します。
1. アスタリスク変数とは何ですか?
最初に、アスタリスク変数は関数のパラメータを渡すために使用されます。この位置は Convert it で任意の数の非キーワード パラメータを受け取ります。 *b の位置でタプルに変換され、二重アスタリスクは、この位置が任意の数のキーワード パラメーターを受け取り、**b の位置で辞書に変換することを意味します:
#!/usr/bin/env python #coding=utf-8 #-------- def one(a,*b): """a是一个普通传入参数,*b是一个非关键字星号参数""" print(b) one(1,2,3,4,5,6) #-------- def two(a=1,**b): """a是一个普通关键字参数,**b是一个关键字双星号参数""" print(b) two(a=1,b=2,c=3,d=4,e=5,f=6)
#プログラム出力
(2, 3, 4, 5, 6) {'b': 2, 'c': 3, 'e': 5, 'f': 6, 'd': 4}
#出力からわかるように、最初の関数では、キーワードのない任意の数のパラメーターを *b の位置に渡すことができ、*b はこれらの受信パラメーターをタプルに変換します。次の呼び出し
one(1,2,3,4,5,6)
# one(a,*b) を渡した後は、
one(1,(2,3,4, 5 ,6))
#2 番目の関数では、**b の位置は任意の数のキーワード パラメーターを受け取ることができます。次の呼び出しでは
two(a=1,b=2,c=3,d)。 =4,e=5,f=6)
#one(a,*b) を渡すと、
two(a=1,{'b': 2, 'c': 3, ' e': 5, 'f': 6, 'd': 4})
一重アスタリスクと二重アスタリスクの基本的な使い方を理解した後、それらの拡張的な使い方を見てみましょう。
2. 単一のアスタリスク変数の例
単一のアスタリスク変数は、関数のパラメーター転送でのみ使用できるわけではありません。実際、通常の変数に単一のアスタリスク接頭辞を使用すると、変数を単一の要素に分割できます。 :
#!/usr/bin/env python #coding=utf-8 #-------- def one(*x): """输出传入的第一个参数""" print(x[0]) #-------- lst=["a","b","c","d"] stri="www.pythontab.com" one(stri,lst) one(*lst) one(*stri)
#プログラム出力
www.pythontab.com a w
#one(stri,lst)が初めて呼び出されるとき、one(*x)を置換した後、それは
one(([ "a","b","c","d"],"www.pythontab.com"))
#2 回目に one(*lst) を呼び出し、one(*x) を置き換えて、待ってください。価格は
one(("a","b","c","d")) と同じです
#one( を置き換えた後、one(*stri) が 3 回呼び出される*x)、それは
one(("w","w","w",".","q","i","n","g","s"," と同等です) w","o"," r","d",".","c","o","m"))
#変数の前に単一のアスタリスクを使用する場合、これは実際には変数の逆アセンブリ操作であり、変数内の個々の要素を分解し、one() 関数に渡した後、one() 関数は渡された要素を保存します。 print(x[0]) が最初の要素を抽出できる理由
これを検証するために、one() 関数を次のように変更します。
#!/usr/bin/env python #coding=utf-8 #-------- def one(*x): """一个错误的实例,尝试修改传入的第一个参数值,引发异常""" print(x[0]) x[0]="pythontab" lst=["a","b","c","d"] one(*lst)
#リストが変更できることはわかっています。リストが分割された後、one() 関数が渡され、関数内の最初の要素の値を変更しようとします。その結果、渡された値に関係なく、「TypeError」例外がトリガーされます。この結果の理由は上記で説明されています。one(*x) がこれらの受信パラメーターを受け取った後、元の型は何ですか? *x の位置にある場合、それらは「タプル」として保存され、タプルは変更できません
いくつかの例を見てみましょう :
#!/usr/bin/env python #coding=utf-8 #-------- def one(*x): """打印出传入参数""" for a in x: print(a) lst=["abc",123,"www.pythontab.com"] stri="abcd" dect={1:"one",2:"two",3:"three"} one(*lst) one(*stri) one(*dect)
#プログラム出力
abc 123 www.pythontab.com a b c d 1 2 3
#最初の 2 つの呼び出しは理解しやすいですが、最後に辞書要素を渡しましたが、実際には、単一のアスタリスクには値が含まれていないことがわかりました。辞書内のキーを常に読み取ります。辞書内の値を読みたい場合は、二重アスタリスク
三、二重アスタリスク変数の例
を使用する必要があります。セクション 2 の最後で、単一のアスタリスクを使用して辞書を分割し、それを関数に渡しますが、取得できるのは辞書のキーのみです。 ここでは、二重のアスタリスクを使用して辞書の値を取得する方法を示します。
#プログラム出力
#!/usr/bin/env python #coding=utf-8 #-------- def one(**x): """将传入的关键字参数的值保存成元组输出""" print(x) b=() for a in x.keys(): b+=(x[a],) print(b) dect={"one":1,"two":2,"three":3} one(**dect)
#辞書に二重アスタリスク接頭辞を使用することは、辞書をキーワードパラメータに分割することと同等です **dect は分割することと同等です 辞書は次のように分割されます
one=1, two=2, three=3
# 上記のキーワード パラメータを one(**x) に渡すことは、次と同等です (前のことを思い出してください。つまり、二重アスタリスクは受け取ったすべてのキーワード パラメータを辞書に保存します) )
one({"one":1,"two":2,"three":3})
# 辞書なので、辞書内のメソッドはすべて使用できます。辞書のキーを走査し、タプルを使用してこれらのキーに対応する値を追加し、最後にタプルを出力します
追伸: 注: これを使用してください。この方法で辞書を関数に渡す場合、名前付けは辞書のキーは Python 変数の命名規則に従う必要があります。上記の分析から、二重アスタリスクが最初に辞書をキーワード パラメータの形式に変換することは、辞書内のキーを使用するのと同じであることがわかります。キーが変数の命名規則に準拠していない場合は、「TypeError」例外がスローされます。上記の辞書のキーと値を逆にして、数字をキーとして使用してみてください。という疑問が起こります。
在一个函数的接收参数中,同时出现"非关键字参数(位置参数)"和"关键字参数"时,可以使用一个单星号来分隔这两种参数,例如:
#!/usr/bin/env python #coding=utf-8 #-------- def mix(a,b,*,x,y): """位置参数与关键字参数混合""" return a,b,x,y #星号前面的a和b是位置参数,星号后面的x和y是关键字参数,调用mix()函数并传入参数时,关键字参数一定要使用"变量名=值"的形式传入数据,如果同位置参数一样传入数据,就会引发一个TypeError异常 print(mix(1,2,x=3,y=4))
#程序输出
(1, 2, 3, 4)
#在上面的mix函数中,如果位置参数与关键字参数之间已经存在了一个单星号位置参数,那么,这个参数后面的就都是关键字参数,也不需要再使用星号来分隔他们了,例如
#!/usr/bin/env python #coding=utf-8 #-------- def mix(a,b,*c,x,y): """位置参数与关键字参数混合""" return a,b,c,x,y #在*c的位置可以输入任意多个位置参数值 print(mix(1,2,3,4,5,x=6,y=7))
#程序输出
(1, 2, (3, 4, 5), 6, 7)
如果我们要在一个函数中包含多种参数的组合,必须遵守这样的顺序:位置参数(必选参数),默认参数,单星号参数或星号分隔符,关键字参数,双星号参数;
请看下面的实例:
#!/usr/bin/env python #coding=utf-8 #-------- def mix(a,b=0,*c,x,**y): """位置参数与关键字参数混合""" return a,b,c,x,y print(mix(1,2,3,4,5,x=6,y=7,z=8))
#程序输出
(1, 2, (3, 4, 5), 6, {'y': 7, 'z': 8})