Pythonによる関数の使い方

# はじめに
始めまして、株式会社ジール所属の@hiroaki_yoshidaです。
普段はAWSやPythonを使った開発を行っています。
開発に携わるにあたり、現場で学んだ事をアウトプットしていこうと思います。

今回はPythonの関数の説明と業務での使われ方について書いています。
Pythonを扱う上で必須の知識なので、なるべくわかりやすく説明していきます。

# 実行環境について
今回説明で利用するコードは、そのまま張り付けても動くように事前動作確認を行っています。
実際にコードを実行してみたい方には、Google Colaboratoryというサービスがお勧めです。
GoogleアカウントさえあればPythonを実行できるサービスになります。
今回のコードに限らずPythonの学習を始めようと思っている方にはピッタリのサービスです。
興味のある方は下記リンクよりアクセスしてみてください。

https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja

# 関数とは
入力値に対して処理を行い結果を返す一連の処理をまとめたものです。
入力値の事を「__引数（ひきすう）__」と呼び、返す値の事を「__戻り値__」と呼びます。
関数は以下の様に定義します。

```python
#引数の値を合計する関数
def summary(arg1, arg2):
    value = arg1 + arg2
    return value 
```

上記は __summary__ という関数を定義しています。 __arg1__ と __arg2__ はそれぞれ引数を表しています。
※ここでは引数をarg1,arg2としていますが、任意の名前でOKです。
そして __return__ というのが戻り値を示しています。ここではvalueという変数を返しています。

つまり、summary関数では引数としてarg1とarg2を受け取り、処理として引数同士を足し合わせた値を変数valueに代入します。
そのvalueを戻り値として返すという一連の流れを定義しています。


上記で定義したsummary関数を呼び出してみます。
呼び出す場合は`関数名(引数)`と記載します。
以下では関数の戻り値をresultという変数へ代入しています。

```Python
#引数の値を合計する関数
def summary(arg1, arg2):
    value = arg1 + arg2
    return value 

#メイン処理
arg1 = 3
arg2 = 5

result = summary(arg1, arg2)
print(result)
```

実行結果は以下になります。

```
8
```
    

# 関数の使い方
関数について定義方法と呼び出し方法が分かったかと思います。
ここでは、私が業務で経験したことのある関数の使い方をいくつかピックアップしましたので紹介します。
1.引数の数を可変長で設定
2.引数に初期値を設定
3.戻り値を複数設定
4.関数名を指定しない

### 1.引数の数を可変長で設定
引数がいくつ設定されるかが不明な場合は以下のように可変長にできます。
その場合は引数の前に　__「*」__　が必要になります。

```python
def average(*args):
    value = sum(args) / len(args)
    return value 

#メイン処理
answer1 = average(1, 2, 3, 4, 5, 6)
answer2 = average(1, 2, 3, 4)
answer3 = average(1, 2, 3)
print(answer1) #1つ目の出力(引数6つ)
print(answer2) #2つ目の出力(引数4つ)
print(answer3) #3つ目の出力(引数3つ)
```

※sum()やlen()はPythonに元々備わっている標準関数と呼ばれるものです。この関数はimportなどしなくてもそのまま利用できます。
上記のコードを実行すると、以下のような出力になります。

```python
3.5 #1つ目の出力
2.5 #2つ目の出力
2.0 #3つ目の出力
```

上記からaverage関数に指定する引数の数はいくつでも良いことがわかるかと思います。
※引数を*argsと指定した場合、引数はタプルというオブジェクトとして扱われます。

### 2.引数に初期値を設定
引数には初期値を設定することができ、一部の引数は省略することが可能です。
利用方法は関数を定義する際に　__「(引数名) = 初期値」__　のような形で指定します。
今回はarg2に対して初期値2を設定しています。

```function.py
def division(arg1, arg2 = 2):
    value = arg1 / arg2
    return value 

#メイン処理
#ここではprint()の中に関数呼び出しを入れて、戻り値を表示しています。
#Pythonではこういう書き方もできます。

print(division(10)) #1つ目の関数呼び出し
print(division(6, 3)) #2つ目の関数呼び出し
```

上記コードを実行すると、下記のような結果になります。

```python
5.0 #1つ目の出力
2.0 #2つ目の出力
```
1つ目の関数の呼び出しでは引数は１つしか指定していませんが、きちんと10を2で割っていることがわかりますね。
ただし、初期値を設定せず、print(division(10))を実行するとエラーになります。
2つ目の出力では第二引数の3が2を上書きしていることが分かります。





### 3.戻り値を複数設定
関数を定義する際に戻り値を複数戻したい事があります。
その場合returnの後に複数の戻り値を設定することが可能です。

```python
def calc(arg1, arg2):
    sum = arg1 + arg2
    avg = sum / 2
    return sum, avg

output1, output2 = calc(5, 3)

print(output1)
print(output2)
```

上記コードを実行すると、下記のような結果になります。

```python
8 #output1の出力
4.0 #output2の出力
```


注意しなくてはいけないのはreturnの後に設定した戻り値の順番に値が渡されます。
今回はsum, avgという順番で設定したため、output1にはsumの値がoutput2にはavgの値が代入されました。

### 4.関数名を指定しない
これは少しイレギュラーではありますが割とよく使います。
関数名を指定しない関数の事を __「lambda式」__ と呼びます。
使い方は`lambda 引数:処理内容`といったように定義します。
下記ではlambda式を用いた場合とそうでない場合とで比較してみました。

__lambda式を用いない場合__

```Python
def greeting(name):
    text = f'こんにちは{name}さん'
    return text

#あいさつをするプログラム
name = '吉田'

print(greeting(name))
```

上記コードを実行すると、下記のような結果になります。
※f'文字列'を使うと文字列と変数を同じ __''(シングルクォート)__ の中で利用できます。詳しい説明は下記リンクを参照してみてください。
https://qiita.com/oreo_t/items/7823bd991ac5c8da0777

```python
こんにちは吉田さん
```

__lambda式を用いた場合__

```Python
#記載のある人にあいさつをするプログラム
people = '吉田'

#lambda式の引数としてnameを受け取り、引数の値を用いて文字列を作成しています。
#lambda式の右にある(peaple)はlambda式にpeopleという変数（ここでは吉田）を渡しています。
print((lambda name: f'こんにちは{name}さん')(people))
```

上記コードを実行すると、下記のような結果になります。


```python
こんにちは吉田さん
```

この様にlambda式を利用するとシンプルに記述することが可能です。
ただ、lambda式を使って通常の関数のような複雑な処理を書こうとすると、コードが読みにくいものになってしまうので注意が必要です。

ちなみにですがlambda式で定義した内容を変数へ入れることもでき、 __関数オブジェクト（≒変数）__ と呼んだりします。
書き方は以下の様になります。
結果は上記と一緒になるのでぜひ確認してみてください。

```python
#あいさつをするプログラム
name = '吉田'

#以下の様にlambda式で定義した内容を変数へ入れたものを関数オブジェクト（≒変数）と呼んだりします。
aisatu = (lambda name: f'こんにちは{name}さん')
print(aisatu(name))
```

# まとめ
今回は関数について簡単な説明をした後、私が学んだ関数の使い方について説明しました。
まだまだ私の知らないような関数の使い方や決まり事が沢山あります。
もしご興味がありましたら、【デコレータ】や【ジェネレータ】で検索してみてください。

>株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：

https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area