関数と変数

はじめに

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) 」を簡単に使えるので、あまり困りません。 (tuple については要素の「集まり」色々で説明します.別に 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()