---
# System prepended metadata

title: '関数(かんすう, function)'
tags: [Python]

---

# 関数(かんすう, function)

###### tags: `Python`

Pythonの「関数」とは、数学の関数に似て、「何らかの値を渡すと、その値に応じた何らかの値を返すもの」といえる。

関数に渡す値（関数への入力値）のことを「引数」と呼ぶ。

関数を呼び出したときに得られる結果（関数からの出力）のことを「戻り値」とか「返り値」などという。

---
## 関数を作る理由とは
* コードがわかりやすくなる
各機能をまとめておくことで見やすくなるだけではなく、デバッグ作業も効率良くなります。

* 関数でコードの重複を減らすことができる。
同じような処理を複数の箇所でするときに、同じようなコードを何度も書くのではなく、一度書いたコードを使いまわすためです。

---
![](https://i.imgur.com/qgAUyjl.png)
## 関数の作り方

```
def 関数名（引数1, 引数2, ..., 引数n):
    処理文
return 戻り値
```
### 引数と戻り値が無い関数
```python=
def print_word():
    print('Hello, World')
    
print_word() # print_word 関数を呼び出す
```
**Results:**
```
Hello, World
```
### 引数のある関数
```python=
def add(a, b):
    print(a,' + ',b ,'= ', a+b)
 
add(7, 8) # add 関数を呼び出す
```
**Results:**
```
7  +  8 =  15
```
### 引数を指定する
キーワード付き引数を指定することができます。キーワード付き引数は関数定義側で、デフォルトの値を指定することができます。

```python=
def repeat_msg(msg, repeat = 3):　# デフォルトの値を指定する
    print(msg * repeat)

repeat_msg('Hello ')                    
repeat_msg('Happy ', repeat = 5)  
```
**Results:**
```
Hello Hello Hello 
Happy Happy Happy Happy Happy 
```
### 戻り値のある関数
```python=
def re_add(a, b):
    sum = a + b
    return sum

a = int(input("a = "))
b = int(input("b = "))
print(a,' + ',b ,'= ', re_add(a, b)) # re_add 関数を呼び出す
```
**Results:**
```
a = 7
b = 9
7  +  9 =  16
```
### 関数のローカル性
関数内で数を置きかえる動作は、原則として、関数外の動作に影響を与えません。
```python=
a = 10
b = 7
def function(a):
    b = a * 2
    print('function b = ', b)
    print('function end')
function(a)
print("main b = ", b)
```
**Results:**
```
function b =  20
function end
main b =  7
```
## 可変長引数
関数定義で引数に*と**（1個または2個のアスタリスク）をつけると、任意の数の引数（可変長引数）を指定することができる。
慣例として*args, **kwargsという名前が使われることが多いが、*と**が頭についていれば他の名前でも問題ない。

### *args
複数の引数をタプルとして受け取る。
```python=
def args_sum(*args):
    print('args:', args, 'sum = ',sum(args))
args_sum(1, 10, 7, 9)
# sum = 27
args_sum(1, 1, 2, 4, 8, 16, 32, 64)
#  sum = 128
```
**Results:**
```
args: (1, 10, 7, 9) sum =  27
args: (1, 1, 2, 4, 8, 16, 32, 64) sum =  128
```
 #### 引数と組み合わせる
```python=
def func_args(a, b, *args):
    print('a: ', a)
    print('b: ', b)
    print('args: ', args)
func_args('python', 10, 2, 'java', 77)
func_args(0, 'python')
```
**Results:**
```
a:  python
b:  10
args:  (2, 'java', 77)
a:  0
b:  python
args:  ()
```
 ####  *がついた引数を先に定義すること
この場合は*argsよりもうしろで定義された引数はキーワード形式引数名=値で指定する必要がある。
```python=
def func_args(a, *args, b):
    print('a: ', a)  
    print('args: ', args)
    print('b: ', b)
# func_args(0, 1, 1, 2, 4) TypeError
func_args(0, 1, 1, 2, b = 4)

```
**Results:**
```
a:  0
args:  (1, 1, 2)
b:  4
```
### **kwargs
複数のキーワード引数を辞書として受け取る
```python=
def func_kwargs(**kwargs):
    print('kwargs: ', kwargs)
func_kwargs(A = 1, B = 2, C = 3)
func_kwargs(Google = 'グーグル', Twitter = 'ツイッター', Amazon = 'アマゾン')
```
**Results:**
```
kwargs:  {'A': 1, 'B': 2, 'C': 3}
kwargs:  {'Google': 'グーグル', 'Twitter': 'ツイッター', 'Amazon': 'アマゾン'}
```
* #### キーワードを使ってキーワード引数を渡す
関数呼び出し時に辞書オブジェクトに**をつけて引数に指定することで、展開してそれぞれの引数として渡すことも可能。
```python=
def func_kwargs(Twitter, key, **kwargs):
    print('Twitter: ', Twitter)
    print('key: ', key)
    print('kwargs: ', kwargs)

dict = {'Google': 'グーグル', 'Twitter': 'ツイッター', 'Amazon': 'アマゾン', 'key' : 1}
func_kwargs(**dict)
```
**Results:**
```
Twitter:  ツイッター
key:  1
kwargs:  {'Google': 'グーグル', 'Amazon': 'アマゾン'}
```



関数を呼び出す

```python=
print('python')
```
**Results:**
```
    python
```

https://www.manabi-free.com/2019/06/11/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%81%a7%e9%96%a2%e6%95%b0%e3%82%92%e4%bd%9c%e3%82%8b%e3%83%a1%e3%83%aa%e3%83%83%e3%83%88/




