事業企画1年目のpython学習5日目

# 本記事について
とある事業会社で事業企画をやっています。
元々は、新規営業1年→エンプラ営業3年やっていました。
事業企画への異動に伴って、ルーチンワークの自動化やスクレイピングに興味を持ちpython学習をスタートしました。
目的達成までは記事を執筆予定です。どうぞよろしくお願いいたします。

# 開発環境
jupyterlab

# 使っている本
すっきりわかるpython入門
https://sukkiri.jp/books/sukkiri_python

# 勉強計画
週5日間ミニマム1h勉強する。
最初の1weekは1冊終わらせることをgoalに。
start@ 2022/2/21

# 学習時間
１.0h

# 学び
今日は繰り返しを学びたいと思います〜

## pythonで部品を組み上げる

### 関数
今までの繰り返しなどを用いれば色々とプログラムを作れますが、見通しの悪いプログラム/修正難易度がかなり高いコードになっていきます。
そこで重要なのは、関数を自作することです。

#### 関数の定義と関数の呼び出し
定義
def 関数名():
　　　処理
※pythonで定義されている関数(例えば、print)と重複することは許されているため、間違えて定義されている関数を定義するのは避けよう。

呼び出し
関数名()


```py
def hello():  #関数を作成
    print('hello my name is kamon')

hello() #自作したhello関数を呼び出し
#hello my name is kamon

```

### ローカル変数と独立性

関数の中で定義された変数は、その関数の中でしか使えない。
ローカル変数の独立性という。

##引数と戻り値

### 引数
関数は独立した一つの世界だが、ローカル変数を関数の外から参照したい時もある。
その際に使うのが引数。



```py
def hello(name): #呼び出した時に渡されるデータを受け取る変数
    print('hello my name is{}'.format(name))
hello('kamon')　#呼び出しと同時にkamonを渡す
hello('asakura') 

#hello my name is kamon
#hello my name is asakura

```
#### 複数の引数を渡す
関数の定義
def 関数名(引数1,引数2,・・・):
　　　　　　　処理

引数を利用する関数の呼び出し
関数名(引数1,引数2,・・・）

コレクションを引き渡すこともできる。

```py
def profile(name,age,hobby):　#関数を定義、複数の引数を受け取る関数。
    print('my name is{}'.format(name))
    print('my age is{}'.format(age))
    print('my hobby is{}'.format(hobby))
profile('kamon','27','coffee') #profileを入力

#my name iskamon
#my age is27
#my hobby iscoffee

```

#### 引数と戻り値を利用する関数の定義

def　関数名(引数1,引数2,・・・):
　　　　　　処理
　　　　　return 戻り値

引数は複数の利用が可能だが、戻り値は１つのみ

```py
def plus(x,y):
    answer = x+y
    return answer
)
answer = plus(100,50)
print('足算の答えは{}'.format(answer))

#足算の答えは150

```

### 関数の連携
めっちゃ使うよ！

```py
def input_scores(name):
    print('{}さんのスコアを入力してください'.format(name))
    network = int(input('networkの点数は? >>'))
    database = int(input('databaseの点数は? >>'))
    security = int(input('securityの点数は? >>'))
    scores = [network,database,security]
    return scores

def calc_average(scores):
    avg = sum(scores) / len(scores)
    return avg

def output_result(name,avg):
    print('{}さんの平均点は{}です。'.format(name,avg))

kamon_scores = input_scores('kamon')
asakura_scores = input_scores('asakura')

kamon_avg = calc_average(kamon_scores)
asakura_avg = calc_average(asakura_scores)

output_result('kamon',kamon_avg)
output_result('asakura',asakura_avg)


#kamonさんのスコアを入力してください
#networkの点数は? >> 60
#databaseの点数は? >> 70
#securityの点数は? >> 70
#asakuraさんのスコアを入力してください
#networkの点数は? >> 40
#databaseの点数は? >> 50
#securityの点数は? >> 60
#kamonさんの平均点は66.66666666666667です。
#asakuraさんの平均点は50.0です。

```

## 関数の応用テクニック

###暗黙のタプルによる複数の戻り値
タプルは、()を省略できる暗黙のルールがある。
そのため、()内を1つの戻り値として返しているが複数のように見える。

```py
def plus_and_minus(a,b):
    return (a+b, a-b)
(next,prev) = plus_and_minus(1978,1)

```

### デフォルト引数

def 関数名(仮引数名 = デフォルト値,・・・):
    処理
　　　　　　　return 戻り値

```py
def eat(breakfast,lunch,dinner='curry'): #第一引数はだめ、最後から設定していくルール。
    print('breakfast is {}'.format(breakfast))
    print('lunch is {}'.format(lunch))
    print('dinner is {}'.format(dinner))

eat('panda','egg') #最後の引数はcurryと定義されているため省略可能

#breakfast is panda
#lunch is egg
#dinner is curry

eat('panda','egg','curry and rice') #なお、引数設定すれば下記の通りくる
#breakfast is panda
#lunch is egg
#dinner is curry and rice

```

### 引数にキーワードを指定した関数呼び出し

関数名(仮引数名 1=実引数1,仮引数名2 =実引数 2,・・・)

### 可変長変数

def 関数名 (仮引数名１,仮引数名2,・・・,*仮引数名 n):
※呼び出し時にn個以上の実引数を指定できる
※第n引数意向に指定した実引数は、1つのタプルとして受け取る
※第n実引数の指定が省略された場合は、関数は空のタプルを受け取る
※可変長引数は、末尾の仮引数にしか指定することができない。

```py
def eat (breakfast,lunch,dinner = 'curry',*desserts):
    print('朝は{}を食べました'.format(breakfast))
    print('昼は{}を食べました'.format(lunch))
    print('夜は{}を食べました'.format(dinner))
    for d in desserts:
        print('おやつに{}を食べました'.format(d))
)
eat('トースト','パスタ','カレー','アイス','チョコ','カレー')
#朝はトーストを食べました
#昼はパスタを食べました
#夜はカレーを食べました
#おやつにアイスを食べました
#おやつにチョコを食べました
#おやつにカレーを食べました

```

ということでした。

### グローバル変数

```py

name = 'kamon'
def hello():
    print('hello' +  name ) #関数内にnameは定義されていないが、外に参照しに行っている。
hello()

#hellokamon

name = 'kamon'
def change_name():
    global name #この変数は、グローバルの変数であることを宣言している。
    name = 'asakura'
def hello():
    print('hello ' + name)

```

グローバル変数を濫用することは、可読性や混乱を招く観点でリスクが非常に高い。


# 今日ミスったところ
本日は特にありませんでした。
練習問題の難易度が上がって行っています。
定期的に振り返りたいと思います。


# 感想　
金曜日ですね。
土日は休みなので、練習問題の振り返りと６・７章の学習を進めたいと思います。運が良ければ8章までやって一周本を終わらせるかもしれません。
ところで初級編を終えた後に、実践編としておすすめの本はあるのでしょうか？
どなたかお勧めがあればご教示いただけると嬉しいです。
それでは今週もお疲れ様でした。