今回はFortranのSubroutineのような役割をするFunctionを使ってみよう。
関数もif
やwhile
のようにインデントで関数の中なのか外なのかを判断する。
例は次のようになる。
def plusOne(x) :
x = x + 1
return x
print(plusOne(1))
plusOne
は関数の名前であって、()
は引数をどんな名前の変数でもらうのかを決める。
括弧内のx
は中のLocal variable(地域変数)であって、そとに同じ名前の変数がある場合、独立的である。
>>> x = 1
>>> def plusOne(x) :
... x = x + 1
... return x
...
>>> print(plusOne(1))
2
>>> print(x)
1
見ているようにplusOne()
の変数x
の値が1増えても、関数の外で宣言されているx
にはどんな影響も与えない。
引数と返し値は両方とも必修ではないので、引数を定義する
()
を空にして、return
は省略してもいい。
幸いにPythonはFortranのsubroutineのように一々定義する必要はない。
まず、Pythonが自動的に判断して、関数内で定義されなかった変数なら外から呼ぶようになっている。
>>> x = 1
>>> def plusOne() :
... return x + 1
...
>>> plusOne()
2
見ているように関数の中ではx
が宣言されていないので、Pythonは自動的に外側の変数を持ってきてくれる。
だが、ここでx
の値を関数内で変更するようにしたらエラーが生じる。
>>> x = 1
>>> def plusOne() :
... x = x + 1
... return x
...
>>> plusOne()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in plusOne
UnboundLocalError: local variable 'x' referenced before assignment
これは、x
が関数内で一回代入されたせいである。
つまり、Pythonは変数の定義と代入を分けて考えていないので、値を代入しようとしたことを関数内に新しい変数(地域変数)を定義したと判断する。
それで、地域変数x
を入れる時、まだ値が決まっている自分自身に+1
しようとするからエラーが生じるようになる。
この問題を押さえるため、Pythonはglobal
というkeywordで外側の変数を呼ぶ方法を提供している。
使い方は次のようになる。
>>> x = 1
>>> def plusOne() :
... global x
... x = x + 1
... return x
...
>>> plusOne()
2
>>> x
2
引数に初期値を登録しておいて、引数を省略して関数を使う方法もある。
>>> def sayHello(name = "Guest") :
... print("Hello, " + name)
...
>>> sayHello("Mr. Choi")
Hello, Mr. Choi
>>> sayHello()
Hello, Guest