# Python の関数定義と呼び出し
```python
def add(a, b):
x = a + b
return x
x = add(3, 4)
print(x)
# 7
```
戻り値が必要なければ `return` は省略可。
(または `return None` )
```python
def func(a, b, c):
print(f'a={a}, b={b}, c={c}')
```
呼び出し時の引数の指定
- 位置(順番)
- キーワード(引数名)
- 任意の順番で指定可能
- 位置で指定したあとキーワードで指定することもできる
- キーワードで指定した以降の引数はすべてキーワードで指定
## 位置専用引数(Python3.8以降)
`/` より前は位置専用引数
```python
def func_pos_only(a, b, /, c):
print(f'a={a}, b={b}, c={c}')
```
## キーワード専用引数
`*` より後ろはキーワード専用引数
```python
def func_kw_only(a, b, *, c):
print(f'a={a}, b={b}, c={c}')
```
- `*` より前は位置でもキーワードでも指定可能
- キーワードの場合は任意の順番で指定可能
```python
unc_kw_only(1, c=100, b=10)
```
## 位置専用引数とキーワード専用引数の組み合わせ
```python
def func_pos_kw_only(a, /, b, *, c):
print(f'a={a}, b={b}, c={c}')
```
- `/` より前は位置専用引数
- `*` より後はキーワード専用引数
- `/` と `*` の間の引数は位置でもキーワードでも指定可能
## デフォルト引数
```python
def func_default(a, b, c=100):
print(f'a={a}, b={b}, c={c}')
```
リストや辞書をデフォルト値とした場合は関数呼び出し時と常に同じオブジェクトが使われるので注意が必要。
## 可変長引数
### タプルとして受け取る
```python
def func_args(*args):
print(args)
```
### 辞書として受け取る
```python
def func_kwargs(**kwargs):
print(kwargs)
```
## リストや辞書を展開(アンパック)して渡す
```python
l = [1, 10, 100]
func(*l)
```
```python
d = {'a': 1, 'b': 10, 'c': 100}
func(**d)
```
## 複数の戻り値
```python
def func_return_multi(a, b):
return a + b, a * b, a / b
```
```python
x = func_return_multi(3, 4)
print(x)
# (7, 12, 0.75)
x, y, z = func_return_multi(3, 4)
print(x)
# 7
```