【データサイエンティスト入門】Pythonの基礎♬関数と無名関数ほか

[昨夜の続き](https://qiita.com/MuAuan/items/df0cbf368da4e8841547)です。
【注意】
[「東京大学のデータサイエンティスト育成講座」](https://www.amazon.co.jp/%E6%9D%B1%E4%BA%AC%E5%A4%A7%E5%AD%A6%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E8%82%B2%E6%88%90%E8%AC%9B%E5%BA%A7-Python%E3%81%A7%E6%89%8B%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6%E3%83%87%E2%80%95%E3%82%BF%E5%88%86%E6%9E%90-%E5%A1%9A%E6%9C%AC%E9%82%A6%E5%B0%8A/dp/4839965250/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)を読んで、ちょっと疑問を持ったところや有用だと感じた部分をまとめて行こうと思う。
したがって、あらすじはまんまになると思うが内容は本書とは関係ないと思って読んでいただきたい。
###Chapter1-2 Pythonの基礎
####1-2-5　関数
#####1-2-5-1 関数の基本
関数とは、以下の性質を少なくとも一つ持つ
⓪指示に従って、定められた処理をする
①一連の処理をまとめて、共通化する
②引数を渡し、返り値を取得する
######簡単な関数
③書式の基本は以下の通り
######何もしない関数
```py
def do_nothing():
    pass
do_nothing()
```
結果
何もしない
######hello worldを出力する
```py
def hello_world():
    print('hello world')
hello_world()
```
結果

```
hello world
```
######引数により出力が変わる
```py
def hello_world(arg='hello_world'):
    print(arg)
    
hello_world('hello_world')
hello_world('good morning')
```
結果

```
hello_world
good morning
```
######*args引数をtupleで出力する
```py
def hello_world(*args):
    print(args)
    
hello_world('hello_world','good morning')
```
結果
関数内及び出力はtupleになる

```
('hello_world', 'good morning')
```
######**kwargs引数を辞書で出力する
```py
def hello_world(**kwargs):
    print(kwargs)
    
hello_world(day='hello_world',morning='good morning', evening='good evening')
```
結果
関数内及び出力は辞書になり、引数名は辞書のkey, 引数の値は、辞書の値になる。

```
{'day': 'hello_world', 'morning': 'good morning', 'evening': 'good evening'}
```
######返り値のある関数
```py
def calc_multi(a, b):
    return a * b

print(calc_multi(3,5))
```
結果

```
15
```
######fibonacci
```py
def calc_fib(n):
    if n ==1 or n== 2:
        return 1
    else:
        return calc_fib(n-1) + calc_fib(n-2)
    
for n in range(1,21):
    print(calc_fib(n),end=' ')
```
結果

```
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
```
#####1-2-5-2 無名関数lambdaとmap関数
以下のように、関数名の無い関数を無名関数lambdaという。

```py
print((lambda a, b:a*b)(3, 5))
```
結果

```
15
```
######map関数
```py
def calc_double(x):
    return x * 2

for num in [1, 2, 3, 4]:
    print(calc_double(num))
```
結果

```
2
4
6
8
```
map関数で[1, 2, 3, 4]を一度に計算して、listで出力

```py
print(list(map(calc_double, [1, 2, 3, 4])))
```
結果

```
[2, 4, 6, 8]
```
######map関数とlambda
通常の関数をlambdaに置き換えて、一行で出力できる

```py
print(list(map(lambda x : x*2, [1, 2, 3, 4])))
```
結果

```
[2, 4, 6, 8]
```
######練習問題1-2
```py
print((lambda x : sum(x))(i for i in range(1,51)))
print((lambda x : sum(x))(range(1,51)))
print( sum(i for i in range(1,51)))
print( sum(range(1,51)))
print(reduce(lambda x, y: x + y, range(1,51)))
```
結果

```
1275
```
######filter関数とreduce関数
```py
a = [-1, 3, -5, 7, -9]
print(list(filter(lambda x: abs(x) > 5, a)))
```
結果

```
[7, -9]
```
reduce関数は要素の逐次加算した結果

```py
from functools import reduce
print(reduce(lambda x, y: x + y, a))
```
結果

```
-5
```
【参考】
[Python の基本的な高階関数（ map() filter() reduce() ）](https://www.lifewithpython.com/2013/12/python-higher-order-functions-in-standard-library.html)
###まとめ
・関数の基本
・`*args`と`**kwargs`の使い方
・無名関数lambda, map関数, filter関数, そしてreduce関数の使い方を並べてみた

基本に立ち返って、並べてみると分かり易い。