2.3. 関数#

2.3.1. 関数の定義#

関数は0個以上の引数(argument)を受け取って値を返します。

関数も制御構文と同じくヘッダーとブロック部分に分けられます。

def new_fanction(i):   #ヘッダー
    y = i ** i         #以下ブロック
    return y

new_fanctionという名前の関数を上で定義しました。 ブロックはインデント(行の先頭にスペースを入れて字下げを行うこと)で一つのブロックと認識されます。

上で作ったnew_fanctionでは、

  1. new_fanction\(i\)という一つの引数を受け取って (ヘッダー部分)

  2. \(i**i\) を計算して\(y\)に代入して、(2行目)

  3. \(y\)の値を返します。(3行目)

  4. 作成した関数を実行するためには、下のcellのように実行が必要です。

new_fanction(7)
823543
new_fanction(0)
1
new_fanction(2)
4

関数はひとつ以上の引数を受け取ることも可能です。

def greeting(weather, name):
    if weather == 'sunny':
        print('今日は天気がいいですね、' + name + 'さん。')
    elif weather == 'rainny':
        print('早く雨が上がるといいですね、' + name + 'さん。')
    else:
        print('こんにちは、'+ name + 'さん。')

上のgreeting関数のようにreturn(返り値)がない場合もあります。

greeting('sunny', '佐藤')
今日は天気がいいですね、佐藤さん。
greeting('rainny', '佐藤')
早く雨が上がるといいですね、佐藤さん。
greeting('cloudy', '佐藤')
こんにちは、佐藤さん。

2.3.2. 関数の返り値(戻り値)と引数#

関数に返り値(戻り値)がある場合は(returnがある場合)、それを代入することも出来ます。

def greeting_return(name):
    text = 'Good morning, ' + name
    return text # returnを使うことでこの関数は値を返しています。(返り値)

上の関数では返り値textを返しています。 この場合関数を実行することで値を返しています。

result = greeting_return('Max')
print(result)
Good morning, Max

返り値は代入することができます。返り値がない場合は関数から値を受け取ることができません。

def greeting_withoutreturn(name):
    text = 'Good morning, ' + name
    print(text) # この関数はtextをprintしますが、返り値はありません。
result2 = greeting_withoutreturn('Max')
Good morning, Max
print(result2)
None

関数は0個以上の引数を与えることが出来ます。(引数はない場合もあります。)

def count_ten(): # ()のなかに引数の指定がない
    for i in range(1,11):
        print(i) 
count_ten()
1
2
3
4
5
6
7
8
9
10

このcount_ten関数では実行するたびに1から10までをprintする関数で引数はありません。

このような関数に引数を与えるとエラーになります。

count_ten(10)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[17], line 1
----> 1 count_ten(10)

TypeError: count_ten() takes 0 positional arguments but 1 was given

2.3.3. globalとlocal変数#

関数内で代入された変数は、どれもlocal変数として扱われます。
つまり、関数内のlocalな変数で関数が呼び出された時のみ実行され、関数が終了すると消滅します。

def add_list():
    res = [] #まず空のリストresを作ります。
    for i in [1, 2, 3]:
        res.append(i) # appendはリストの末尾に要素を追加します。ここでは1,2,3を順にresに追加します。
    print(res)
add_list()
[1, 2, 3]

実行するとresがprintされました。

ここで、関数内で生成されたresはlocal変数なので、関数の外で呼び出すことはできません。

res
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[20], line 1
----> 1 res

NameError: name 'res' is not defined

上のcellを実行してもエラーとなります。

関数の外で呼び出したい場合はreturnで返して代入すると良いでしょう(この場合は関数の外で代入されてglobal変数となります)。

def return_add_list():
    res = [] #まず空のリストresを作ります。
    for i in [1, 2, 3]:
        res.append(i) # appendはリストの末尾に要素を追加します。ここでは1,2,3を順にresに追加します。
    return res # 今度はreturnでresを返します
#関数の外で関数return_add_listをresへ代入します。これによりresは関数の外でも使えるようになります。
res = return_add_list()
res
[1, 2, 3]