Python プログラミング ワークショップ - 超々入門編 Vol.4

# 本題の前に

---
## 位置付け・前提

本記事は、**社内ワークショップ** のために用意したものです。そのため、次の前提で進めることをご理解ください。

---
## 本ワークショップの目的
参加者が**必要に併せて自学できる入口に立つ** ことを目的とします。

* 実用的なプログラミングを **ハンズオン形式** で実行して、理解を深めます。
* 本ワークショップだけで、あらゆるプログラムがすいすい組めるようになるわけではありません。
* 後日にプログラミングで何かを作ろうとしたときに、自分で調べて製作できるようになることを目指します。
* なんかこういうもんだ、という感じで軽く頭に残れば大丈夫と考えましょう。

---
## ワークショップの進め方
ワークショップは、基本的にハンズオンを中心に進めます。（一部解説は入れます）

* ご自分の業務用途のパソコンを利用してください。
* 基本的には**「写経」**を原則とします。
    * 写経 ＝ 自分でキー入力して写すこと ≠ コピペ
    * 書き方を頭の中に入力する/刷り込むつもりで、時間がかかっても全て手でキー入力してください。
    * IMEの入力補完はOK。
    * 入力間違いによるトライ・アンド・エラーも、学習の中での重要な要素とご理解ください。
* 紹介する内容は、**基本的には分からないもの**です。一度すべて動作させてから「あー、あんな感じか」とニュアンスを掴んでください。
* 深く悩んではいけません。

---
## 注意

本ワークショップは **60〜120分** を想定しています。そのため、本格的な学習には時間が圧倒的に足りないので、**体系的な学習は行いません**。

本格的に０から思い通りのプログラムが組めるようになるには、自学習もしくは何らかの講座を受講する必要があります。

---
## ターゲット
本ワークショップでは、主に下記の参加者を対象とします。

* プログラミングを本業としない人
* プログラミングが苦手、あるいは実用的なプログラムを組んだことが無い人
* プログラミングの基礎的なことを知らない初心者

中上級者はまったく相手にしていないため、敢えて言及しない事項が沢山あることについてはご了承ください。

---
## プログラミング環境の準備

次のどちらかをインストールしてください。時間的な余裕がある方は、Anaconda をインストールしてください。

**注意：両方インストールする必要はありません**

---
# 前回までに覚えたこと（復習）

これまでのワークショップでは下記の内容を学習してきました。

## プログラミングの考え方
* プログラム実行
* 四則演算
* 変数 (文字列型 / 整数型 / 真偽型)
* 繰り返し処理 (while)
* 条件分岐 (if)
* 字下げ（インデント）の意味
* 関数の実行方法

## Pythonモジュールの使い方（一部）
* 一時停止 (time.sleep)
* 時間データの扱い方(datetime)
* ダウンロード/アップロード(requests)

## その他
* JSON書式
* Slackへの投稿方法
* Jupyter Notebook / Google Colaboratory
* Python CLI
* (社内でのみ Selenium IDE)

---

これらを復習したりするには、ワークショップを見直すのも良いですし、コチラの問題を解いてみたり、例題を写経してみることをオススメします。

