01 / 06
中で作った変数を、外で呼ぶ
関数の中で変数を作って、関数の外でそれを表示してみよう。うまくいきそうに見えるけれど、動かないよ。
関数の中では おはよう と表示できたのに、外に出たとたん「そんな名前は知らない」と言われた。
def aisatsu(): kotoba = "おはよう" print(kotoba)aisatsu()print(kotoba)実行結果
おはよう NameError: name 'kotoba' is not defined
関数
INPUT · スライド
01 / 06
関数の中で変数を作って、関数の外でそれを表示してみよう。うまくいきそうに見えるけれど、動かないよ。
関数の中では おはよう と表示できたのに、外に出たとたん「そんな名前は知らない」と言われた。
def aisatsu(): kotoba = "おはよう" print(kotoba)aisatsu()print(kotoba)実行結果
おはよう NameError: name 'kotoba' is not defined
02 / 06
kotoba のように関数の中で作った変数を ローカル変数(その関数の中だけの変数)と呼ぶ。そして、名前が通じる範囲のことを スコープ(有効な範囲)というよ。
ローカル変数は関数が終わると消える。次に呼んだときは、またまっさらから始まるんだ。下の関数を2回呼んでも、2 にはならないよ。
def kazoeru(): kazu = 0 kazu += 1 print(kazu)kazoeru()kazoeru()実行結果
1 1
03 / 06
逆向きは通る。関数の外で作った変数は、関数の中から読めるよ。
ただし、これに頼りすぎると「外の様子しだいで結果が変わる関数」になってしまう。必要な値は引数で渡すほうが、あとから読む人にやさしいよ。
namae = "ゆい"def aisatsu(): print(f"こんにちは、{namae}さん")aisatsu()実行結果
こんにちは、ゆいさん
04 / 06
ここがいちばん驚くところ。関数の中で namae = ... と代入した瞬間、それは外の namae とは別の、新しいローカル変数になる。
だから関数を呼んだあとで外の namae を見ても、ゆい のままだよ。読むだけなら外のものが見えるのに、書こうとすると別物になる——この非対称が、最初のつまずきどころだね。
namae = "ゆい"def kaeru(): namae = "はると" print(namae)kaeru()print(namae)実行結果
はると ゆい
05 / 06
「中から外を書きかえられない」のは不便に思えるけれど、これは事故を防ぐための仕組みだよ。
下の関数は中で kazu という名前を使っている。もし中と外がつながっていたら、外に置いてあった大事な kazu が消えてしまう。実際には別物なので、外は無事だ。
関数の中でどんな名前を使っても、外を壊さない。だから中身を知らなくても安心して呼べる。これが部品として使えるということだよ。
def gassan(kazus): wa = 0 for kazu in kazus: wa += kazu return wakazu = "たいせつなメモ"print(gassan([1, 2, 3]))print(kazu)実行結果
6 たいせつなメモ
06 / 06
関数の中と外は切りはなされている。そのうえで、値を行き来させる窓口が2つ用意されている。
return … 中から外へ返すこの2つだけを通すと決めておけば、関数は「入れたら出てくる箱」になる。中で何をしていても、呼ぶ側は気にしなくていいんだ。
次のレッスンでは、その渡しかたをもう少し便利にしていくよ。
def nibai(kazu): return kazu * 2kotae = nibai(5)print(kotae)実行結果
10