関数パラメータ
1. デフォルト値のパラメータ
カスタム関数では、呼び出し時にパラメータが設定されていない場合、現時点で必要となるデフォルト値を指定する必要がある場合があります。 . デフォルト値のパラメータ。
# -*- coding: UTF-8 -*- def print_user_info( name , age , sex = '男' ): # 打印用户信息 print('昵称:{}'.format(name) , end = ' ') print('年龄:{}'.format(age) , end = ' ') print('性别:{}'.format(sex)) return; # 调用 print_user_info 函数 print_user_info( '两点水' , 18 , '女') print_user_info( '三点水' , 25 )
出力結果:
昵称:两点水 年龄:18 性别:女 昵称:三点水 年龄:25 性别:男
デフォルトパラメータを設定した場合、関数呼び出し時にパラメータを渡さなければデフォルト値が使用されることがわかります。ただし、ここで注意すべき点が 1 つあります: 仮パラメータ リストの最後にあるパラメータのみがデフォルトのパラメータ値を持つことができます。つまり、関数のパラメータを宣言する場合、最初にデフォルト値を使用してパラメータを宣言し、次にデフォルト値を指定せずにパラメータを宣言することはできません。デフォルト値、仮パラメータ。これは、仮パラメータに割り当てられる値が位置的に割り当てられるためです。たとえば、def func(a, b=1) は有効ですが、def func(a=1, b) は無効です。
デフォルト値パラメータはこれで終わりですか?まだです。よく考えてください。パラメーターが lsit (リスト) や dict (辞書) などの変更可能なコンテナーである場合、デフォルト値として何を使用する必要がありますか?デフォルト値として None を使用できます。次の例のようになります:
# 如果 b 是一个 list ,可以使用 None 作为默认值 def print_info( a , b = None ): if b is None : b=[] return;
例をよく見てください。このような質問はありますか?パラメータで直接 b=[] を使用することはできないでしょうか?つまり、次のように書かれています:
def print_info( a , b = [] ): return;
ですよね?実行してみてもエラーは出なかったのですが、このように書いても良いでしょうか?ここで特別な注意が必要な点が 1 つあります。デフォルト パラメータの値は、None、True、False、数値、文字列などの不変オブジェクトです。上記のように操作すると、デフォルト値が他の場所で変更されたときに問題が発生します。あらゆる種類のトラブル。これらの変更は、次回この関数が呼び出されるときのデフォルト値に影響します。
例は次のとおりです:
# -*- coding: UTF-8 -*- def print_info( a , b = [] ): print(b) return b ; result = print_info(1) result.append('error') print_info(2)
出力結果:
[] ['error']
注意深く観察すると、2 番目の出力値がまったく望んでいないことがわかるため、これは避けてください。 . 動作します。
もう 1 つ、デフォルト値が不要な場合があります。デフォルト パラメータに値が渡されているかどうかを判断したいだけです。これを行うことができます:
_no_value =object() def print_info( a , b = _no_value ): if b is _no_value : print('b 没有赋值') return;
ここでのオブジェクトは、Python のすべてのクラスの基本クラスです。オブジェクト クラスのインスタンスを作成することはできますが、これらのインスタンスは有用なメソッドを持たず、インスタンス データも持たないため、実際には役に立ちません (インスタンス ディクショナリがないため、作成することもできません)。任意のプロパティ値を設定します)。できることは身元をテストすることだけです。この機能は、値の入力があるかどうかを判断するためにも使用できます。
2. キーワード パラメーター
Python では、パラメーター リストの定義順序を気にせずに、パラメーター名を使用して関数にパラメーターを渡すことができます。と呼ばれるキーワードパラメータです。主要なパラメーターを使用することには 2 つの利点があります。
まず、パラメーターの順序を気にする必要がないため、関数の使用が簡単になります。
2. 他のパラメータにデフォルト値があると仮定すると、必要なパラメータにのみ値を割り当てることができます
# -*- coding: UTF-8 -*- def print_user_info( name , age , sex = '男' ): # 打印用户信息 print('昵称:{}'.format(name) , end = ' ') print('年龄:{}'.format(age) , end = ' ') print('性别:{}'.format(sex)) return; # 调用 print_user_info 函数 print_user_info( name = '两点水' ,age = 18 , sex = '女') print_user_info( name = '两点水' ,sex = '女', age = 18 )
出力値:
昵称:两点水 年龄:18 性别:女 昵称:两点水 年龄:18 性别:女
3.不定長パラメータ
関数インターフェイスを設計するときに、可変長パラメーターが必要になる場合があります。つまり、渡されるパラメーターの数を事前に決定することはできません。 Python には、直接定義されていないパラメータを受け入れるためのタプル メソッドが用意されています。このメソッドは、パラメーターの前にアスタリスク * を追加します。関数の呼び出し時にパラメータが指定されていない場合、その関数は空のタプルになります。名前のない変数を関数に渡すこともできません。
例:
# -*- coding: UTF-8 -*- def print_user_info( name , age , sex = '男' , * hobby): # 打印用户信息 print('昵称:{}'.format(name) , end = ' ') print('年龄:{}'.format(age) , end = ' ') print('性别:{}'.format(sex) ,end = ' ' ) print('爱好:{}'.format(hobby)) return; # 调用 print_user_info 函数 print_user_info( '两点水' ,18 , '女', '打篮球','打羽毛球','跑步')
出力結果:
昵称:两点水 年龄:18 性别:女 爱好:('打篮球', '打羽毛球', '跑步')
出力結果から、*hobby は可変パラメータであり、hobby は実際にはタプルであることがわかります (オリジナル) ancestor)
可変長パラメータはキー パラメータもサポートしています。未定義のキー パラメータは辞書に配置されます。この方法は、パラメータの前に ** を追加し、上記の例を次のように変更します。
# -*- coding: UTF-8 -*- def print_user_info( name , age , sex = '男' , ** hobby ): # 打印用户信息 print('昵称:{}'.format(name) , end = ' ') print('年龄:{}'.format(age) , end = ' ') print('性别:{}'.format(sex) ,end = ' ' ) print('爱好:{}'.format(hobby)) return; # 调用 print_user_info 函数 print_user_info( name = '两点水' , age = 18 , sex = '女', hobby = ('打篮球','打羽毛球','跑步'))
出力結果:
昵称:两点水 年龄:18 性别:女 爱好:{'hobby': ('打篮球', '打羽毛球', '跑步')}
上記の例とこの例を比較すると、次のようになります。 *hobby は変数パラメータであり、hobby は実際にはタプル (元の祖先) であり、**hobby はキーワード パラメータであり、hobby は dict (辞書) です。
4. キーワード パラメータのみを受け入れます
キーワード パラメーターは使いやすく、パラメーター エラーが発生しにくいです。そのため、定義した関数で、キーワード パラメーターを使用して特定のパラメーターを渡す必要がある場合があります。このとき、どうすればよいでしょうか?
この効果は、* パラメータまたは単一の * の後に必須のキーワード パラメータを配置することで実現できます。例:
# -*- coding: UTF-8 -*- def print_user_info( name , *, age , sex = '男' ): # 打印用户信息 print('昵称:{}'.format(name) , end = ' ') print('年龄:{}'.format(age) , end = ' ') print('性别:{}'.format(sex)) return; # 调用 print_user_info 函数 print_user_info( name = '两点水' ,age = 18 , sex = '女' ) # 这种写法会报错,因为 age ,sex 这两个参数强制使用关键字参数 #print_user_info( '两点水' , 18 , '女' ) print_user_info('两点水',age='22',sex='男')
この例から、年齢と性別のキーワードが指定されていないことがわかります。該当するパラメータはエラーを報告します。
多くの場合、必須のキーワード パラメーターを使用すると、位置パラメーターを使用するよりも意味が明確になり、プログラムが読みやすくなります。必須のキーワード パラメータを使用することは、**kw パラメータを使用するよりも優れており、必須のキーワード パラメータは、より高度な状況でも役立ちます。