【入門】C#技術者の為のPython独学!関数編

Python入門
この記事は約5分で読めます。

C#で関数といえばクラス内のメソッドか、メソッド内のローカル関数を想像してしまいますが、Pythonにはクラスの外に関数を書くことが出来ます。

今回は、この関数について解説致します。

関数の書き方

Pythonで変数を宣言する場合は型を指定しませんが、Pythonの関数も同様に引数、戻り値ともに型を指定しません。

また、関数名と引数を宣言する行の末尾には、if や for 文と同様にコロン(:) を付加します。

関数は通常、何らかの戻り値を返しますが、その記述はC#と同様に return を使います。

戻り値が不要な関数、つまりサブルーチンの場合は、reutrn は記述しません。

例えば、x、y、zの引数で値を3つ受け取り、全ての掛け算を戻り値として返す場合は次のようになります。

引数省略時の既定値

PythonもC#と同様、省略可能な引数を定義することが可能で、省略時の既定値も定義できます。

  関数名(第1引数=既定値,第2引数=既定値,・・・)

またC#と同様に、既定値を指定しない場合、その引数は省略できません。

例えば calc という名前で、第1引数は省略不可、第2引数は省略可能で規定値が “あいう” という仕様の関数を、C#とPythonで記述すると次の様になります。

可変長引数

C# の場合、 関数名(param object[] args) という記述によりメソッドの引数を可変長にできますが、Pythonの場合は変数の先頭にアスタリスクを1個又は2個付けることで実現できます。

*args 又は **kwargs

アスタリスクが1つの場合は、タプルとして受け取り、アスタリスクが2個の場合は辞書として受け取ります。

尚、引数名はなんでも良いのですが、*args と **kwargs (argsの前にKeywordを示すkwという文字を付加)という名前が慣習になっているようです。

具体的な記述方法は次の通りです。

タプルで受け取る場合、for で単純にループすれば値が取得できますが、辞書の場合はキーが返されますので、そのキーを使って辞書から値を取り出しています。

関数外で宣言された変数の参照

Pythonの場合、関数定義より前に宣言された変数を参照することが可能です。

これはC#のローカル関数と同じ振る舞いです。

例えば、事前にrate という変数が定義されていて、calc の中で x*y*rate という計算をするサンプルを例にすると、rete の 0.9 が掛け算されるため、結果は45となります。

では、関数の中で rate を定義したらどうなるでしょう。

関数内で定義された変数はローカル変数となるため、外部で定義された rate は使われなくなります。

結果、下記のプログラムでは50が返されます。

ちなみに、関数内の rate に1を代入していますが、外部で定義された rate は 0.9のまま、つまり影響を受けません。

C#の場合、関数外部で定義されている変数を関数内で宣言すると、「外側のローカルのスコープでローカルやパラメータの定義が使用されているため、子のスコープでは宣言できません」というエラーが表示されます。

つまりバグの要因になる可能性があるためC#では禁止しているということです。

個人的には、関数外にある変数を参照できるという点が、そもそもバグの要因になりそうな気がするのですが、まあそれはともかく、関数外の変数を参照する場合は注意が必要です。

関数の呼び出し方

関数を呼び出す方法もC#と同様、関数名の後ろにパラメータを記述します。

例えば、3つの引数を持つ calc に対して、引数を指定して呼び出す方法は次の通りです。

ここまではC#と同じですが、省略可能な引数に対して値をセットする記述は少し異なります。

C#の場合はコロン(:)を使いましたが、Pythonの場合はイコール(=)を使います。

可変長引数の場合、タプルか辞書で受け取ることが出来ますが、呼び出し方は次の様に記述します。

タプルの場合は単純に値を羅列するだけで良いのですが、辞書の場合はキーと値をイコールで繋いで、それをカンマ区切りで羅列します。

  関数名(キー1=値1,キー2=値2,キー3=値3,***)

注意すべき点は、次の通りです。

  • キーは文字列しか指定できない
  • キーはシングルクォートやダブルクォートで囲ってはいけない

辞書を初期化する場合、キーは実数、整数、文字列など何でもよかったのですが、可変長引数として指定する場合は上記の制限があります。

関数を書く場所

Pythonはスクリプト言語であるため、入力順に実行されます。

従って関数を書く場所は、その関数を呼び出すより前に書かなければなりません。

通常はソースコードの先頭に記述しておきます。

まとめ

今回は関数について解説してみました。

考え方としては、Pythonの関数はC#でいうローカル関数と同じ振る舞いをします。

特筆すべき点としては次の通りです。

  • 呼びだされる前に関数を定義しておく
  • 関数外で定義された変数名と同じ変数名を関数内で定義できる
  • 省略可能引数に対して直接値を指定するときはイコール(=)を使う点
  • 可変長引数は、タプル又は辞書で受け取ることが出来る
  • 辞書で可変長引数と受け取る場合、キーは必ず文字列にしておく必要がある。

Pythonの関数を理解する上で、この記事がお役に立てれば幸いです。

タイトルとURLをコピーしました