[光-Hikari-のPython]06章-02 関数（引数と戻り値1）

#[Python]06章-02 引数と戻り値1
前節で関数を定義する際には以下のように行うと説明しました。

```.py
def 自作関数名(引数):
    関数を呼び出した際に実行される処理内容
```

前回、この中の**引数**について説明しなかったので、それについて説明していきたいと思います。
また、本来関数は何か値を入れたら、その処理結果した結果を何か返すものです。値を返すといった、**戻り値**についても触れていきます。

##関数の引数
関数を定義して呼び出す際に、**引数**を関数に渡して処理を行うことができます。<font color="#00cccc">chap06</font>を新たに作成し、その中に、<font color="#00cccc">samp06-02-01.py</font>というファイル名でファイルを作成し、以下のコードを書いてください。（前回のプログラムを少し改良しています。）

```samp06-02-01.py
def greet_func(name):
    print('関数内で実行しています')
    print(f'{name}さん、こんにちは！')

print('今からgreet_func関数を呼び出します。')
name = input('名前を入力してください：')

#greet_func関数を呼び出す
greet_func(name)

print('関数内の処理は終了しました！')
```

><font color="#090" bgcolor="black">【実行結果】</font>
今からgreet_func関数を呼び出します。
名前を入力してください：山田太郎
関数内で実行しています
山田太郎さん、こんにちは！
関数内の処理は終了しました！

プログラムの説明をしていきます。まず、名前を入力（今回は**'山田太郎'**としています）し、**greet_func関数**を呼び出しています。呼び出しの際に、**name = '山田太郎'**としているため、関数を呼び出す際には、**greet_func('山田太郎')**としていることと同じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602679/5e9ec805-f885-c8bd-4368-f8eeb14ede74.png)

この時の関数を呼び出している側である**greet_func(name)**の**name**の個所を**<font color="#c90">実引数（じつひきすう）</font>**と言います。

次に、呼び出された以下の関数内での実行です。

```.py
def greet_func(name):
    print('関数内で実行しています')
    print(f'{name}さん、こんにちは！')
```

このとき、greet_func(name)のnameには**'山田太郎'**という値が代入されます。そして、この関数内では現在、**name = '山田太郎'**となっているため、**print(f'{name}さん、こんにちは！')**の個所の**name**には**'山田太郎'**が代入され、「山田太郎さん、こんにちは！」と出力されるのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602679/d86173c5-6c0d-f981-bbb3-18c78d759f63.png)

この時の呼び出される側の関数である**greet_func(name)**の**name**の個所を**<font color="#0c9">仮引数（かりひきすう）</font>**と言います。

##関数の引数もう1つの例
もう1つ例を見てみましょう。<font color="#00cccc">chap06</font>を新たに作成し、その中に、<font color="#00cccc">samp06-02-02.py</font>というファイル名でファイルを作成し、以下のコードを書いてください。

```.06-02-02.py
def plus_func(a, b, c):
    print('関数内で和の計算をしています。')
    print(a + b + c)

plus_func(3, -4, 1)
print('関数内の処理は終了しました。')
```

><font color="#090" bgcolor="black">【実行結果】</font>
関数内で和の計算をしています。
0
関数内の処理は終了しました。

今回は、実引数は文字列でなく**数値**としています。数値の場合も同じで、**plus_func関数**を呼び出す際に3つの値を渡しています。なお、**実引数は1つだけでなく、いくつでも渡すことは可能**です。そして仮引数に渡された数値はplus_func関数内で計算され、結果を出力しています。

##関数の戻り値
[06章-01](https://qiita.com/ko0821/items/9feae2a3a2441b114828)で説明しましたが、数学における関数で、

```math
f(x) = x^2+3x+4
```
があったとき、x=2とすると、

```math
f(2) = 2^2+3・2+4
=14
```
と求めることができました。
つまり、**x**という実引数に**2**を代入して、計算をすると**14**という結果が返ってきます。この返ってくる値を**戻り値**と言います。

なお、**戻り値は基本的には1つとなります**ので、注意してください。

さて、今まで書いてきたプログラムでは関数内で処理して終了であり、戻り値がありません。今回はこの結果を返す方法を説明します。

まず、戻り値を返すにはおおよそ以下のようにプログラムを書きます。

```.py
def 自作関数名(引数):
    関数を呼び出した際に実行される処理内容
    return 関数内での処理結果
```

先ほどの関数、

```math
f(x) = x^2+3x+4
```

について、プログラムにて実装をしてみましょう。<font color="#00cccc">chap06</font>を新たに作成し、その中に、<font color="#00cccc">samp06-02-03.py</font>というファイル名でファイルを作成し、以下のコードを書いてください。

```.py
def calc_func(x):
    print('関数内で実行します')
    f = (x ** 2) + (3 * x) + 4
    ##計算結果fを返す
    return f

#関数の呼び出し時に実引数を2としている
f = calc_func(2)
print(f'関数から返ってきた値：{f}')
```

><font color="#090" bgcolor="black">【実行結果】</font>
関数内で実行します
関数から返ってきた値：14

まず、呼び出し元の関数の実引数に**2**を指定しています。それを呼び出し先の関数の仮引数xに指定しています。
そして、関数内のxに2を代入して計算してます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602679/40bf7513-4785-251c-f54f-ae59b2cef4ba.png)

次に、計算結果である**14**をfに代入し、そのfを関数の呼び出しもとに値を戻しています。この値を**戻り値**と言います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602679/fc813a73-8be5-7dc2-ba5a-f027c9fa6642.png)

そして、**f = calc_func(2)**の個所が、**f = 14**となるので「関数から返ってきた値：14」と出力されるのです。


##最後に
関数の引数と戻り値は、自分で定義した関数ですと最初はわかりずらいですが、実は今まで使った組み込み関数でも無意識のうちに使っているのをお判りでしょうか？
例えば、**len関数**であれば、**len('hello')**としたときに、**'hello'**は**実引数**になりますし、5文字なので実行結果である**5**が**戻り値**となります。

次回は引数と戻り値に関するお話をもう少ししていきたいと思います。

###[【目次リンク】へ戻る](https://qiita.com/ko0821/items/379e8bd9e6ea01089419)