関数と変数

はじめに

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 は基本、変数に型情報をつけなくても大丈夫です。

でも、値には型がついています。まあ、こちらは当たり前というか、 intdoublestr は、内部ではちゃんと区別して扱っています。

ただ、プログラムを分かりやすくするために、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()