Contents
Python関数
既にご存知の通り、Pythonはprint()などの多くの組み込み関数を提供しますが、独自の関数を作成することもできます。これらの関数はユーザー定義関数と呼ばれます。
関数の定義
Pythonで関数を定義する簡単な規則を以下に示します。
- 関数ブロックは、キーワードdef、関数名、カッコ(())で始まる。
- カッコ内には、入力パラメータまたは引数を配置する必要があります。またこれらの括弧内にパラメータを定義することも可能。
- 関数の最初のステートメントは、オプションのステートメント(関数またはドキュメントストリングのドキュメンテーション文字列)です。
- すべての関数内のコードブロックはコロン(:)で始まりインデントされます。
- 文return [expression]は関数を終了し、必要に応じて式を呼び出し元に戻します。引数のないreturn文は、返り値Noneと同じです。
構文
def functionname( parameters ): "function_docstring" function_suite return [expression]
デフォルトでは、パラメータは位置的な振る舞いを持ち、定義されたのと同じ順序で通知する必要があります。
例
次の関数は文字列を入力パラメータとして標準画面に出力します。
def printme( str ): "This prints a passed string into this function" print str return
関数の呼び出し
関数を定義することは、名前だけを与え、関数に含めるパラメータを指定し、コードブロックを構造化します。
関数の基本構造が完成したら、別の関数かPythonプロンプトから直接呼び出して実行することができます。以下は、printme()関数を呼び出す例です。
#!/usr/bin/python # 関数の定義はここ def printme( str ): "This prints a passed string into this function" print str return; # ここで呼び出せる printme("最初のメッセージ") printme("つぎのメッセージ")
上記のコードを実行すると、次の結果が生成されます。
最初のメッセージ
つぎのメッセージ
参照渡し値渡し
Python言語のすべてのパラメータ(引数)は参照渡しに渡されます。つまり、関数内でパラメーターが参照するものを変更すると、その変更は呼び出し元のお関数にも反映されます。たとえば –
#!/usr/bin/python def changeme( mylist ): mylist.append([1,2,3,4]); print "Values inside the function: ", mylist return mylist = [10,20,30]; changeme( mylist ); print "Values outside the function: ", mylist
ここでは、渡されたオブジェクトの参照と同じオブジェクト内の値の追加を維持しています。したがって、これは次の結果を生成します –
Values inside the function: [10, 20, 30, [1, 2, 3, 4]] Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
引数が参照渡しされ、参照が呼び出された関数の内部で上書きされるというもう1つの例があります。
#!/usr/bin/python def changeme( mylist ): mylist = [1,2,3,4]; # This would assig new reference in mylist print "Values inside the function: ", mylist return mylist = [10,20,30]; changeme( mylist ); print "Values outside the function: ", mylist
パラメータmylistは関数changemeに対してローカルです。関数内のmylistを変更しても、mylistには影響しません。関数は何もせず、最後に次の結果が得られます:
Values inside the function: [1, 2, 3, 4] Values outside the function: [10, 20, 30]
関数の引数
次の型の仮引数を使用して関数を呼び出すことができます。
- 必要な引数
- キーワードの引数
- デフォルトの引数
- 可変長引数
必要の引数
必須の引数は、正しい位置順に関数に渡される引数です。ここで、関数呼び出しの引数の数は、関数定義と正確に一致する必要があります。
printme()関数を呼び出すには、引数を1つ渡す必要があります。それ以外の場合は、次のように構文エラーが発生します。
#!/usr/bin/python def printme( str ): "This prints a passed string into this function" print str return; printme()
上記のコードが実行されると、次の結果が生成されます。
Traceback (most recent call last): File "test.py", line 11, in <module> printme(); TypeError: printme() takes exactly 1 argument (0 given)
キーワードの引数
キーワード引数は、関数呼び出しに関連しています。関数呼び出しでキーワード引数を使用すると、呼び出し側は引数をパラメータ名で識別します。
これにより、Pythonインタプリタは、指定されたキーワードを使用して値とパラメータを一致させることができるため、引数をスキップしたり順序を入れ替えたりすることができます。printme()関数のキーワード呼び出しは、次の方法で行うこともできます。
#!/usr/bin/python def printme( str ): "This prints a passed string into this function" print str return; printme( str = "My string")
上記のコードを実行すると、次の結果が生成されます。
My string
次の例は、より明確な画像を示しています。パラメータの順序は関係ありません。
#!/usr/bin/python def printinfo( name, age ): "This prints a passed info into this function" print "Name: ", name print "Age ", age return; printinfo( age=50, name="miki" )
上記のコードを実行すると、次の結果が生成されます。
Name: miki Age 50
デフォルトの引数
デフォルトの引数は、その引数の関数呼び出しで値が指定されていない場合に、デフォルト値を引き継ぐ引数です。次の例は、デフォルトの引数についてのアイデアを示し、渡されない場合はデフォルトの年齢を出力します。
#!/usr/bin/python def printinfo( name, age = 35 ): "This prints a passed info into this function" print "Name: ", name print "Age ", age return; printinfo( age=50, name="miki" ) printinfo( name="miki" )
上記のコードを実行すると、次の結果が生成されます。
Name: miki Age 50 Name: miki Age 35
可変長引数
関数を定義するときに指定したより多くの引数に対して関数を処理する必要があるかもしれません。これらの引数は可変長引数と呼ばれ、必須およびデフォルトの引数とは異なり、関数定義では命名されません。
非キーワード可変引数を持つ関数の構文は次のとおりです。
def functionname([formal_args,] *var_args_tuple ): "function_docstring" function_suite return [expression]
アスタリスク(*)は、すべての非キーワード変数引数の値を保持する変数名の前に置かれます。このタプルは、関数呼び出し中に追加の引数が指定されていない場合は空のままです。以下は簡単な例です –
#!/usr/bin/python def printinfo( arg1, *vartuple ): "This prints a variable passed arguments" print "Output is: " print arg1 for var in vartuple: print var return; printinfo( 10 ) printinfo( 70, 60, 50 )
上記のコードを実行すると、次の結果が生成されます。
Output is: 10 Output is: 70 60 50
匿名関数
これらの関数は、defキーワードを使用して標準的な方法で宣言されていないため、匿名と呼ばれます。lambdaキーワードを使用すると、小さな匿名関数を作成できます。
- ラムダフォームは任意の数の引数を取ることができますが、式の形でただ1つの値を返します。コマンドや複数の式を含むことはできません。
- ラムダには式が必要なため、無名関数はprintへの直接呼び出しではありません
- ラムダ関数は独自のローカル名前空間を持ち、パラメータリスト以外の変数やグローバル名前空間の変数にはアクセスできません。
- ラムダは関数の1行バージョンであるように見えますが、パフォーマンス上の理由から呼び出す際に関数スタックの割り当てを渡すことによって、CまたはC ++のインラインステートメントと同等ではありません。
構文
ラムダ関数の構文には、次のような単一の文だけが含まれます。
lambda [arg1 [,arg2,.....argn]]:expression
以下は、関数のラムダ形式がどのように機能するかを示す例です。
#!/usr/bin/python sum = lambda arg1, arg2: arg1 + arg2; print "Value of total : ", sum( 10, 20 ) print "Value of total : ", sum( 20, 20 )
上記のコードを実行すると、次の結果が生成されます。
Value of total : 30 Value of total : 40
リターンステートメント
文return [expression]は関数を終了し、必要に応じて式を呼び出し元に戻します。引数のないreturn文は、返り値Noneと同じです。
上記の例はすべて値を返していません。次のように関数から値を返すことができます。
#!/usr/bin/python def sum( arg1, arg2 ): # Add both the parameters and return them." total = arg1 + arg2 print "Inside the function : ", total return total; total = sum( 10, 20 ); print "Outside the function : ", total
上記のコードを実行すると、次の結果が生成されます。
Inside the function : 30 Outside the function : 30
変数の範囲
プログラム内のすべての変数は、そのプログラム内のすべての場所でアクセスできない場合があります。これは変数を宣言した場所によって異なります。
変数のスコープは、特定の識別子にアクセスできるプログラムの部分を決定します。Pythonには変数の基本的なスコープが2つあります –
- グローバル変数
- ローカル変数
グローバル変数とローカル変数
関数本体の内部で定義された変数はローカルスコープを持ち、定義された変数はグローバルスコープを持ちます。
つまり、ローカル変数は宣言されている関数内でのみアクセスできますが、グローバル変数はすべての関数によってプログラム本体全体にアクセスできます。関数を呼び出すと、その中で宣言された変数がスコープに持ち込まれます。以下は簡単な例です –
#!/usr/bin/python total = 0; # This is global variable. def sum( arg1, arg2 ): # Add both the parameters and return them." total = arg1 + arg2; # Here total is local variable. print "Inside the function local total : ", total return total; sum( 10, 20 ); print "Outside the function global total : ", total
上記のコードを実行すると、次の結果が生成されます。
Inside the function local total : 30 Outside the function global total : 0