Save 37% off PRO during our Black Friday Sale! »

社内用Python基礎講習テキスト

4651f57d479e562a45dd624cc24dbee3?s=47 nsaito9628
February 05, 2020

 社内用Python基礎講習テキスト

少人数でラズパイIoTハンズオンをやらないかという声掛けがあり、自己啓発で習得した初歩的スキルを棚卸して簡単なハンズオン資料を作りました。

残念ながらコロナ禍でオフラインイベントが軒並み中止になり自然消滅しましたが、勤務先社内の有志と共有するためのハンズオン資料として構成しなおして勤務先に提供しました。

現在でも社内で不定期開催される入門講習のテキストとして利用しています。

対象:Python未経験者、プログラミング未経験者も可

所要時間:2日

4651f57d479e562a45dd624cc24dbee3?s=128

nsaito9628

February 05, 2020
Tweet

Transcript

  1. 情報システム部 (2020.9.3⊿1) Python基礎講習

  2. この講習で得られること ・なぜPythonか 機械学習で主要なツール:Python ・Pythonの基本文法 初心者のはまりどころをピンポイントで解説 ・Python/Linux環境での開発の進め方 調べながら手を動かしながらのcoding作業を実体験

  3. 事前準備 参加者各自で ・講習参加者の方は業務PCに各種アプリをインストールして下さい 受講部署で ・ラズパイをケースに組付けて下さい ・起動OS用microSDカードのバックアップimageを作成して下さい (共用のHDD、共用機のストレージ等にバックアップ願います)

  4. 学習内容 Python基礎 1 Pythonの学び方 2 Hello world!(コメントとインデント) 3 数値型と文字列型 4

    シーケンス型(list型、tuple型、 5 set型、マッピング型(dictionary) 6 制御フロー(if 文、elif、else、for文) 7 制御フロー(while文、continue、break) 8 ライブラリー・モジュール・クラス・メソッド 9 関数 10 ファイル操作 11 画像取得(openCV) 12 例外処理 実習課題 13 nanoエディタでhello.pyをつくる 14 GPIOでセンサーデータを読込む 15 センサートリガーで画像取得する 10:00 12:00 15:00 16:00 一日目 16:00 二日目
  5. 事前準備

  6. 各種アプリのインストール① SDカードフォーマッターDLページ: https://www.sdcard.org/jp/downloads/formatter/ イメージライターDLページ: https://sourceforge.net/projects/win32diskimager/ SDカードのフォーマッターとOSイメージを焼付けるライターをDL ※i-filterにはじかれてリンク先が開かない場合はURLをブラウザにコピペしてください 全て「次へ」または標準の選択肢で実行すればインストールできる

  7. 各種アプリのインストール② WindowsPC側のターミナルソフト(TeraTerm)をインストール TeraTermDLページ: https://ja.osdn.net/projects/ttssh2/releases/ Exe形式を保存して実行 ・ ・ ・ ・ ・

    ・ 全て「次へ」 ※i-filterにはじかれてリンク先が開かない場合はURLをブラウザにコピペしてください
  8. 各種アプリのインストール③ WindowsPC側とRaspberryPiのファイル交換ソフトをインストール WinSCP DLページ: https://ja.osdn.net/projects/winscp/releases/ 参考ページ : https://qiita.com/atmaru/items/b8cc50b8926f736f5b11 クリック クリック

    インストール実行 最近追加されたものに WinSCPがあるのを確認 ※i-filterにはじかれてリンク先が開かない場合はURLをブラウザにコピペしてください 全て「次へ」または標準の選択肢で実行すればインストールできる
  9. 起動OS imageのバックアップ Win32DiskimagerでストレージにmicroSDカードをimage保存する 1.バックアップするmicroSD 2.Imageファイルに名前を付ける 3.Readを実行 部署で1つでいいです

  10. バックアップimageによる起動ディスクの復元① microSDをフォーマットしてバックアップしたOSイメージを書込む SD Card Formatterで クイックフォーマットを実行 フォーマットが完了したら Win32Diskimagerで起動ディスクを復元 リカバリー手順

  11. バックアップimageによる起動ディスクの復元② microSDをフォーマットしてバックアップしたOSイメージを書込む 1.書き込むmicroSD 2.復元するバックアップimage 3.Writeを実行 全ての種類のファイルを表示 リカバリー手順

  12. 講習前に

  13. 取り組みのきっかけ こんなきっかけで始めました RaspberryPi ! 某生産企画室長 最近のIoTって素人でも簡単に出来るらしいから 自作してみてよ

  14. やれば出来る気がします Python ? Linux?? ラズパイ?? AWS ??? 意味分からん(殺意) 30年前に使った MS-DOSとか。。

    N-BASICとか。。 QuickCとか。。 みたいなやつか??? 予定線表示 生産予定と実績の差を表示 ハマりましたが、独学で動くものが出来ました 出来た理由:予想以上に学習環境が充実していたからか?
  15. 生技/開発部門の強力な武器になる気がします 汎用デバイスの進化で 状態監視、遠隔制御は素人の内作が可能な時代に突入した? 設備設計、ハード技術者が「少し」ソフトを学ぶ意義は大きい 赤外・磁気 光 電流計 エッジコンビーティング (ラズベリーパイ) 感度調整回路

    リレー wifi /eth LAN構築 LoRaWAN/sigfox エッジデバイス 通信ネットワーク センサー 回路 端末 wifi/3G LPWA SageMaker Forecast IoT Core Key-value DB RDB AppSync Athena QuickSight API Gateway CloudFront S3 Lambda ECS 接続 認証 ストレージ 分析 DB 機械学習 ザバーレス実行・連携 サーバーまわり Cognito クラウド構築 OS 計算・データ処理・機械学習 web・画面表示 言語 ESP32 …
  16. なぜPythonか

  17. Pythonの特徴 ①開発者・利用者が多い、増加中 ⇒学習環境と事例が充実 ②機械学習・統計・計算ライブラリが充実 ⇒AIの勉強、独自設計がし易い

  18. AI活用にはITリテラシーが不可欠? ITリテラシー※、※※とは 出典:ASCII.jpデジタル用語辞典他 ①情報基礎リテラシー ・情報を探し出し精査して使う能力 ②コンピュータリテラシー ・コンピュータを操作したり、コンピュータに関する知識 ・Pythonなど特定のプログラム言語を読み書きする能力 ③ネットワークリテラシー ・AI端末をつなぐネットワークやセキュリティに関する知識

    ※リテラシー:読み書きする能力のこと(「知恵蔵」より) ⇒転じて技術要素を理解したり操作する能力 ※※3つの領域に大別されるが厳密に定義づけされている訳ではない
  19. 設備の制御にPythonは…? 組込み系デバイス △ または ✖ ただし、学習コストは必要 PLC-gateway間の双方向通信 ◦ または △

  20. Python基礎

  21. Pythonの学び方(実体験) ・まず、やりたいことを複数key wordで検索してみる ・文法の基本は公式Document参照 https://docs.python.org/ja/3/ ⇒まずはチュートリアルをやってみる ・有償e-learningも色々ある、例えばPyQ https://pyq.jp/ ・書籍購入はweb上でよく調べてから 定番系書籍

    ・入門 Python 3 ・独学プログラマー Python言語の基本から仕事のやり方まで ・動かしてエラーが出たら? エラーメッセージで検索してみる
  22. 1-1 TeraTermでラズパイとssh接続 リモート操作するWindowsPCとLANケーブルで接続して電源ON 1.起動OSディスク(microSDカード)を ラズパイのスロットに挿入 2.配線を接続 ①LANケーブル ②電源ケーブル ① ①

    ② ②
  23. 1-1 TeraTermでラズパイとssh接続 2~3分後にWindowsのDesktopよりTeraTermを立上げログイン ラズパイのCLI画面が開けたら接続成功 初期設定 ユーザ名: pi4b0 パスフレーズ: TeraTerm実行 ホスト名はseigiiotpiXX.local

    XXは01~04の何れか SDカードケースのテプラの番号 接続 この画面が出たら ログイン成功 XXは01~04いずれか
  24. 1-2 ファイル交換アプリでラズパイにログイン WindowsPC側とRaspberryPiのファイル交換ソフトをインストール WinSCP DLページ: https://ja.osdn.net/projects/winscp/releases/ 参考ページ : https://qiita.com/atmaru/items/b8cc50b8926f736f5b11 ログイン完了

    22 SCP pi4b0 seisangijutsu ログイン実行 WinSCPを起動 「はい」で実行 ホスト名はseigiiotpiXX.local XXは01~04の何れか SDカードケースのテプラの番号
  25. 2 Hello world!(コメントとインデント) Pythonは インデント で文をグループ化するのが大きな特徴 #を書くと、それ以下の一行分はコメント文になる コメント文 インデントでループの階層を定義 (半角で4コマ)

    プリント文:print(xxx)で変数xxxを表示 print(“xxx”)で””で挟んだ文字列を表示 RaspberryPiのコマンドラインで 「python ⏎」でpythonコマンドプロンプトが出る
  26. 3 数値型と文字列型 数値型: 整数 、浮動小数点数 、複素数 (浮動小数点数 は倍精度) 文字列の結合も +

    で可能 “ ”または‘ ’で括った文字を直接結合可能 文字列型: " "または' 'で括った文字 異なる型は結合できない これは可能
  27. 4 シーケンス型(list型、tuple型) list型: [ ]でくくる ,で区切る 文字列型でも数値型でも作れる 値の書き換えができる tuple型:,で区切るだけ 文字列型でも数値型でも作れる

    Tuple型は インデックス毎の 値の書き換えはできない tuple型を書き換える場合は 定義をしなおす list型はミュータブル、tuple型はイミュータブル、両方インデックスあり (参考)イミュータブル: https://python.ms/immutable
  28. 5 set型、マッピング型(dictionary) set型はdictionary型のkey部分だけのデータ型 set型はイミュータブルでインデックスが無い dictionary型のkeyはイミュータブルで重複不可、値はミュータブル set型: { }でくくる ,で区切る 文字列型でも数値型でも作れる

    インデックスが無い dictionary型:「key : 値」の組合せを{ }でくくる 「key : 値」の組合せは,で区切る 文字列型でも数値型でも作れる 値の書き換えができる set型はtuple型と同様に 値の書き換えはできない set型はtuple型と異なり 同じ値を複数カウントしない set型はtuple型と異なり データを順番付して保存できない ⇒インデックスがないから指定できない
  29. 6 制御フロー(if 文、elif、else、for文) ifステートメント: いわいるif文 else if はelifと記述する forステートメント: 「文字列」というlistに3つの文字列を値として入れる

    ⇒3つの値なのでインデックスは0,1,2 for文ではシーケンスのインデックス順にループを実行する ※他の言語にはないところで慣れが必要 for文を数値で制御するには組込み関数range()が必要 組込み関数len()を使うとlistのインデックス(要素)の総数が 得られる ⇒左の例でrange(len(文字列))はrange(3)と同義 else ifはelifと表記 for文は他言語と異なり「データの集まりから一つずつデータを取出す」
  30. 7 制御フロー(while文、continue、break) continue: ループの途中で ループの先頭に戻る break: ループの途中で ループから抜ける else節: if文以外でも

    for文、while文のendで 実行することがある whileステートメント: いわいるwhile文 条件が正である限り ループ内の処理を実行する Elseをfor文/while文のループ後に置くことがある
  31. 8① ライブラリー Python標準ライブラリ: https://docs.python.org/ja/3/library/index.html モジュール・パッケージ・ライブラリの関係 よく使うライブラリー 組込み型: int、float list、tuple、range set、dictionary

    組込み例外: KeyboardInterrupt EOFError、 ImportError FileNotFoundError ZeroDivisionError データ型: datetime ファイルアクセス: pathlib、os.path ファイルフォーマット: csv 汎用OS: os、io time 画像処理: openCV PIL(Pillow) 数値演算: numpy 機械学習: scikit-learn Pytorch TensorFlow TensorFlowフレームワーク: pandas keras 標準ライブラリー 外部ライブラリー ライブラリ: いくつかのパッケージをまとめたもの (モジュールやパッケージをライブラリと 呼ぶこともある) パッケージ: 複数モジュールをまとめたもの モジュール: pythonファイル(.py)のこと 複数のクラスや関数を含む 呼び出して使えるように、定型のpythonプログラムをまとめたもの
  32. 8② モジュール・クラス・メソッド 必要なモジュール(ライブラリ)をimportしてクラス、メソッドを呼び出す t0 = datetime.datetime.now() 新たに定義した datetimeクラスの インスタンス datetime

    モジュール モジュール内の クラス ローカルの現在時刻を 取得するメソッド ←ライブラリーをインポート ←モジュールの中のdatetimeクラスよりnow()メソッドで プログラム実行開始したローカル時間を取得 ←”d”が押されたら、開始時間から今までの経過時間を表示 ←”z”が押されたら終了 実行結果
  33. 9 関数(準備:センサーをラズパイに接続する) 近接センサーのON/OFF信号を読み取って表示する関数をつくる ※GNDはどこでもOK 赤外近接センサー(E18-D80NK) 5V + (5V) - デジタル出力

    ジャンパーワイヤー + ブレッドボードでセンサーとラズパイを接続
  34. 9 関数① 関数:特定の処理をひとまとまりにしたもの、引数と返り値を定義できる 重要:関数は定義文、それ自体が実行命令にならない!!! def「関数名」():で関数を定義 引数なし・返り値なし 引数あり・返り値なし 引数あり・返り値あり 引数なし・返り値あり 単純に実行可能

    初期値が必要 実行結果を受け取る 変数が必要 初期値と 実行結果を受け取る 変数が必要
  35. 9 関数② 引数なし・返り値なし ←wiringpiライブラリーをインポート ↓センサーのON/OFF状態を読み取る関数の定義 ←定義した関数の実行 wiringpi ライブラリーからas pi として呼び出す関数

    pi.wiringPiSetupGpio() : GPIO初期化関数 pi.pinMode(trigger_pin, PIN_MODE) :指定portの入出力モードを設定 trigger_pin :GPIOのport番号(21) PIN_MODE :入力値を読む時はpi.INPUT、 出力時はpi.OUTPUT pi.digitalRead(trigger_pin) :指定portの入力信号を読み取る trigger_pin :GPIOのport番号(21) センサーのON/OFFを読み取る関数を、引数・返り値有り無しでつくる ライブラリー名が長い場合はas構文で略称を定義する
  36. 9 関数➂ ←定義した関数の実行 引数あり・返り値なしの関数表記 引数あり・返り値あり関数表記 ←引数でGPIO port番号をを渡す tr_signalというインスタンス(変数)で返り値を受け取る 引数なし・返り値ありの関数表記 ←定義した関数の実行

    ←引数でGPIO port番号をを渡す ←定義した関数の実行 ↓関数の定義 ↓関数の定義 tr_signalというインスタンス(変数)で返り値を受け取る ↓関数の定義
  37. 10 ファイル操作 サンプルファイル「hello.txt」を読み出して表示するプログラム 組込み関数open()でファイルを開き、read()で内容を読み出す 開始と終了がある処理はwith構文を使うと自動終了してくれる <サンプルファイル hello.txt> ←保存先パス+ファイル名を新規オブジェクトpathに渡す ← pathのファイルをファイルを開き、オブジェクトfに渡す

    ←さっき開いたファイルの中身を読んで新規ファイルオブジェクトfに渡す ←ファイルの中身:オブジェクトsの種類をprintする ←ファイルの中身:オブジェクトsの内容をprintする ←open()関数で開いたファイルオブジェクトfを閉じる ←同様の実行結果 上記の内容は、with構文を用いるとこのように書ける with構文を使う場合close()が不要になる
  38. 10 ファイル操作 新規作成ファイル「new_file.txt」にサンプルテキストを書き出すプログラム 組込み関数open()で新規ファイルを開き、write()で内容を書き出す 開始と終了がある処理はwith構文を使うと自動終了してくれる 新規作成ファイル「new_file.txt」を 開いて確認 ←新しく作るファイルの保存先パス+ファイル名をpathに渡す <書き出したファイル new_file.txt>

    ←書き込む中身 ←write()関数でファイルに書き込みする ←新規ファイルが生成されて、書き込みされてるか確認 ←書き込みされてることを確認
  39. 11 画像取得(openCV) ラズパイにUSBのwebカメラをつないでimport cv2でライブラリー取得 cv2.VideoCapture()でカメラと接続、.read()で読込み、.imwrite()で保存 openCVPythonチュートリアル:http://lang.sist.chukyo-u.ac.jp/classes/OpenCV/py_tutorials/py_tutorials.html basenameコマンドを実行するとカレントにjpgは存在しない 今撮影した画像”cv2_sample.jpg”が保存されている

  40. 12 例外処理 指示どおりに実行できないとプログラムは中断する ⇒想定されるエラーコードが発生したら「例外処理」を実行する ⇒例外処理では、特別なログを残す、無視してループを継続する等する コンピューターは0で割る除算ができず forループを最後まで実行できない for文中で0割り計算が発生したら無視させると Forループを最後まで実行できる forループの始まりは

    i = 0 なので いきなりエラーが出て終了する 例外処理で0割をスキップ i=0~9まで10ステップの計算を完了 try: “やりたい処理内容” except “例外処理したい例外クラス名”: “例外時の処理内容”
  41. 13 nanoエディタでhello.pyをつくる nanoエディターで実行ファイルを作成し「Hello World」を表示する ここに、Hello Worldを表示するコードを書き込む 保存したファイルの実行結果を確認 sudo nano new_hello.py

    実行権限必要 nanoで エディターが 立ち上がる ファイル名(新規/既存いずれもOK) .pyの拡張子でpython fileと認識 「sudo python new_hello.py」で実行 Ctrl-x、yで保存してnanoを終了
  42. 14 GPIOでセンサーデータを連続読込み 近接センサーのON/OFFを表示するフローチャートを作成 以下の動作の実行フローを考えてみる(ほぼそのまま下記の通り) ・ライブラリーのimport ・GPIOポートの初期化 ・無限ループ内でセンサー信号の読み込み ・センサー信号を読んだらprint文でスクリーンに表示 ・0.25秒毎にセンサー信号を取得する ・ctrl-cを押したらループを脱出

    ※まずif文は使わずに ラズパイGPIOとセンサーの接続方法は9 関数と同様
  43. 14 GPIOでセンサーデータを連続読込み 使用するライブラリー wiringpi (as pi)から呼び出す関数(9 関数で使ったのと同じ) pi.wiringPiSetupGpio() : GPIO初期化関数

    pi.pinMode(trigger_pin, PIN_MODE) :指定portの入出力モードを設定 trigger_pin :GPIOのport番号(21) PIN_MODE :入力値を読む時はpi.INPUT、 出力時はpi.OUTPUT pi.digitalRead(trigger_pin) :指定portの入力信号を読み取る trigger_pin :GPIOのport番号(21) timeから呼び出す関数 time.sleep(sec) : sec秒だけプロセスを停止させる sec :停止させたい時間、単位は秒、1秒以下は少数を入力 ctrl-cをつかまえる組込み例外関数(例外処理のexceptで使用) KeyboardInterrupt
  44. 14 GPIOでセンサーデータを連続読込み 新規.pyファイルを作成 ・課題①で「new_hello.py」を新規作成した要領で nanoエディターで新規ファイルを開いてプログラムを書く

  45. 14 GPIOでセンサーデータを連続読込み 関数定義・__main__変数を使った構文 ・今作ったファイルを別名保存する ・プログラムの処理部を9のように関数定義する ・__name__を使ったmain文を使った記述に書き直してみる __name__変数の使い方 def 「関数名」(引数): #処理内容

    if __name__ == ‘__main__’: #処理部を記述 #ここに関数を呼び出す … __name__を使わないモジュール __name__を使ったモジュール importすると 実行される importしても 実行されない https://blog.pyq.jp/entry/Python_kaiketsu_180207 https://techacademy.jp/magazine/18871 https://qiita.com/ryo_xsjsj/items/c0b64f3679da9d168aaa 参考:
  46. 14 GPIOでセンサーデータを連続読込み 表示内容をアレンジ センサー信号の表示の仕方を工夫してみる デジタル信号のまま 状態名で表示 状態が変化した時刻を表示

  47. 15 センサートリガーで画像取得 センサー信号が変化(物体検知)したら写真を撮影する 14の演習機器に加えてUSB2.0 portにUSBカメラを接続する

  48. 15 センサートリガーで画像取得 11のコマンドと14で作成したcodeを組合わせてみる 以下の動作の実行フローを考えてみる(ほぼそのまま下記の通り) ・ライブラリーのimport ・GPIOポートの初期化 ・0.25秒毎にセンサー信号を取得して変化を確認する ・センサー信号に変化があったら写真を撮影 ・ctrl-cを押したらループを脱出

  49. 15 センサートリガーで画像取得 サンプルcode実行例 センサーを 手で遮った

  50. 15 センサートリガーで画像取得 WinSCPでラズパイに保存した画像をPCにコビーする エクスプローラーから画像を開いて確認 ラズパイに保存した画像をPCで確認

  51. END