Pythonはじめから勉強 Hour3：関数

# Python はじめから勉強 Hour3：関数

* Pythonで何かしようとしたときに、まずサンプルスクリプトを探してなんとなく実行してた私が、
* 自動実行でREST API叩いて、結果の確認、VM操作までやってみたいと思う7時間
* 今回は関数の使い方。用意されてる関数から、自分で作る関数までやってみる。



## 学習資料

* たった 1日で基本が身に付く！ Python超入門 
  * https://a.r10.to/hbHMiv



## 過去の投稿

* [Pythonはじめから勉強 Hour1：Hello World](https://qiita.com/matsumo2019/items/5a69381f44456e6e6a5d)
* [Pythonはじめから勉強 Hour2：制御文](https://qiita.com/matsumo2019/items/6daa862fd34c8929fb65)



## 環境

* Windows
* Python Ver3系



## 今回出てきた関数

* print()
* len()  
* str() / int()   
* sorted()   ※ソート。昇順？ タプル？ ここでは置いておこう
* abs()



## 関数の命名規則

* 基本は変数と同じ
  * 予約語(Pythonでの予約語 ifとかNG）
  * 数字から始まる変数名（1a とかNG)
* 一般的に 「単語__単語」のルールが多い my _ function() とか。

## 関数の使いどころ

* 関数にしかできないこと。OSやハードウェアを叩くような、いわゆる 原始的な処理。print()なんてそうですね
* 複雑は処理を簡単に実現する。sorted()なんてそうですね。
* コードの重複を排除。同じようなコードを何度も書かないようにして、可読性メンテナンス性を上げるんですね



## 関数使ってみる：sorted

 * リストをソートしてみる

   ```python
   org_list = [1, 20, 19, 4, 3]
   sort_list = sorted(org_list)
   
   print('org_list'+ str(org_list))
   print('sort_list'+ str(sort_list))
   
   ```

 * 実行してみる

   ```
   >test09_function.py
   org_list[1, 20, 19, 4, 3]
   sort_list[1, 3, 4, 19, 20]
   
   ```

* 自力でもソートって書けると思うけど1行で済みますね。



## オリジナル関数を作る

* 関数の使い方（定義・引数・戻り値）

  > def 関数名(引数1、引数2):
  >
  > ​	処理
  >
  > ​	処理
  >
  > ​	return 戻り値



* 先ほどの処理を関数化してみる

  * リストを与えたら オリジナルのリストとソート後のリストを表示する （ここで初めて何も見ずにコーディングしてみる）

    ```python
    def my_sort(org_list):
    
    	sort_list = sorted(org_list)
    
    	print('org_list'+ str(org_list))
    	print('sort_list'+ str(sort_list))
    	return
    	
    my_list = [1, 20, 19, 4, 3]
    my_sort(my_list)
    ```

   * 実行してみる

     ```
     >test10_myFunction.py
     org_list[1, 20, 19, 4, 3]
     sort_list[1, 3, 4, 19, 20]
     
     ```

  * おお、一発で動いた。こりゃ嬉しい。

  

## 関数の注意事項

* 関数を先に定義する
  * Pythonはファイルの先頭から処理するために関数を呼び出すには先に宣言しておく必要がある。メイン処理は後に。



## 関数：引数や戻り値の確認

* 先ほどは単純な引数を与えた関数をやってみました。戻り値は特に扱ってません。ここでは引数や戻り値をもう少し確認

  

* 戻り値について次のようなケースがあります

  * returnを書かないケース ＞＞戻り値：None
  * 引数なしでreturnを扱うケース ＞＞戻り値：None
  * 引数ありでreturnを扱うケース＞＞戻り値：指定した引数

### 戻り値

* 戻り値の確認

```python
def my_function1(a):
	print('in function1:'+ str(a))
	
def my_function2(b):
	print('in function1:'+ str(b))
	return

def my_function3(c):
	print('in function1:'+ str(c))
	return 1
	
def my_function4(d):
	print('in function1:'+ str(d))
	return 'aaa'

aa = my_function1(5)
print (aa)

bb = my_function1(10)
print (bb)

cc = my_function1(15)
print (cc)

dd = my_function1(20)
print (dd)
	

```

* 実行してみる

```
>test11_myFunction2.py
in function1:5
None                                <<<returnなしの戻り値
in function2:10
None                                <<<引数なし return の戻り値
in function3:15
1                                   <<< return 1 の戻り値
in function4:20
aaa                                 <<< return 'aaa' の戻り値


```

* 無駄に長いけど、確認したいことは確認できた。
  * 数値だけでなく文字列も返せます



### 引数

* 関数での引数は次のような取り扱いができる

  * 複数の引数を扱う
  * 順不同で引数を指定できる「キーワード引数」
  * 数が決まってない引数(可変長引数)
    * print() など引数いくつでもOKのもの

  

* 複数の引数やキーワード引数

  ```python
  def my_function(arg1, arg2, arg3):
  	print(str(arg1)+str(arg2)+str(arg3))
  	aa = arg1 * arg2 * arg3
  	print(aa)
  	return
  
  my_function(2, 3, 4)
  
  my_function(arg2=2, arg1=3, arg3=4)
  
  ```

 * 実行してみる

   ```
   >test12_myFunction_arg.py
   234
   24
   324   <<<順序入れ替えて引数を渡した
   24    <<<当然結果は同じ
   
   ```

## 

## help 関数の使い方

 * help(関数名)

   ```
   >>> help(print)
   Help on built-in function print in module builtins:
   
   print(...)
       print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
   
       Prints the values to a stream, or to sys.stdout by default.
       Optional keyword arguments:
       file:  a file-like object (stream); defaults to the current sys.stdout.
       sep:   string inserted between values, default a space.
       end:   string appended after the last value, default a newline.
       flush: whether to forcibly flush the stream.
   
   >>> help(print)
   
   ```

* printはただ表示するだけかと思ったら、区切り文字を指定できたり、ファイルに書き込んだりできるんですね。最後に改行したくないとき、たまにありますよね。



## 名前空間と関数の型について

* 名前空間とは変数の扱える範囲を言います
  * 関数内で宣言した変数 か 関数外で宣言した変数か
* 関数の中で定義した変数は関数の外では使えません。
* 関数の外で定義した変数は関数の中で参照することができます。上書きはできないみたい
* global変数がどうのこうのありますが、推奨されてないとのことなので割愛



### 組み込み関数を使ってみる

* range関数

  * 数字の連番を作る関数

  ```python
  a = range(5)
  b = range(2, 5)
  
  print(a)
  print(list(a))
  
  print(b)
  print(list(b))
  
  
  for i in range(4, 7):
  	print(i)
  ```

 * 実行してみる

   ```
   >test13_range.py
   range(0, 5)         <<<0を省略しても range(0, 5)となる
   [0, 1, 2, 3, 4]
   range(2, 5)
   [2, 3, 4]
   4                  <<<< for文では使えそうですね
   5
   6
   ```





## 今回のまとめ

* 単純な作業については関数を使ったり作ったりするように心がける
* メモしながら、考えながらすると2時間ぐらいかかった



## 名言・ライトニングトーク用

* Qiitaのmarkdownがうまく表示されないけど、Typoraからのコピペそのままで行きます
* 次の時間はオブジェクト指向.....理解できるかな