超初心者のための関数外へのデータ取り出し
def関数の基本については以下の記事で取り扱った。
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
で詳しく解説してありますのでよろしければご参考ください。