関数と変数
はじめに
C では、計算は(初期化を除いて)基本関数の中に書きましたよね? Python では、関数がなくても簡単なプログラムはかけちゃいます。
でも、「やりたいこと」を切り分けて実現するには関数を使いたいし、 「別の人が使ったライブラリ」を使うには関数呼び出しは必須ですよね。
ってことで、関数に少し慣れておきます。
関数と local/global 変数
def function_name(parameters...):
のような形で関数を定義していきます。
関数の中には、if 文やループやなど、いろんな制御構文を伴った文を書いていけます。
return
文で、関数の返り値を指定して、関数を終了することができます。
def func0(x, y):
# x, y は local, 関数内で定義・代入されるのは基本 local (関数内)
# global 変数 a は参照可能。関数内で代入するには global a 宣言必要。
print('x:', x, ', y:', y, ', a:', a, '@beginning of func0()')
x += 2
y += 2
x_plus_y = x + y # これも local
# format 文を使ってみる。{ 変数 } で、変数の値が入る。
print(f'x: {x} , y: {y} , x_plus_y: {x_plus_y} @termination of func0()')
return x_plus_y
# 利用側
result = func0(p + 1, q)
関数の開始時点では、引数としてもらった値(ここでは, p+1, q
の値)を、変数(x, y
)に代入した状態でスタートします。
関数の中で代入した変数は基本関数内だけで利用可能な local 変数です。 関数内では、local 変数は好きに利用してもらってOK。
一方で、関数外で代入・定義された変数は global 変数です。
関数内では、なにもしないと global 変数へは read アクセスしかできません。 代入しようとすると、local 変数が新たに生まれます。
ただ、global var
などと書くと、関数内の var
へのアクセスが、
global 変数 var
へのアクセスになります。
型
Python は基本、変数に型情報をつけなくても大丈夫です。
でも、値には型がついています。まあ、こちらは当たり前というか、
int
や double
や str
は、内部ではちゃんと区別して扱っています。
ただ、プログラムを分かりやすくするために、Python でも変数の型宣言はできるし、 関数の引数や返り値の型も宣言できます。
def func0(x: int, y: int) -> int: # 型情報を記載可能
x_plus_y: int = x + y
返り値
Python は、global 変数に代入しにくいですよね。 ただ、関数から「結果」を複数返したいとき悩みそうですよね。
ただ、Tuple (値の組)を簡単に使えるので、あまり困りません。 (なんなら、List や Dict を返してもいいですが)
t = 1, 2 # t に 1 と 2 の組が代入された
return 3, 4 # 3 と 4 の組を返り値として返す
# 返り値をつけ取る側
t2 = fun() # t2 にtuple が入る。t2[0], t2[1] でアクセス可
a, b = fun() # tuple の各値を、a, b 変数でそれぞれ受け取る
おまじない
Python の最後に、こんな感じのコードが書いてあることがあると思います。
これは、このファイルを実行対象として読み込んだ時はmain()
を実行してねって意味です。
ライブラリとかだと、別の main プログラムから import
によって読み込まれたりするけど、その時は このファイルの main()
は実行しないよっていうことですね。
まあ、プログラムを分割したファイルに書くときに思い出してください。
if __name__ == '__main__':
main()