関数を自分でつくる書き方をマスターするよ!スコープやデフォルト引数も覚えよう

関数を自分でつくる書き方をマスターするよ!スコープやデフォルト引数も覚えよう

関数の書き方をおぼえよう!

この記事では「関数」を使う方法をやってくよ。関数っていうのは「何か値を入れると、それを処理して結果を返すもの」なんだ。前にも「str関数」が出てきたよね。これも「数字を入れると、処理して文字列にしたものを返す」という機能だったよね。

関数を自分でつくろう!

じつは関数は自分でつくることもできるんだ。それじゃあ実際に問題をやってみよう。

a、bという値を渡すとaからbまで順番に足し算した合計を返すという関数をつくってください。
例:1と5を渡すと、1+2+3+4+5の合計を返す

「def」で関数をつくる

まずは関数を定義する作り方。「def」を使って好きな名前をつければOKだ。関数を自分でつくることを「関数を定義する」という言い方をするから、これも覚えておこう!実際に書くとこんな感じ。

def tashizan(a, b):
    #実行したい命令

「def」から空白ひとつあけて「tashizan」という名前で関数をつくってみた。これは変数と同じで好きな名前でOK中でどんなことをしてるか分かりやすい名前にするのがいいよ。

関数名をつけたら続けて「(a, b):」と書く。ここに渡す値が入るんだね。これは変数なので、これも好きな名前でOK。これらのことを「引数」というよ。

最後に改行して実行したい命令を書いていく。ここはインデントして書くから覚えておこう。for構文やwhile構文のときと同じだね。

問題の答え

それじゃあさっきの問題の答えを書いてくよ。

# codeing=utf-8

def tashizan(a, b):
    total = 0
    for i in range(a, b+1):
        total = total+i
    return total

3行目で関数を定義したら、4行目で「total = 0」という変数をつくった。この中に足し算の合計を入れて使うよ。

5行目はfor構文とrange関数の組み合わせだ。前にもやったよね。注目なのは「range(a, b+1)」としてるところ。これは自分でつくった関数「tashizan(a, b)」の変数をそのまま使ってるんだ。こんなふうに関数を定義する時につくった変数は関数の中で使えるんだね。

最後のポイントは7行目だ。この「return」は「値を返す」という意味がある。「return total」だから、計算結果の合計値を最後に返すって意味だね。ちなみにこの戻ってきた値のことを「戻り値」って呼ぶから覚えておこう!

関数を使ってみよう!

それじゃあ作った関数をつかってみよう。こんな風に書けばOKだ。

# codeing=utf-8

def tashizan(a, b):
    total = 0
    for i in range(a, b+1):
        total = total+i
    return total

print(tashizan(1, 5))

▽ 実行結果

15
>>> 

関数は「tashizan(1, 5)」のようにつかう。str関数とかと同じだよね。これで1から5まで足した計算結果が返ってくるよ。その値を画面に表示したいから「print(tashizan(1, 5))」と、printの中に入れてるんだね。

注意点は、関数を使うのは定義した後でってこと。例えばこんな風にかくとエラーになるよ。

# codeing=utf-8

print(tashizan(1, 5))

def tashizan(a, b):
    total = 0
    for i in range(a, b+1):
        total = total+i
    return total

関数を使おうとしても、まだその関数がないって感じになっちゃうんだね。

変数の保存場所「スコープ」を理解しよう!

関数をつくって変数を使う時には1つ大きな注意点があるんだ。それは「関数の中と外で、変数の保存場所が違う」ってこと。ちょっと分かりにくいと思うから、実際にプログラムを動かしてみていこう。

こんなプログラムを書いて見た。

# codeing=utf-8

a = "abc"

def test():
    print(a)
    return

test()
print(a)

▽ 実行結果

abc
abc

まず、3行目で「a」という変数を作って中身は”abc”にしてる。で、5行目で「test」という関数をつくってるね。この関数の機能はさっきつくった変数「a」をprintで表示するだけだ。ここまでで準備はOK。

