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

# 本題の前に

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

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

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

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

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

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

---
## 注意

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

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

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

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

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

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

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

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

---
### [Python 3.7](https://www.python.org/downloads/)

![python_dl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107190/e6627511-4288-1f74-26b8-3775a25bd5cb.png)

* 「Download Python 3.7.4」リンクからインストールしてください。
* 執筆時点では、3.7.4 が最新
* こちらはシンプルです。
* エディタとコマンドプロンプトでプログラミングする必要があります。
* 慣れたエディタを使い方は、こちらが良いです。

---

#### Python インストール時の注意

インストール手順の途中で、下記の画面でチェックボックスにチェックを入れてください。

![Python での環境変数の設定手順](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107190/c418712f-3cc0-cbb4-6faa-b9a669d9a246.png)

なお、インストール後でもインストーラを起動して、「Modify」を選択していけば再設定可能です。

![python　modify設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107190/a460fff9-7134-3225-65bc-9468937054d8.png)

---
### [Anaconda](https://www.anaconda.com/distribution/#download-section)

![python_dl2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107190/b987c462-8871-9f5c-f559-4077cf86b38a.png)

* 「Download」リンクからインストールしてください。
* 執筆時点では、3.7 が最新
* Python + 色々詰め込んだパッケージソフトウェア集
* こちらは少しデータが大きいです。
* プログラミング専用の総合環境（IDE）やパッケージ管理ツールが付属します。
* こちらを選んだ方は、同梱される [Spyder](https://github.com/spyder-ide/spyder/wiki) という統合を使用することを推奨します。
    * 細かい使い方は説明しません。上記のリンクに加え、[コチラ](https://pg-chain.com/python-spyder)が参考になります。

---

#### Anaconda インストール時の注意

インストール手順の途中で、下記の画面でチェックボックスにチェックを入れてください。

![Anaconda での環境変数の設定手順](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107190/f555cfdc-c6c9-102d-5635-9f122fc21f10.png)

なお、** Spydrしか使わないなら必要ない ** ですが、ｍそいインストール後に手動で設定するなら、下記のように追加する必要があります。

参考ページ：[環境変数PATHを設定する](https://www.javadrive.jp/python/install/index3.html)

追加するのは下記です。予め、フォルダが実際に存在するのはどちらか確認してください。

C:\Program Files\Anaconda3\
C:\Program Files\Anaconda3\Scripts\

もしくは

C:\Users\ユーザー名\Anaconda3\
C:\Users\ユーザー名\Anaconda3\Scripts\

![python Anaconda 環境変数の追加例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107190/b290277a-7a33-1bfc-b6b8-4a40957c8d05.png)


---
## 本日のゴール

インターネットから特定のページをダウンロードして、ファイルに保存するプログラムを作れるようになること。

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

---
# ハンズオン開始

---
## ハンズオン1

---
### ハンズオン1-1. 文字を表示するスクリプトを作る

c:\scriptフォルダを作成し、次のスクリプトを exp01.py という名前で保存しなさい。

``` exp01.py
print("Hello World!")
```
---

### ハンズオン1-2. 文字を表示するスクリプトを実行する

コマンドプロンプトで、下記のようにスクリプト exp01.py を実行しなさい。（Spyder なら「ファイル実行」ボタン もしくは「F5」キー）

```
cd c:\script
python exp01.py
```

実行結果が下記ならＯＫ。

```
Hello World!
```

---
## 解説１

---
### プログラミングのおやくそく１

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

今回は「Python（パイソン）」というプログラミング言語（プログラミングの書き方）を扱いますが、大抵のプログラミングの学習に共通します。 

---
### ハンズオン1-1 解説
文字を表示するために、下記の命令をプログラムとして保存しました。

```
print("{表示したい内容}")
```

また、プログラムを書いた時点では、まだ内容が誤っていても分かりません。

---
### ハンズオン1-2 解説
今回扱うプログラミング言語「Python」で書いたプログラムをコマンドプロンプトで実行しました。

```
python {実行したいスクリプトファイルのパス}
```

今回は画面上に表示して終わりです。ファイルなどには保存されません。

---
## ハンズオン2

---
### ハンズオン2-1. 文章を使い回して表示する

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

``` exp2-1.py
TEXT = "Hello World!"

print(TEXT)
print(TEXT)
```

大文字小文字に注意してください。

次にコマンドプロンプトで、下記のようにスクリプト exp2-1.py を実行しなさい。（Spyder なら「ファイル実行」ボタン もしくは「F5」キー）

```
cd c:\script
python exp2-1.py
```

実行結果が下記ならＯＫ。

```
Hello World!
Hello World!
```

---
### ハンズオン2-2. 文章をファイルに保存する

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

``` exp2-2.py
TEXT = "Hello World!"

file = open("hello.txt", "w")
file.write(TEXT)
file.close()
```

大文字小文字に注意してください。

次にコマンドプロンプトで、下記のようにスクリプト exp2-2.py を実行しなさい。（Spyder なら「ファイル実行」ボタン もしくは「F5」キー）

```
cd c:\script
python exp2-2.py
```

実行結果が下記ならＯＫ。

```
　
```

何も表示されない、というのが正常です。

もし何か表示されたら誤っています。

---
## 解説２

---
### プログラムのおやくそく２

ここでは「変数」と「ファイルの扱い方」を実演しました。

「変数」は、プログラミングの基本中の基本です。書き方は違っても、プログラミングなら必ず出てきます。

「変数」は、今回は「何かに付けた**別名**」と覚えてください。

また、「ファイルの扱い方」もプログラミング言語によって違いが多少ありますが、考え方はほとんど同じです。

以降の解説で詳しく説明します。

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

今回は、"Hello World"というテキスト（文章）に「TEXT」という別名をつけました。

![E66A2F4D-AAA9-4833-9E1B-7C3F84833348.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107190/28d801de-1237-817b-de95-e3782af11f1a.jpeg)

これをプログラムで現すとこうなります。

``` （抜粋）exp2-1.py
TEXT = "Hello World!"
```

これを「変数に入れる」と言ったりします。とてもとてもよく出てきます。

この「変数」のメリットは沢山ありますが、ここでは「長い文章を毎回書かずに、短い別名で使いまわせる」ことがメリットになります。

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

プログラミングの変わったルールとして、**ファイルは一度必ず変数に入れないと扱えない** というルールがあります。

そのため、ハンズオン2-2では一度ファイルを変数 file に入れています。

``` （抜粋）exp2-2.py
file = open("hello.txt", "w")
```

これはファイルへ書き込む時の定型的な書き方です。

``` （書き方）open.py
{変数} = open("{ファイルパス}", "w")
```

こういうもんだ、と理解してください。

---
次に、ファイルに書き込みます

``` （抜粋）exp2-2.py
file.write(TEXT)
```

こうすると、ファイルの変数 file に対して、変数 TEXT の中身を書き込むという処理になります。

![61DBCBBA-A029-49D3-8AAB-5A0D38AF08A0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107190/7106132e-86ab-d7ae-82c5-fa5c4e104f8a.jpeg)

``` （書き方）write.py
{ファイルの変数}.write({書き込みたいこと})
```

---
最後に、ファイルを閉じます。

``` （抜粋）exp2-2.py
file.close
```

このように書き込んだら閉じないと、正常に書き込まれなかったり、実行したパソコンのメモリ上にゴミが残ってしまって不具合の元になったりします。

``` （書き方）close.py
{ファイルの変数}.close
```

---

ファイルの書き込みは、**開く → 書く → 閉じる**の順に処理します。

パソコンのアプリケーションで、ファイルを編集するのと同じですね。

---
## ハンズオン3

---
### ハンズオン3-0 準備

簡単にインターネットからダウンロードするモジュールをインストールします。

コマンドプロントから、下記のコマンドを実行してください。

```
pip install requests
```

Pythonの便利ツール（モジュールやライブラリと呼ぶ）を、新たに追加する手順です。

今回はプログラムを簡単にするために使用します。

---
### ハンズオン3-1. インターネットのデータを表示する

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

``` exp3-1.py
import requests

URL = "https://example.com/"

RESULT = requests.get(URL)
print(RESULT.text)
```

大文字小文字に注意してください。

次にコマンドプロンプトで、下記のようにスクリプト exp3-1.py を実行しなさい。（Spyder なら「ファイル実行」ボタン もしくは「F5」キー）

```
cd c:\script
python exp3-1.py
```

実行結果が下記ならＯＫ。

``` 3-1.html
<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
        
    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 50px;
        background-color: #fff;
        border-radius: 1em;
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        body {
            background-color: #fff;
        }
        div {
            width: auto;
            margin: 0 auto;
            border-radius: 0;
            padding: 1em;
        }
    }
    </style>    
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
```

取得したWEBページのデータ（HTML）が表示されました。

---
### ハンズオン3-2 ダウンロードして保存する

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

``` exp3-2.py
import requests

URL = "https://example.com/"

RESULT = requests.get(URL)

file = open('exp.html', 'w')
file.write(RESULT.text)
file.close()
```

大文字小文字に注意してください。

次にコマンドプロンプトで、下記のようにスクリプト exp3-2.py を実行しなさい。（Spyder なら「ファイル実行」ボタン もしくは「F5」キー）

```
cd c:\script
python exp3-2.py
```

実行結果が下記ならＯＫ。

```
　
```

何も表示されないのが正解です。何か表示されると誤りです。修正してください。

あとは保存した exp.html を開いて、正常に表示されるかを確認してください。

---
## 解説３

---
# ハンズオン3-0 準備

簡単にインターネットからダウンロードするモジュールをインストールします。

コマンドプロントから、下記のコマンドを実行してください。

```
pip install requests
```

Pythonの便利ツール（モジュールやライブラリと呼ぶ）を、新たに追加する手順です。

今回はプログラムを簡単にするために使用します。

注意： pip install requests が表示されない方は、ちょっと長いですが、下記をコマンドプロンプトで実行してください。（コピペOK、自分のユーザー名部分を必ず置き換えること）

```
C:\Users\自分のユーザー名\AppData\Local\Programs\Python\Python37-32\Scripts\pip.exe install requests
```

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

こちらでは、インターネットからファイルをダウンロードする方法を紹介しています。

あらかじめインストールした、requestsモジュールを使えるようにした箇所がこちらです。

``` （抜粋）exp3-1.py
import requests
```

---
そして、そのrequestsモジュールを使って、ダウンロード(GET)する処理がこちらです。

``` （抜粋）exp3-1.py
URL = "https://example.com/"

RESULT = requests.get(URL)
```

あらかじめ変数 URL に対して、実際に接続するURLを入れました。そのURLに対してダウンロードを仕掛けています。

そして、そのダウンロードした結果は、変数 RESULT に入れています。

通常は、このような書き方をします。

``` （書き方）requests_get.py
{結果を入れる変数} = requests.get({URLのテキスト})
```
---
そして、ダウンロードできた内容(テキスト）を表示する処理がこちらになります。

``` （抜粋）exp3-1.py
print(RESULT.text)
```

変数RESULT には、ダウンロードした結果データが沢山入っています。その中から内容（テキスト）だけを表示します。

RESULT ではなく、RESULT.text とするところがポイントです。

ちなみに、RESULT.status_code とすると、HTTPステータスコードが表示できます。（正常なら 200 が表示される）

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

最後は、これまでのハンズオンの総まとめになります。

ハンズオン3-1 と違って、ダウンロードした内容（HTML）をファイルに保存します。

``` （抜粋）exp3-2.py
file = open('exp.html', 'w');
file.write(RESULT.text)
file.close()
```

この内容は ハンズオン2-2 とほぼ同じです。

保存する対象が RESULT.text、つまりはダウンロードしたテキストデータになっている点だけです。

---
### ハンズオン3-2 は実用的

ハンズオン3-2 のスクリプトは、URLとファイルパスを変更すれば実用的に使えます。

* ワンクリックで、どこか社内外のサイトからファイルをダウンロードする運用に使う。
* タスクスケジューラに登録して、定期的にダウンロードさせる。など…

沢山のファイルを一括ダウンロードしたい場合は、同じスクリプトの中で何回も処理を書けば良いのです。

簡単でしょ？

---
# 終わりに

プログラミングの基礎的なエッセンスを、いくつも詰め込んだワークショップにしてみました。

説明を端折っている部分が沢山あります。

また、繰り返し処理 や 関数、テキストの整形など、さらに実用的に使える内容は含められていません。

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

---
# 参考となる情報源

---
## 本日の内容を深めるための情報源

* 表示(print)
    * [初心者がPythonの練習 - Qiita](https://qiita.com/pugiemonn/items/c98e4e24daa177975240)
    * [文字列リテラルを記述する | Python入門](https://www.javadrive.jp/python/string/index1.html)
* 変数
    * [変数の使い方 | Python入門](https://www.javadrive.jp/python/var/)
    * [Python超入門その８〜変数の使い方をマスターしよう〜 | プログラミング教室情報サイト【プロナビ】](https://programming-study.com/technology/python-master-variables/)
* ファイル
    * [【Python入門】ファイルの文字列の読み込みと書き込みの方法 | プログラミング教室情報サイト【プロナビ】](https://programming-study.com/technology/python-file/)
    * [Pythonでファイルの読み込み方法をマスター｜open関数 | 侍エンジニア塾ブログ（Samurai Blog） - プログラミング入門者向けサイト](https://www.sejuku.net/blog/60333)
* ダウンロード（requests）
    * [Requests の使い方 (Python Library) - Qiita](https://qiita.com/sqrtxx/items/49beaa3795925e7de666)
    * [PythonのRequestsモジュールの使い方【初心者向け】 | TechAcademyマガジン](https://techacademy.jp/magazine/19195)
    * [Requests: 人間のためのHTTP — requests-docs-ja 1.0.4 documentation](https://requests-docs-ja.readthedocs.io/en/latest/)
        * 公式資料なので、ちょっと詳しい

---
## 公式
* [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/%E9%80%80%E5%B1%88%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AFPython%E3%81%AB%E3%82%84%E3%82%89%E3%81%9B%E3%82%88%E3%81%86-%E2%80%95%E3%83%8E%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AB%E3%82%82%E3%81%A7%E3%81%8D%E3%82%8B%E8%87%AA%E5%8B%95%E5%8C%96%E5%87%A6%E7%90%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Al-Sweigart/dp/487311778X/)
    * 筆者が Python を学ぶキッカケになった書籍。ただし、タイトルは釣り。
* [いちばんやさしい Python 入門教室](https://www.amazon.co.jp/%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E3%82%84%E3%81%95%E3%81%97%E3%81%84-Python-%E5%85%A5%E9%96%80%E6%95%99%E5%AE%A4-%E5%A4%A7%E6%BE%A4-%E6%96%87%E5%AD%9D-ebook/dp/B06Y3ZVS9Y/)
    * 初学者向けに学びやすいと評判。
* [スラスラ読める Pythonふりがなプログラミング](https://www.amazon.co.jp/%E3%82%B9%E3%83%A9%E3%82%B9%E3%83%A9%E8%AA%AD%E3%82%81%E3%82%8B-Python%E3%81%B5%E3%82%8A%E3%81%8C%E3%81%AA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%83%93%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A6%E3%83%89-ebook/dp/B07DR9WNKJ/ref=pd_sbs_351_2/358-4804238-5993600?_encoding=UTF8&pd_rd_i=B07DR9WNKJ&pd_rd_r=40975f9e-29b8-4fe4-b211-14a52bb1f23b&pd_rd_w=0tyUJ&pd_rd_wg=OFv7a&pf_rd_p=ad2ea29d-ea11-483c-9db2-6b5875bb9b73&pf_rd_r=5SPQTNWJSKTJE8VKH4MP&psc=1&refRID=5SPQTNWJSKTJE8VKH4MP)
    * 同上。

---
## Python 学習サービス
手軽にやれるWebサービス/オンラインスクールを集めました。

* [Python 3入門 (全31回) - プログラミングならドットインストール](https://dotinstall.com/lessons/basic_python_v3)
    * 無料で少しは学習できて良い。
* [CheckiO - coding games and programming challenges for beginner and advanced](https://checkio.org/)
    * ゲーム形式で学べて良いと評判。ただし、英語。

---
# おわりに
今後、ワークショップで取り扱いたい題材や困りごとがあれば、本記事のコメントもしくは直接ご連絡ください。（社内外問わず）