C#で関数といえばクラス内のメソッドか、メソッド内のローカル関数を想像してしまいますが、Pythonにはクラスの外に関数を書くことが出来ます。
今回は、この関数について解説致します。
関数の書き方
Pythonで変数を宣言する場合は型を指定しませんが、Pythonの関数も同様に引数、戻り値ともに型を指定しません。
また、関数名と引数を宣言する行の末尾には、if や for 文と同様にコロン(:) を付加します。

関数は通常、何らかの戻り値を返しますが、その記述はC#と同様に return を使います。
戻り値が不要な関数、つまりサブルーチンの場合は、reutrn は記述しません。
例えば、x、y、zの引数で値を3つ受け取り、全ての掛け算を戻り値として返す場合は次のようになります。
1 2 |
func calc(x,y,z): return x * y * z |
引数省略時の既定値
PythonもC#と同様、省略可能な引数を定義することが可能で、省略時の既定値も定義できます。
関数名(第1引数=既定値,第2引数=既定値,・・・)
またC#と同様に、既定値を指定しない場合、その引数は省略できません。
例えば calc という名前で、第1引数は省略不可、第2引数は省略可能で規定値が “あいう” という仕様の関数を、C#とPythonで記述すると次の様になります。
1 2 3 4 5 6 7 8 9 |
//C#の場合 void calc(int x,val = "あいう") { ~処理~ } //Pythonの場合 def calc(x,val='ABC'): ~処理~ |
可変長引数
C# の場合、 関数名(param object[] args) という記述によりメソッドの引数を可変長にできますが、Pythonの場合は変数の先頭にアスタリスクを1個又は2個付けることで実現できます。
*args 又は **kwargs
アスタリスクが1つの場合は、タプルとして受け取り、アスタリスクが2個の場合は辞書として受け取ります。
尚、引数名はなんでも良いのですが、*args と **kwargs (argsの前にKeywordを示すkwという文字を付加)という名前が慣習になっているようです。
具体的な記述方法は次の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#可変長引数をタプルで受け取って、合計を返す関数 def calc(*args): sum = 0 for arg in args: sum += arg return sum #可変長引数を辞書で受け取って、合計を返す関数 def calc(**kwargs): sum = 0 for arg in kwargs: sum += kwargs[arg] return sum |
タプルで受け取る場合、for で単純にループすれば値が取得できますが、辞書の場合はキーが返されますので、そのキーを使って辞書から値を取り出しています。
関数外で宣言された変数の参照
Pythonの場合、関数定義より前に宣言された変数を参照することが可能です。
これはC#のローカル関数と同じ振る舞いです。
例えば、事前にrate という変数が定義されていて、calc の中で x*y*rate という計算をするサンプルを例にすると、rete の 0.9 が掛け算されるため、結果は45となります。
1 2 3 4 5 6 7 8 |
rate = 0.9 def calc(x,y): return x*y*rate print(calc(5,10)) # 45が表示される |
では、関数の中で rate を定義したらどうなるでしょう。
関数内で定義された変数はローカル変数となるため、外部で定義された rate は使われなくなります。
結果、下記のプログラムでは50が返されます。
ちなみに、関数内の rate に1を代入していますが、外部で定義された rate は 0.9のまま、つまり影響を受けません。
1 2 3 4 5 6 7 8 9 |
rate = 0.9 def calc(x,y): rate = 1 return x*y print(calc(5,10)) # 50が表示される |
C#の場合、関数外部で定義されている変数を関数内で宣言すると、「外側のローカルのスコープでローカルやパラメータの定義が使用されているため、子のスコープでは宣言できません」というエラーが表示されます。
つまりバグの要因になる可能性があるためC#では禁止しているということです。
個人的には、関数外にある変数を参照できるという点が、そもそもバグの要因になりそうな気がするのですが、まあそれはともかく、関数外の変数を参照する場合は注意が必要です。
関数の呼び出し方
関数を呼び出す方法もC#と同様、関数名の後ろにパラメータを記述します。
例えば、3つの引数を持つ calc に対して、引数を指定して呼び出す方法は次の通りです。
1 2 3 4 |
def calc(val,ofs=0,rate=1): return (val * rate * ofs) calc(128,10,0.9) |
ここまではC#と同じですが、省略可能な引数に対して値をセットする記述は少し異なります。
C#の場合はコロン(:)を使いましたが、Pythonの場合はイコール(=)を使います。
1 2 3 4 5 |
//C#による値の指定 Cals("ABC",rate:0.9); #Pythonの場合 calc('ABC',rate=0.9) |
可変長引数の場合、タプルか辞書で受け取ることが出来ますが、呼び出し方は次の様に記述します。
1 2 3 4 5 |
#タプルで受け取る場合 calc(1,2,3,4,5) #辞書で受け取る場合 calc(key1=1,key2=2,key3=3) |
タプルの場合は単純に値を羅列するだけで良いのですが、辞書の場合はキーと値をイコールで繋いで、それをカンマ区切りで羅列します。
関数名(キー1=値1,キー2=値2,キー3=値3,***)
注意すべき点は、次の通りです。
- キーは文字列しか指定できない
- キーはシングルクォートやダブルクォートで囲ってはいけない
辞書を初期化する場合、キーは実数、整数、文字列など何でもよかったのですが、可変長引数として指定する場合は上記の制限があります。
関数を書く場所
Pythonはスクリプト言語であるため、入力順に実行されます。
従って関数を書く場所は、その関数を呼び出すより前に書かなければなりません。
通常はソースコードの先頭に記述しておきます。

まとめ
今回は関数について解説してみました。
考え方としては、Pythonの関数はC#でいうローカル関数と同じ振る舞いをします。
特筆すべき点としては次の通りです。
- 呼びだされる前に関数を定義しておく
- 関数外で定義された変数名と同じ変数名を関数内で定義できる
- 省略可能引数に対して直接値を指定するときはイコール(=)を使う点
- 可変長引数は、タプル又は辞書で受け取ることが出来る
- 辞書で可変長引数と受け取る場合、キーは必ず文字列にしておく必要がある。
Pythonの関数を理解する上で、この記事がお役に立てれば幸いです。