Python入門　関数

# 関数
関数は、あるまとまった処理を関数として処理することができます。

## 関数の呼び出し
以下では関数の基本的な呼び出し方を記述しています。Pythonでは関数をdefで定義できます。関数を実行する時は、def以降に書いた関数名()を記述することで関数で定義した処理を実行することができます。

```python

def addition():
    a = 1
    b = 2
    c =a + b
    print(c)

addition()
```
```:実行結果
3
```
## 引数
関数を定義するときには、引数を設定することができます。以下の例では、引数としてaとbを設定してます。引数は関数を呼び出すときに記述することで引数を設定した関数を実行できます。

```python

def addition(a,b):
    print("a =",a)
    print("b =",b)
    print("a + b =",a+b)

addition(1,2)
```
```:実行結果
a = 1
b = 2
a + b = 3
```
以下の例では、aとbを乗算の処理を行う関数を定義しています。

```python

def func(a,b):
    print("a =",a)
    print("b =",b)
    print("a * b =",a*b)

func(4,3)
```
```:実行結果
a = 4
b = 3
a * b = 12
```
関数で乗算処理を行う引数は文字列に適用することできます。

```python

def func(a,b):
    print("a =",a)
    print("b =",b)
    print("a * b =",a*b)

func("hello",3)
```
```:実行結果
a = hello
b = 3
a * b = hellohellohello
```

## キーワード引数
引数は、キーワードを設定することもできます。関数を実行するときに、キーワードなしで引数を書いた場合は、順番通りに引数が適応されますが、キーワードを指定すれば、関数で設定した引数の順番ではなく、キーワードで設定した引数が適応されます。

```python

def func(a,b):
    print("a =",a)
    print("b =",b)
    print("a * b =",a*b)

func(b=9,a=3)
```
```:実行結果
a = 3
b = 9
a * b = 27
```
## デフォルト引数
デフォルト引数では、引数にあらかじめデフォルト引数を設定することができます。関数を呼び出す際は、デフォルト引数を設定していない引数のみを記述すれば、関数は自動的にデフォルト引数を適用して処理を行います。

```python

def func(a,b=100):
    print("a =",a)
    print("b =",b)
    print("a * b =",a*b)

func(10)
```
```:実行結果
a = 10
b = 100
a * b = 1000
```
デフォルト引数を設定した場合でも、関数を実行する際にデフォルト引数にあたる引数も記述すれば、そちらの方の引数が適用されます。

```python

def func(a,b=100):
    print("a =",a)
    print("b =",b)
    print("a * b =",a*b)

func(10,200)
```
```:実行結果
a = 10
b = 200
a * b = 2000
```
## 複数の引数をタプルで受け取る
引数の前に*を記述することで、引数はタプルとして受け取ることができるようになります。

```python

def func(*args):
    print(args)

func(1,2,3,4)
func(1,2,3,4,5,6,7,8,9)
```
```:実行結果
(1, 2, 3, 4)
(1, 2, 3, 4, 5, 6, 7, 8, 9)
```
## 複数のキーワード引数を辞書で受け取る
引数の前に**と書くと、キーワード引数を指定することで、辞書として受け取ることができるようになります。

```python

def func(**kwargs):
    print(kwargs)

func(a=1,b=2)
func(a=1,b=2,c=3,d=4)
```
```:実行結果
{'a': 1, 'b': 2}
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
```
## リストやタプルを展開して指定
関数で設定した引数は、リスト型を受け取って実行することもできます。その場合は、リスト型を格納した変数に*を記述することで、リスト型のデータを関数の引数として実行することができます。

```python

def func(a,b,c):
    print("a =",a)
    print("b =",b)
    print("c =",c)
    print("a + b + c =",a+b+c)
    
lis = [1,2,3]

func(*lis)
```
```:実行結果
a = 1
b = 2
c = 3
a + b + c = 6
```
## 辞書を展開して指定
関数で設定した引数は、辞書型を受け取って実行することもできます。その場合は、辞書型を格納した変数に**記述することで、辞書型のデータを関数の引数として実行することができます。

```python

def func(a,b,c):
    print("a =",a)
    print("b =",b)
    print("c =",c)
    print("a + b + c =",a+b+c)
    
dic = {'a': 1, 'b': 2, 'c': 3}

func(**dic)
```
```:実行結果
a = 1
b = 2
c = 3
a + b + c = 6
```
## 戻り値を指定
戻り値は、処理した結果を返します。以下の例では、aとbで乗算した結果を返します。

```python

def func(a,b):
    return a * b

x = func(10,20)

print(x)
print(type(x))
```
```:実行結果
200
<class 'int'>
```
```python

def func(a,b):
    return a * b

x = func(0.01,0.2)

print(x)
print(type(x))
```
```:実行結果
0.002
<class 'float'>
```
## 複数の戻り値を指定
戻り値は複数の結果も返すことができます。

```python

def func(a,b):
    return a + b, a * b, a / b

x = func(10,20)

print(x)
print(type(x))
```
```:実行結果
(30, 200, 0.5)
<class 'tuple'>
```
## ラムダ式
ラムダ式は、名前を付けずに簡易的に関数を定義することができます。

```python

func = lambda x,y:x+y
print(func(10,100))
```
```:実行結果
110
```
mapとlistを使用すると、リスト型のデータに適用することができるようになります。

```python

l = [0,1,2,3]
print(list(map(lambda x: x**2,l)))
```
```:実行結果
[0, 1, 4, 9]
```