この記事では、Python の関数パラメータについて詳しく説明します (例とともに)。一定の参考値があります。必要な友人は参照できます。お役に立てれば幸いです。
Python の関数定義は比較的単純で、キーワード def を使用して実装されていますが、パラメーターは非常に柔軟です。通常定義される必須パラメータに加えて、デフォルト パラメータ、変数パラメータ、キーワード パラメータ、名前付きキーワード パラメータ、およびパラメータの組み合わせも使用できます。これにより、関数によって定義されたインターフェイスで複雑なパラメータを処理できるだけでなく、呼び出しも簡略化できます。演算子のコード
関数を定義するときに、パラメータの位置順序を指定します。位置パラメータは、呼び出される関数定義内の正確な順序で渡す必要があります。
例: x
def powern(x,n): s = 1 while n >0: s = s * x n = n -1 return sの n 乗を計算します。
2 つのパラメーター x と n は位置パラメーターです。関数を呼び出す際には、渡された 2 つの値を位置順にパラメータ x と n に渡して代入する必要があり、デフォルトで省略されている場合はエラーが報告されます。例:
>>> powern(5) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: powern() missing 1 required positional argument: 'n'
関数定義では、パラメータのデフォルト値があらかじめ定義されています。関数が呼び出されるとき、パラメータに指定された値が指定されていない場合は、デフォルト値が使用されます。
たとえば、x の n 乗を求める作業はまだ残っていますが、デフォルトは x の 3 乗です。
def powern( x,n = 3): s = 1 while n >0: s = s * x n = n -1 return s
実行: powern(2) (powern(2,3) の呼び出しと同等)
2 の 4 乗が必要な場合は、powern(2,4)## を実行する必要があります。
#デフォルトのパラメータを設定する利点は何ですか? デフォルト パラメーターを使用すると、関数呼び出しが簡素化され、関数呼び出しの難しさが軽減されます。単純な呼び出しであっても複雑な呼び出しであっても、定義する必要がある関数は 1 つだけです。
たとえば、上記の powern() の例では、n の他の値が渡されると、x の他の n 乗を実現できます。
関数パラメータとしての不変パラメータ
>>> a = 1 >>> def func(a): ... print('func_id:',id(a)) ... a = 2 ... print('after_func_id:',id(a),'id(2):',id(2)) ... >>> print('out_of_func_id:',id(a),'id(1):',id(1)) out_of_func_id: 501962480 id(1): 501962480 # 全局变量a的id >>> func(a) # 将全局参数a传入函数 func_id: 501962480 # a=1 的id after_func_id: 501962496 id(2): 501962496 >>> print(a) # 退出函数,a的值仍为1 1グローバル a を関数に渡すとき、その後、関数は参照のコピーを自動的にコピーします。 a=2を実行すると、id(a)のメモリアドレスが変化します。しかし、それは外側のaとは何の関係もありません。
関数パラメータとしての変数オブジェクト
>>> a = [] >>> def func2(a): ... print('func2_id:',id(a)) ... a.append(1) ... >>> print('out_of_func2_id',id(a)) out_of_func2_id 59694296 >>> func2(a) func2_id: 59694296 >>> print(a) [1]変数 a の型はリストであり、変数オブジェクトです。関数の参照は可変オブジェクトを指しており、アドレスは変化しないため、関数の操作後に a の内容が変化します。
そのため、func2(a) 関数を再度実行すると、結果は予期した結果と異なります。
>>> func2(a) func2_id: 59694296 # a地址不变 >>> print(a) [1, 1] # 因为第一次执行func2(a)时,已经修改了a=[1],再次调用时,在[1]里新增例:
def add_end( L=[] ): # 设置为一个list变量L(对象可变) L.append('end') return L >>> add_end( ) ['end'] >>> add_end() ['end', 'end']デフォルトのパラメーターが繰り返し呼び出される場合、結果が間違っています。
Python 関数が定義されると、デフォルトのパラメーター L の値が計算されます。これは [] です。 L もオブジェクト [] を指す変数です。関数が呼び出されるたびに、L の内容が変更されると、次回呼び出されたときにデフォルト パラメータの内容が変更され、変更されなくなります。関数が定義されたときの []。
を
def add_end( L=None ): # L为不变对象 if L is None: L = [] L.append('end') return Lに変更すると、何度呼び出しても問題ありません。
したがって、デフォルト パラメータを定義するときに留意すべきことが 1 つあります。
デフォルト パラメータは不変オブジェクトを指す必要があります。不変オブジェクトが作成されると、オブジェクト内のデータは変更できないため、データの変更によって発生するエラーが減少します。 さらに、オブジェクトは変更されないため、マルチタスク環境でオブジェクトを同時に読み取る場合、ロックは必要ありません。
デフォルトパラメータを設定する場合、いくつかの注意点があります。 1.必須パラメータが最初に来て、デフォルトパラメータが最後に来ます。そうしないと、Python インタープリタはエラーを報告します。 ### 二。デフォルトのパラメータを設定するにはどうすればよいですか?関数に複数のパラメーターがある場合は、変化の大きいパラメーターを前に配置し、変化の小さいパラメーターを後ろに配置します。変更が少ないパラメータはデフォルトのパラメータとして使用できます。 ### 三つ。変更可能なオブジェクトをデフォルトのパラメータとして使用しないでください。
3. 可変パラメータ *args
def calc(numbers): # 变量 sum = 0 for n in numbers: sum = sum + n * n return sum >>> calc( [1,2,3] ) # 传入的是一个list 14
def calc( *numbers ): sum = 0 for n in numbers: # 在函数内部,numbers组装成一个tuple sum = sum + n * n return sum >>> calc( ) # 0个参数 0 >>> calc( 1,3,5,7 ) # 多个参数 84 >>> num = [1,2,3] # list >>> calc( *num ) # *list –> tuple 14 >>> t = (1,3,5) >>> calc( t ) # tuple(错误) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in calc TypeError: can't multiply sequence by non-int of type 'tuple' >>> calc( *t ) 35関数コードはまったく変更されません。ただし、この関数を呼び出すときは、0 個のパラメーターを含め、任意の数のパラメーターを渡すことができます。
4. キーワード パラメータ **kw
def person(name , age , **kw ): print('name:',name,'age:',age,'other:',kw) >>> person('xiong',18) name: xiong age: 18 other: {} >>> person('xiong',18,city = 'SH') # city是原本没有的参数,但是因为有**kw name: xiong age: 18 other: {'city': 'SH'}
>>> extra ={'city':'shanghai','job':'SET'} # dict的定义 >>> person('xiong',18,city = extra['city'],job=extra['job']) # dict的使用 name: xiong age: 18 other: {'city': 'shanghai', 'job': 'SET'} # dict的内容 >>> person('xiong',18,**extra) name: xiong age: 18 other: {'city': 'shanghai', 'job': 'SET'}[概要] **extra は、追加の辞書のすべてのキーと値を渡すことを意味しますキーワード パラメータに変換します。関数の **kw パラメータ、kw は辞書を取得します。kw によって取得された辞書は extra のコピーであることに注意してください。kw を変更しても、関数の外側の extra には影響しません。
如果要限制关键字参数的名字,就可以用命名关键字参数。需要一个特殊分隔符“”,“”后面的参数被视为命名关键字参数。如果缺少“*”,Python解释器则无法识别位置参数和命名关键字参数。在调用时,必须指定参数名字与参数值。
例如,只接收city和job作为关键字参数,可以使用如下定义:
def person( name ,age,*,city,job): print(name , age , city , job ) >>> person('xiong', 18, city='shanghai', job='tester') xiong 18 shanghai tester
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
>>> def person( name,age,*args,city,job ): # 此处city和job也是命名关键字参数 ... print(name, age, city, job)
命名关键字参数必须传入参数名,如果没有传入参数名,调用将会报错:
>>> person('xlp',18,'shanghai','tester') # 错误调用 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: person() missing 2 required keyword-only arguments: 'city' and 'job' >>> person('xlp',18,city='shanghai',job='tester') # 正确调用 xlp 18 shanghai tester
命名关键字参数可以有缺省值,从而简化调用:
>>> def person1(name,age,*,city='shanghai',job): ... print(name,age,city,job) ... >>> person1('xlp',18,job='engineer') xlp 18 shanghai engineer
在Python中定义函数,可以用位置参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。
但是要注意,参数定义的顺序必须是:位置参数、默认参数、可变参数、命名关键字参数和关键字参数。
(1)定义可变参数和关键字参数的语法:
*args是可变参数,args接收的是一个list、tuple;
**kw是关键字参数,kw接收的是一个dict;
(2)调用函数时如何传入可变参数和关键字参数的语法:
可变参数直接传入:func(1,2,3)
可变参数间接传入:先组装成list或tuple,l=(1,2,3),再通过args传入,func(l)
关键字参数直接传入:func(a=1,b=2)
关键字参数间接传入:先组装成dict,d={‘a’:1,’b’:2},再通过kw传入,func(d)
(3)命名关键字参数 是为了限制调用者可以传入的参数名,同时可以提供默认值。
(4)定义命名的关键字参数在没有可变参数的情况下,不要忘记写分隔符*,否则定义的将是位置参数
相关推荐:
以上がPython の関数パラメーターの詳細な紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。