４０代おっさんPythonを勉強する（関数編）

## 本記事について

この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。

## 関数

- 同じコードを再利用したい時や、まとまりのある処理に関数を使うと便利
- 関数とは、名前の付いたコード
- 任意の型、任意の個数の入力引数
- 任意の型、任意の個数の結果を出力

### 関数の定義と呼び出し

- def 関数名(引数):
- 関数名は変数名と同じ規則に従う（先頭は英小文字か`_`（アンダースコア）、残りは英小字、数字、アンダースコア）
- returnで結果を出力（結果がないときはreturnしなくても良い）

- 定義

```python
def do_nothing(): # 定義する
    pass
```

- 呼び出し

```python
do_nothing()
```

- 引数と出力

```python
def whatcolor(name): # 仮引数
    return '私は' + name

output = whatname('としき') # 実引数
print(output)
```

- 複数の引数と出力

```python
def flowercolor(flower, color): # 仮引数
    return '私の好きな花は' + flower, '好きな色は' + color

output = flowercolor('バラ', '青') # 実引数
print(output)
```

```python
def flowercolor(flower, color): # 仮引数
    return '私の好きな花は' + flower, '好きな色は' + color

s1, s2 = flowercolor('バラ', '青') # 実引数
print(s1)
print(s2)
```

### None

- Pythonの特殊な値で、偽になるが、Falseと同じではない
- Noneは「存在しない値」

```python
def is_none(thing):
    if thing is None:
        print('None')
    elif thing:
        print('True')
    else:
        print('False')

is_none(None)
is_none(0)
is_none([])
is_none(1)
```

### 引数

- 位置引数に先頭から順番に代入する
- 欠点は入力の順番を間違ったら、処理も間違える

```python
    def 関数(第1引数,第2引数,第3引数,....) # これらの引数に間違った値を入れると処理が間違える
```

- キーワード引数で、位置引数を指定する方法もある
- キーワード引数は書くコードが増える

```python
    def birthday (year, month, day):
    return f'{year}年{month}月{day}日'
```

```python
    print(birthday(day=22, month=2, year=1980))
```

- 実引数が足りないときはエラーになる

```python
    print(birthday(day=22, month=2) # エラー
```

```python
    Input In [3]
    print(birthday(day=22, month=2)
                                   ^
SyntaxError: unexpected EOF while parsing
```

- デフォルト引数値の指定ができる
- 呼び出し元が対応する実引数を渡さなかったときに使われる

```python
    def birthday (year=1680, month=11, day=15):
    return f'{year}年{month}月{day}日'
```

```python
    print(birthday()) # 1680年11月15日
```

### 位置引数のタプル化

- アスタリスク * を使うと、可変個の位置引数をタプルにまとめて仮引数にセットする

```python
def print_name(val1, val2, *args):
    print('First: ', val1)
    print('Second: ', val2)
    print('The rest: ',args)

print_name('としき', 'あっきー')
print_name('としき', 'あっきー', 'たろう', 'じろう', 'さぶろう')
```

### キーワード引数の辞書化

- アスタリスクを２つ使うと、キーワード引数を一個の辞書にまとめることになる

```python
def print_name(val1, val2, *args, **kwargs): # val1とval2が必須
    print('First: ', val1)
    print('Second: ', val2)
    print('The rest: ', args)
    print('Dict tyce: ', kwargs)

print_name('としき', 'あっきー')
print_name('としき', 'あっきー', 'たろう', 'じろう', name1 = 'さぶろう' \
           , name2 = 'しろう', name3 = 'ごろう')
print_name('としき', 'あっきー', name1 = 'さぶろう' , name2 = 'しろう', name3 = 'ごろう')
```

### 関数のdocstring

- Pythonの公案は「読みやすさは大切だ」
- 関数の先頭にドキュメントを付けて関数の定義を表示することができる
- プログラムのメンテナンスには役に立つ

```python
def print_name(val1, val2, *args, **kwargs): # val1とval2が必須
    '''
    名前を映す関数
    argsは可変型
    kwargsは辞書型になる
    '''
    print('First: ', val1)
    print('Second: ', val2)
    print('The rest: ', args)
    print('Dict tyce: ', kwargs)

print_name('としき', 'あっきー')
print_name('としき', 'あっきー', 'たろう', 'じろう', name1 = 'さぶろう' \
           , name2 = 'しろう', name3 = 'ごろう')
print_name('としき', 'あっきー', name1 = 'さぶろう' , name2 = 'しろう', name3 = 'ごろう')
```

- help()関数でdocstringを呼び出す

```python
help(print_name)
```

## 参考

https://www.kitakyu-u.ac.jp/news/2022/08/003215.html