* [問題集 - Pythonのお勉強](http://python.rdy.jp/wiki.cgi?page=%CC%E4%C2%EA%BD%B8)
* [Python基礎ドリル　穴埋め式](https://www.amazon.co.jp/dp/B087CPXZTG/)
* [現場ですぐに使える！ Pythonプログラミング逆引き大全 313の極意](https://www.amazon.co.jp/dp/B07CKW7HRT/)

---

# 本日のゴール

現代のプログラミングで必要不可欠な「関数」と「クラス」、「オブジェクト」の概念を理解し、簡単な関数やクラスが作れるようになること。

これにより、様々なモジュールやSDKを活用できるようになることを目指します。

可能であれば、書いた内容については後から正しく理解してください。ただし、完璧に覚える必要はありません。

---

# ハンズオン開始

---
## ハンズオン1

---

### ハンズオン1-1

c:\scriptフォルダに、次のスクリプトを exp411.py という名前で保存して、実行しなさい。

```python:ex411.py
flag = True

# Part 1
if flag is True:
    print("Test Python is True.")
else:
    print("Test Python is False.")

# Part 2
if flag is True:
    print("Test Python is True.")
else:
    print("Test Python is False.")

# Part 3
if flag is True:
    print("Test Python is True.")
else:
    print("Test Python is False.")
```

---

### ハンズオン1-2

c:\scriptフォルダに、exp411.py を exp412.py という名前で別名保存して、修正してから実行しなさい。

```python:ex412.py
flag = True

def printMsg():
    if flag is True:
        print("Test Python is True.")
    else:
        print("Test Python is False.")

printMsg()
```

---

### ハンズオン1-3

c:\scriptフォルダに、exp412.py を exp413.py という名前で別名保存して、修正してから実行しなさい。

```python:ex413.py
F1 = True
F2 = False

def printMsg(flag):
    if flag is True:
        print("Test Python is True.")
    else:
        print("Test Python is False.")

printMsg(F1)
printMsg(F2)
```


---

### ハンズオン1-4

c:\scriptフォルダに、exp413.py を exp414.py という名前で別名保存して、修正してから実行しなさい。

```python:ex414.py
F1 = True
F2 = False

def printMsg(flag, msg):
    if flag is True:
        print("Test Python is " + msg)
    else:
        print("Test Python is not" + msg)

printMsg(F1, "easy")
printMsg(F2, "difficult")
```


---
## 解説1

---
### プログラミングのおやくそく（復習）
* 基本的に上から一行ずつ実行します。
* プログラミングとは、「プログラムを書く → 実行する → 誤ったところを修正する → 再実行する」を繰り返すのが基本です。
* なるべく読みやすく、短く書ければ書けるほど良いです。
* 最初はルールを暗記しないこと。慣れるまでは、後でググれるように練習していくのが近道です。

---
### 今回からの変更点

* 解説の資料はポイントのみとします。
* 詳細は動画をご覧ください。（社内配信のみ）
* ポイントのトピックと"Python"というクエリでググっても十分理解できる記事が出てきます。自習する場合にはそちらを参考にして下さい。

---
### ハンズオン1-2 解説

* ex411.py -> ex412.py ＝ 同じ処理部分を「関数」化（メソッドとも呼ぶ）
* 関数（メソッド）とは「処理をまとめて、名前を付ける」仕組み。再利用が簡単になる。
* 関数（メソッド）の作り方

```
def 関数名():
    処理内容
```

* 関数の実行方法

```
関数名()
```

---
### ハンズオン1-3 解説

* ex412.py => ex413.py ＝ 関数の「引数（パラメータ）」を活用する
* 「引数（パラメータ）」とは、「関数」に可変部分を持たせる仕組み。
* 引数のある関数の作り方

```
def 関数名(引数):
    処理内容
```

* 関数に引数で「値を渡す」方法

```
関数名(引数)
```

---
### ハンズオン1-4 解説

* ex413.py => ex414.py ＝ 関数で複数の「引数（パラメータ）」を活用する
* 「引数（パラメータ）」には、変数だけでなく、直接 値（スクリプトでは「文字列」）を渡すことも可能。
* 引数を受け取った関数では、引数を自由に利用できる。

---
## ハンズオン2

---

### ハンズオン2-1

c:\scriptフォルダに、次のスクリプトを exp421.py という名前で保存して、実行しなさい。

```python:ex421.py
ONES = "1"
ONEN = 1

if ONES == ONEN:
    print("Same")
else:
    print("Not Same")
```

---

### ハンズオン2-2

c:\scriptフォルダに、exp421.py を exp422.py という名前で別名保存して、修正してから実行しなさい。

```python:ex422.py
SEVEN1 = 7
SEVEN2= "7"

print(SEVEN1 + int(SEVEN2))
print(str(SEVEN1) + int(SEVEN2))
print(SEVEN1 + SEVEN2)
```

最後の一文でエラーが起こりますが、そのまま次のハンズオンに進んでください。


---

### ハンズオン2-3

c:\scriptフォルダに、exp422.py を exp423.py という名前で別名保存して、修正してから実行しなさい。

```python:ex423.py
ONES = "1"
ONEN = 7.0

if ONES:
    print("ONES is True.")
else:
    print("ONES is False.")

if ONEN:
    print("ONEN is True.")
else:
    print("ONEN is False.")
```



---
## 解説2

---
### ハンズオン2-1 解説

#### 変数には型がある

* 真偽型 ( Boolian / bool ) ... True/False
* 文字列型 ( String / str）
* 整数型 ( Integer / int ) ... -2 -1 0 1 2 ...
* 浮動小数点型（ Float / float ) ... 1.0 0.0 -2.0 ...
* バイトデータ型（バイナリ） ( bytes )

この他にも沢山の型があり、型が異なれば同じデータとは見なされない。
正確な情報はコチラを参照すること。

[組み込み型 — Python 3.7.7 ドキュメント](https://docs.python.org/ja/3.7/library/stdtypes.html)

---
### ハンズオン2-2 解説

* 変数は型を合わせてから、一緒に処理をする必要がある
* 型を合わせることをキャスト（変換）すると読んだりする
* キャストする主な方法は次の通り。

```
bool(変数)
str(変数)
int(変数)
float(変数)
```

* print文は文字列型しか引数として渡せない
* 同じように利用する関数ごとに、だいたいは渡せる型が決まっている

※Unicodeとバイナリの変換は複雑なので省略。

---

### ハンズオン2-3 解説

* 型が異なっても同じと見なされる特殊なデータがある
* 1 / 1.0 は True と等しい
* 0 / 0.0 は False と等しい
* if文の場合、0以外の場合はTrueとして評価される

```if文の特殊な動作
FLAG = "TEST"

if FLAG:
    print("True")
else:
    print("False")
```

注意：利用するプログラミング言語に依って、ちょっとずつ動きが違うことがあります。

---

## ハンズオン3

---

### ハンズオン3-1

c:\scriptフォルダに、次のスクリプトを exp431.py という名前で保存して、実行しなさい。

```python:ex431.py
LIST = [10, 20, 'テキスト']
print(LIST[0])
print(LIST[1])
print(LIST[2])

LIST[2] = 100

for i in LIST:
    print(i)
```

---

### ハンズオン3-2

c:\scriptフォルダに、exp431.py を exp432.py という名前で別名保存して、修正してから実行しなさい。

```python:ex432.py
DICT = { 'one': 1, 'two': 2, 's1': 'Text1', 's2': 'Text2'}
print(DICT['s1'])
print(DICT['two'])

for i in ['one', 'two', 's1', 's2']:
    print(i)

print('---')
for i in DICT.keys():
    print(DICT[i])
```

---

### ハンズオン3-3

c:\scriptフォルダに、exp432.py を exp433.py という名前で別名保存して、修正してから実行しなさい。

```python:ex433.py
TUPLE = (1, 2, 'TEXT0')
for i in TUPLE:
    print(i)

TUPLE[3] = 100
```
エラーになっても構いませんので、次に進んでください。

---

## 解説3

---
### ハンズオン3 解説

#### 変数には型がある

* 複数の値をまとめて扱う型がいくつかある

##### リスト(list)
* []で囲んで、,で区切る。数値や文字列も要素にできる。
* 変更可。
* 0から始まるキーを指定して、値を取り出す
* 値を指定して入出力できるし、専用の関数を利用することも可能。

##### タプル(tuple)
* ()で囲んで、,で区切る。数値や文字列も要素にできる。
* 変更不可。
* 0から始まるキーを指定して、値を取り出す
* 値を指定して入出力できるし、専用の関数を利用することも可能。

##### 辞書(dict)
* {}で囲んで、,で区切る。
* いわゆる「JSON」と同じ。
* キーと値は:で区切って１セット。セットごとに,で区切る。
* キーを使って値を呼び出す。
* 専用の関数があり、覚えるともっと便利に使える。

それぞれキチンと解説すると、いろいろあるので、今回は存在を知る程度で省略。

----
## ハンズオン4

---

### ハンズオン4-1

c:\scriptフォルダに、次のスクリプトを exp441.py という名前で保存して、実行しなさい。

```python:ex441.py
class TestClass:
    x = 1
    def show(self):
        print(self.x)

objTest = TestClass()
print(objTest.x)
objTest.show()
```

---

### ハンズオン4-2

c:\scriptフォルダに、exp441.py を exp442.py という名前で別名保存して、修正してから実行しなさい。

```python:ex442.py
class TestClass:
    x = 1
    def get(self):
        print(self.x)
    def set(self, val):
       self.x = val

obj1 = TestClass()
obj1.get()

obj1.set(2)
obj1.get()

obj2 = TestClass()
obj2.get()

obj2.set("Obj2")
obj2.get()

obj1.get()
```

---

### ハンズオン4-3

c:\scriptフォルダに、exp442.py を exp443.py という名前で別名保存して、修正してから実行しなさい。

```python:ex443.py
import requests

r = requests

# User-Agent
url = 'https://www.cloudgate.jp/ua.php'
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
header = { 'User-Agent': ua }

res = r.get(url, headers=header)
print("HTTP CODE: " + str(res.status_code))
print("HTTP BODY: " + res.text)

# GET PARAMETER
url = 'https://www.google.co.jp/search'
params = {'q': 'Qiita'}

res2 = r.get(url, params=params)

print(res2.url)
print(res2.text)
```

---

## 解説4

---
### ハンズオン4-1, 4-2 解説

* クラスは、かなり雑に説明すると、「関数と変数をまとめて再利用する仕組み」で、「型」を自分で作ることができる。（なんのこっちゃ？）
* クラスには、変数と関数を定義することができる。
* 定義したクラスからは、新たにオブジェクト（インスタンス）を生成できる
* 生成した複数のオブジェクト（インスタンス）は、同じ仕組みをもった別物として扱う。

イメージはこんな感じ。

[![「プラトン編－イデア論とクラス／インスタンス - ITmedia エンタープライズ」より引用](https://image.itmedia.co.jp/im/articles/0506/11/object10_01.gif)](https://www.itmedia.co.jp/im/articles/0506/11/news011.html)

### ハンズオン4-3 解説

* クラスやオブジェクトを扱う考え方を「オブジェクト指向」という呼ぶ。（詳しくは奥が深いので、専門書などを読んでください。）
* Pythonモジュールを使う上で、クラスやオブジェクトの理解が必要不可欠。
* クラス、オブジェクトの生成、オブジェクトの関数や変数の扱い方、引数の渡し方を理解することで、モジュールの使い方がようやくわかってくる。
* 様々なモジュールやSDKを扱うには必要不可欠。

とはいえ、ドキュメントや利用例がしっかり在れば、特に困らないかもしれない。しかし、理解しておくとトラブルに対応しやすくなります。

---
# 終わりに

これで基礎的な用語は網羅したはずです。

とはいえ、細部はお伝えしていないため、専門書を読んだり、問題集で練習することをお勧めします。

また、この状態でAPIやSDKを使ったスクリプトを作成すると、たくさんわからないことが出てくるはずです。しかし、その都度、ドキュメントを読んで、なんとかわかるレベルまでには到達できているはずです。それらを繰り返すことで、自由自在にプログラムを開発できるようになります。頑張りましょう！

今後も学習したい方はリクエストをいただければと思います。

---
## 公式
* [Python チュートリアル](https://docs.python.org/ja/3/tutorial/index.html)
* [Python 言語リファレンス — Python 3.7.4 ドキュメント](https://docs.python.org/ja/3/reference/index.html#reference-index)
* [Python 標準ライブラリ — Python 3.7.4 ドキュメント](https://docs.python.org/ja/3/library/)
* [Python 3.7.4 ドキュメント](https://docs.python.org/ja/3/index.html)
* [Pythonモジュール索引](https://docs.python.org/ja/3/py-modindex.html)

---

## Python リファレンスサイト
* [Python入門 ～Pythonのインストール方法やPythonを使ったプログラミングの方法について解説します～ | PythonWeb](https://www.javadrive.jp/python/)
    * やりたいこと別の逆引きなので参照しやすい。
* [Pythonに関する情報 | note.nkmk.me](https://note.nkmk.me/python/)
    * やりたいこと別の逆引きなので参照しやすい。
* [Python入門 - とほほのWWW入門](http://tohoho-web.com/python/index.html)
    * 読みやすいけど、少し古いので注意。Python2ベース。
* [Python - Qiita](https://qiita.com/tags/python)
    * ここで検索すれば大抵の前例は出てくる。

---

## Python関連書籍

* [退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング](https://www.amazon.co.jp/dp/487311778X/)
    * 筆者が Python を学ぶキッカケになった書籍。ただし、タイトルは釣り。
* [いちばんやさしい Python 入門教室](https://www.amazon.co.jp/dp/B06Y3ZVS9Y/)
    * 初学者向けに学びやすいと評判。
* [スラスラ読める Pythonふりがなプログラミング](https://www.amazon.co.jp/dp/B07DR9WNKJ/)
* [現場ですぐに使える！ Pythonプログラミング逆引き大全 313の極意](https://www.amazon.co.jp/dp/B07CKW7HRT/)
* [Python基礎ドリル　穴埋め式](https://www.amazon.co.jp/dp/B087CPXZTG/)
* [100問でわかるPython](https://www.amazon.co.jp/dp/B07G7TNW7L/)