関数

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つの窓口だけ

関数の中と外は切りはなされている。そのうえで、値を行き来させる窓口が2つ用意されている。

  • 引数 … 外から中へ渡す
  • return … 中から外へ返す

この2つだけを通すと決めておけば、関数は「入れたら出てくる箱」になる。中で何をしていても、呼ぶ側は気にしなくていいんだ。

次のレッスンでは、その渡しかたをもう少し便利にしていくよ。

def nibai(kazu):    return kazu * 2kotae = nibai(5)print(kotae)

実行結果

10