ホームページ  >  記事  >  バックエンド開発  >  Python の関数パラメーターの詳細な紹介 (例付き)

Python の関数パラメーターの詳細な紹介 (例付き)

不言
不言オリジナル
2018-09-06 17:59:483317ブラウズ

この記事では、Python の関数パラメータについて詳しく説明します (例とともに)。一定の参考値があります。必要な友人は参照できます。お役に立てれば幸いです。

Python の関数定義は比較的単純で、キーワード def を使用して実装されていますが、パラメーターは非常に柔軟です。通常定義される必須パラメータに加えて、デフォルト パラメータ、変数パラメータ、キーワード パラメータ、名前付きキーワード パラメータ、およびパラメータの組み合わせも使用できます。これにより、関数によって定義されたインターフェイスで複雑なパラメータを処理できるだけでなく、呼び出しも簡略化できます。演算子のコード

1. 位置パラメータ

関数を定義するときに、パラメータの位置順序を指定します。位置パラメータは、呼び出される関数定義内の正確な順序で渡す必要があります。

例: 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'

2. デフォルトパラメータ

関数定義では、パラメータのデフォルト値があらかじめ定義されています。関数が呼び出されるとき、パラメータに指定された値が指定されていない場合は、デフォルト値が使用されます。
たとえば、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

可変パラメータ、つまり、渡されるパラメータの数は 0 から任意の数まで可変です。 パラメータの数は不確実であるため、リストまたはタプルを使用して渡すことができます。関数が呼び出されるときに、それは自動的にタプルにアセンブルされます。

例:

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

キーワード パラメータ **kw を使用すると、パラメータ名を含む任意の数のパラメータに 0 を渡すことができます。これらのキーワード パラメータは自動的にアセンブルされて、関数内の辞書。例:
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'}

主要なパラメータは何に使用されますか?関数の機能を拡張することができます。たとえば、person() 関数では、name と age という 2 つのパラメータを受け取ることが保証されています。ただし、さらに多くのパラメーターが指定されている場合は、それらを受け取ることもできます。もちろん、最初に辞書を組み立ててから、その辞書をキーワード パラメータに変換して渡すこともできます。

>>> 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中函数的可变参数

理解Python中函数的参数

以上がPython の関数パラメーターの詳細な紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。