そして9行目では、test()を実行してるから、変数「a」の中身が表示される。そして、10行目でも「print(a)」で、変数「a」を表示させてる。

つまり、変数aの中身を「関数を使って表示させる」っていうのと「printで直接表示させる」ってふうに同じことを2回やってたんだ。だから実行結果は「abc」が2回表示されてるんだね。ここまでは特に問題ないと思う。

関数の中の変数を書き換えてみる

それじゃあ次は関数の中で変数を書きかえてみたらどうなるかやってみよう。そのプログラムがこれだ。

# codeing=utf-8

a = "abc"

def test():
    a = "test"
    print(a)
    return

test()
print(a)

さっきと違うのは、6行目の「a = “test”」のところ。最初に「a = “abc”」にしていたところを書きかえてるんだ。さて、これを実行したらどうなるのかな?

▽ 実行結果

test
abc

なんと「test」という表示と「abc」という表示の両方がでてきた!先にtest()で変数aの中身を書きかえてるんだから、「test」が2回出てきてもいい気がするよね。でもそうはならないんだ。

その理由が、最初に言った「関数の中と外で、変数の保存場所が違う」ということなんだ。関数test()の中に入ってる「変数a」と、外に出てる「変数a」は同じ名前でも別々のものとして保存されてるんだね。

こんな風に、関数の中にある変数はその関数の中だけで有効になる。この有効範囲のことを「スコープ」というから覚えておこう。また、関数の外のスコープを「グローバルスコープ」、関数の中のスコープを「ローカルスコープ」と言うよ。また、変数についても関数の外の変数を「グローバル変数」、関数の中の変数を「ローカル変数」と言うんだ。

関数からグローバル変数を書きかえてみよう

さっきの書き方だと、グローバル変数の「a」を関数の中で書きかえようとしても、ローカル変数の「a」が作られるだけ。書きかえられなかったよね。だけどどうしても書きかえたいときは、そのための方法もちゃんと用意されてる。それが「グローバル宣言」だ。

その書き方を実際にみてみよう!

# codeing=utf-8

a = "abc"

def test():
    global a
    a = "test"
    print(a)
    return

test()
print(a)

▽ 実行結果

test
test

さっきとの違いは、6行目に「global a」を追加したってことだけ。これは「この変数aはローカルじゃなくてグローバル変数として扱いますよ」と宣言してることになるんだ。だから実行結果でも変数aが書きかえられて「test」と2回表示されてるんだね。

デフォルト引数

最初に作った足し算の関数は、「def tashizan(a, b):」だったよね。aとbの両方に引数を渡して使ってた。これをさらに改良して、引数が1つでも2つでも動くようにも作れるんだ。その書き方はこんな感じ!

# codeing=utf-8
 
def tashizan(a, b=10):
    total = 0
    for i in range(a, b+1):
        total = total+i
    return total
 
print(tashizan(1))
print(tashizan(1,5))

▽ 実行結果

55
15

注目は3行目の「def tashizan(a, b=10):」のところ。今までは(a,b)ってしてたけど、(a,b=10)って書けばここで値も決めちゃうことができるんだ。

こうするとb=10が最初から決まってるから、9行目みたいに「tashizan(1)」って感じで引数が1つだけで動く。そしてさらに注目なのは、10行目みたいに今までどおり「tashizan(1,5)」って書くこともできるんだ。

つまり、「2つ目の引数があれば使うけど、なければ10を勝手にいれるよ」という関数が作れるんだね。こういう書き方を「デフォルト引数」って言うから覚えておこう!

今日のまとめ

  • 関数を自分でつくる書き方をおぼえよう!
  • 変数の「スコープ」をおぼえよう!
  • 「グローバル宣言」の書き方をおぼえよう!
  • 「デフォルト引数」の書き方をおぼえよう!