超初心者のための関数外へのデータ取り出し

def関数の基本については以下の記事で取り扱った。

harvest-python.hatenablog.com

defを実行した結果を関数外へ取り出すには「return」を用いれば良いことを説明した。
今回は「return」以外の方法で取り出す方法を補足する。

「return」で取り出す方法(おさらい)

 以下の関数を実行するとfor x in range(5)で取り出された[0],[1],[2],[3],[4]がリストT(ローカル変数)に追加されていく。このTを「return」で取り出している。

[コード]

def function():
    T= []
    for x in range(5):
        T += [x]       # T.append(x) でも同じ
        
    return T

result = function()
print(result)

[出力]

グローバル変数へ直接書き込み①

 下のように、グローバル変数として空のリストT を用意しておき、「.append()」を用いて追加するのが最も簡単である。returnも必要がないのでコードも短くなる。

[コード]

T = []
def function():
    for x in range(5):
        T.append(x) 

function()         #関数の実行
print(T)

[出力]

グローバル変数へ直接書き込み②

 「.append()」の代わりに、冒頭の例と同じく、 「+」でリストへ追加してみるとどうなるだろうか?

[コード]

T = []
def function():
    for x in range(5):
        T += [x]

function()         #関数の実行
print(T)

[出力]

 何やらエラーが発生している。Tはグローバル変数なんだからどこでも使えるんじゃないのか?と思ったかもしれない。実はTに代入されたものをどこでも使えるだけで、Tに対して何かの変更を加えるのはこのままでは出来ない。


このエラーは、def内にローカル変数Tが設定されていないから、Tとは何ぞやと言われている状態である。解決策は2つある。

一つは上記の通りローカル変数Tを設定し「return」で取り出す方法である。これは最初の例と全く同じである。

二つ目はTがグローバル変数であることを宣言してあげる方法である。

[コード]

T = []
def function():
    global T
    for x in range(5):
        T += [x]

function()         #関数の実行
print(T)

[出力]

 上記の通り「global T」を付けてあげるだけでTに対して関数内から操作が出来るようになる。これを「global宣言」と呼ぶ、
ちなみに一般的には「global宣言」はおススメされないらしい。が初心者の書くレベルでのコードではあまり気にしなくてもよいかもしれない。

「return」で複数を取り出す

 returnでは複数を同時に取り出すことが可能である。上記の例のように発生した数字を格納したリストと、発生した数字の合計値を同時に得るようにコードを書いてみる。

[コード]

def function():
    T= []
    Sum = 0
    for x in range(5):
        T += [x]
        Sum += x
        
    return T,Sum

result_1, result_2 = function()
print(result_1)
print(result_2)

[出力]

仕組みは単純で 「return」の後ろに「,」で二つを並べれば良い。「return 」により result_1 へ T が, result_2 へ Sum が代入される。
もちろん二つ以上でも可能であるが、returnで戻す数と受け取る変数の数は一致している必要がある。

まとめ

 紹介しておいてなんだが、結局は「return」 が王道で混乱も生じにくいと思います。ただし、例でもあげた「.append()」で直接入れる方法はコードが少しスッキリしたりして使い勝手は良いと思います。
 もし上記の例がスッと入ってこなかったら、「グローバル変数」と「ローカル変数」の概念があやふやな可能性があります。トップにはった
超初心者のための関数(def構文) - Harvest’s diary
で詳しく解説してありますのでよろしければご参考ください。