2.3. 関数#
2.3.1. 関数の定義#
関数は0個以上の引数(argument)を受け取って値を返します。
関数も制御構文と同じくヘッダーとブロック部分に分けられます。
def new_fanction(i): #ヘッダー
y = i ** i #以下ブロック
return y
new_fanction
という名前の関数を上で定義しました。
ブロックはインデント(行の先頭にスペースを入れて字下げを行うこと)で一つのブロックと認識されます。
上で作ったnew_fanction
では、
new_fanction
は\(i\)という一つの引数を受け取って (ヘッダー部分)\(i**i\) を計算して\(y\)に代入して、(2行目)
\(y\)の値を返します。(3行目)
作成した関数を実行するためには、下の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]