python入門 : 4日間コース社内トレーニング
TRANSCRIPT
![Page 1: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/1.jpg)
Python 入門
Cisco Systems, Japan TAC 伊藤 裕一 (twi7er: @yuichi110)
![Page 2: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/2.jpg)
本スライドは Cisco Japan 社内で開催した TAC (トラブルシューティングを専門とするネットワークエンジニア) 向
けの python トレーニングを一部修正したものです。
演習込みで 4時間 x 4日 で開催しています
![Page 3: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/3.jpg)
トレーニングの目的
• Python を使えるようになる • プログラミングの概念を理解 • ソースコード(diffなど)を読む • SDN関連のSRをさばく • pythonで解析ツールを作ってチームに貢献
3 Python 入門
![Page 4: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/4.jpg)
トレーニングの対象者
• WindowsなりMacなりを使いこなせるユーザ • プログラミングに興味がある • トレーニングの時間 + 自習時間を持てる • ネットワークエンジニア
4 Python 入門
![Page 5: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/5.jpg)
補足
トレーニングの内容は Alan Gauld さんの Learning to proguram ver 2 を参照して作成。
Python 入門 5
Learning to Program h7p://www.alan-‐g.me.uk/
また、O’REILLY の「初めてのPython」も参照しています。
![Page 6: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/6.jpg)
プログラミングとは
Python 入門 6
![Page 7: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/7.jpg)
プログラミングとは
• 電子機器を「自分が意図する通り」に動かす手段 • 制御文で処理の流れを決める • 各処理は連続した命令で成り立つ
7 Python 入門
![Page 8: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/8.jpg)
Ping の挙動
• ICMP echo を cisco.com に3回送信し、その reply が届いた割合とRTTを算出
Python 入門 8
yuichi$ ping -‐c 3 cisco.com PING cisco.com (72.163.4.161): 56 data bytes 64 bytes from 72.163.4.161: icmp_seq=0 7l=238 cme=149.949 ms 64 bytes from 72.163.4.161: icmp_seq=1 7l=238 cme=149.783 ms 64 bytes from 72.163.4.161: icmp_seq=2 7l=238 cme=149.826 ms -‐-‐-‐ cisco.com ping stacsccs -‐-‐-‐ 3 packets transmi4ed, 3 packets received, 0.0% packet loss round-‐trip min/avg/max/stddev = 149.783/149.853/149.949/0.070 ms
![Page 9: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/9.jpg)
Pingの実装
(1)宛先アドレスを入力(cisco.com) (2)宛先に向けて ICMP echo request を打つ (3)結果を表示 -‐ ICMP echo reply がかえってきた場合 到着時刻 -‐ 送信時刻 の RTT を表示 -‐ ICMP echo reply が帰ってこなかった場合 lost したことを表示 (4) (2)-‐(3) をあと2回繰り返す (5)3回のICMPの結果を集計し、表示
S D
1回目表示
2回目表示
3回目表示
3回の結果を表示
9 Python 入門
echo request
echo reply
PC サーバ
ping の実装
![Page 10: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/10.jpg)
プログラムを組むということ • コードによる建築作業 • 簡単なモノなら少ない知識で作れる • 巨大なモノは高度な専門知識が必要
Python 入門 10
とりあえずの目標地点
![Page 11: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/11.jpg)
PYTHON
Python 入門 11
![Page 12: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/12.jpg)
プログラミング言語
• プログラムを記述するための言語 • コンピュータ(機械語)と人間(自然言語)の仲介言語 • いくつかの種類がある
12 Python 入門
00100101001101010 print('hello world') 'hello world'を表示させる
プログラミング言語 人がやりたいこと 機会が解釈可能な命令
![Page 13: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/13.jpg)
なぜ Python ?
• 文法がシンプルで初心者向け • パワフルな言語 • オブジェクト型指向言語
13 Python 入門
![Page 14: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/14.jpg)
Python 以外の選択肢
• C: ハードに近い概念を意識する必要がある OSに近いことをしないと開発が非効率 • Java: 良い言語だが、覚えることが多い Python のほうが簡単 • その他Script系言語: cisco機器が非サポート • Web系言語: cisco で重要度が低い • その他: 中級者-‐> 上級者 になりたい人向け
14 Python 入門
![Page 15: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/15.jpg)
C, Java, Python の比較 • 現在のディレクトリ以下の構造を書き出すプログラム
Python 入門 15
[/Users/yuichi/Documents/_TRAINING] CCIE Java listFile.py python [/Users/yuichi/Documents/_TRAINING/CCIE] ccie-‐lab.key [/Users/yuichi/Documents/_TRAINING/Java] Java Basic Training Day 2.pptx Java Basic Training Day 3.pptx Java Basic Training Day 4.pptx Java Basic Training Day1.pptx [/Users/yuichi/Documents/_TRAINING/python] adfunc.py dict-‐test.py excepcon.py func.py
_TRAINING CCIE
Java
Python
ccie-‐lab.key
Java Basic Training Day2 .....
adfunc.py .....
lismile.py プログラムの出力
![Page 16: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/16.jpg)
C 言語での例
Python 入門 16
![Page 17: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/17.jpg)
Javaでの例
Python 入門 17
![Page 18: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/18.jpg)
Python での例
Python 入門 18
IDLE
![Page 19: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/19.jpg)
比較結果
Python 入門 19
• Python は簡単にプログラムが書ける
![Page 20: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/20.jpg)
Python 入門 20
![Page 21: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/21.jpg)
Agenda
• Day1: インストール、基本文法、データ型 • Day2: 続データ型、モジュールと関数 • Day3: オブジェクト指向、アルゴリズム • Day4: 正規表現、エラー処理、データベース
21 Python 入門
![Page 22: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/22.jpg)
Agenda Day 1
• Python のインストール • プロンプトとIDLEの使い方 • 型と変数 • 条件分岐 • ループ • 標準入力 • 関数とモジュールの利用 • 演習
22 Python 入門
![Page 23: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/23.jpg)
PYTHON のインストール
Python 入門 23
![Page 24: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/24.jpg)
Python Installacon • Macはターミナルで最初から使える • 開発環境を作るためにバイナリからインストール • バージョンは 2.7 系の最新版
Python 公式ページ
24 Python 入門
![Page 25: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/25.jpg)
Python のバージョン
• Version 3.3.x: 最新版のバージョン • Version 2.7.x: まだまだ主流のバージョン • Cisco: 2.7.x を利用
25 Python 入門
![Page 26: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/26.jpg)
Windows へのインストール
Python 入門 26
![Page 27: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/27.jpg)
Mac へのインストール
Python 入門 27
![Page 28: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/28.jpg)
PROMPT と IDLE の利用
Python 入門 28
![Page 29: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/29.jpg)
Prompt で python を呼び出す
• Windows: Start -‐> python2.7 (command line) • Mac: terminal で python2.7 と打つ
Python 入門 29
![Page 30: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/30.jpg)
Prompt で python を呼び出す
• Windows: Start -‐> python2.7 (command line) • Mac: terminal で python2.7 と打つ
Python 入門 30
![Page 31: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/31.jpg)
Prompt の利用
• Prompt で以下のようなコマンドを発行してみる
Python 入門 31
print('hello world') 6+1*3 (6+1)*3 5/2 5/2.0 5/0
print("{} + {} = {}".format(2,3,5)) print """hello I love Cisco I love Python too """ import sys sys.exit()
![Page 32: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/32.jpg)
コマンドで script ファイルを実行 • ファイルに処理を記述し、それをコマンドで実行 • Python のスクリプトファイルは拡張子が .py • Windows は必要あればpython をパス指定する
Python 入門 32
print “hello Cisco” print “hello Python” print “done!”
test.py Mac の実行画面
$ python ファイル名
![Page 33: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/33.jpg)
コマンドで script ファイルを実行 • ファイルに処理を記述し、それをコマンド実行 • Python のスクリプトファイルは拡張子が .py • Windows は必要あればpython をパス指定する
Python 入門 33
※ 時間のあるときにパスの設定を加えておくと楽
Windows の実行画面
![Page 34: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/34.jpg)
IDLE
• このトレーニングのメインの開発環境 • Windows: startup -‐> python -‐> idle • Mac: applicacon -‐> python -‐> idle
Python 入門 34
IDLE プロンプト画面
![Page 35: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/35.jpg)
IDLE の利用 • IDLE のエディタを使った開発 • メニューより先ほど作った test.py を開く • エディタ画面を選択し、F5 を押すと実行
Python 入門 35
![Page 36: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/36.jpg)
コメントアウト
• コメント: プログラムの注釈。処理系に無視される • 一行のコメントアウト: # コメント文 • 複数業のコメントアウト: """ 複数行指定可能 """
Python 入門 36
![Page 37: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/37.jpg)
型と変数
Python 入門 37
![Page 38: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/38.jpg)
型 • データには型(種類)がある • 整数型(Integer): 1,5,-‐1 • 文字列型(String): "Cisco", "Python"
Python 入門 38
![Page 39: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/39.jpg)
型と制御
• 型とプログラムの制御には密接な関係がある – 文字列を数字で割ることはできない – 文字列と数字を結合できない
• よくある処理は手続き方法を覚える – 文字列と数字の結合は、数字を文字列に変換し
てから結合する
Python 入門 39
![Page 40: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/40.jpg)
変数 • 変数: Dataを保存する容器
Python 入門 40
5
print(5) => 5 x = 5 print(x) => 5
5 変数 X データ(定数 5) 代入
print ( ) 5
print ( ) 5
![Page 41: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/41.jpg)
変数と型
• 型宣言: この変数はこの型を格納するという宣言 • Python の変数には型宣言がない • 変数にどのような型でもいれられる
Python 入門 41
int x = 5; x = "Java" //Error
x = 5; print(x) x = "Python" # OK print(x) Java
Python
![Page 42: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/42.jpg)
Python の型
• 組み込み型 – 数字: int, float など – 文字列: 英語、日本語 – リスト: 配列に似ている – Bool: True or False – 関数: Python では関数も型の一つ – その他
• ユーザが定義した型(Class)
Python 入門 42
![Page 43: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/43.jpg)
数字
• 整数(int)と実数(float)、複素数がある • 上限は気にしなくてよい
Python 入門 43
使える演算子 説明 M + N 足し算 M – N 引き算 M * N かけ算 M / N 割り算 M % N 剰余(あまり) M**N べき乗 (M * M * M … をN回)
>>> 1234567 * 3456789 4267637625363 (42兆)
![Page 44: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/44.jpg)
数字
• インクリメントは使えない • 代入演算子で代用
Python 入門 44
演算子 説明 M += N M = M + N M -‐= N M = M – N M *= N M = M * N M /= N M = M / N M %= N M = M % N
Java int i = 0 i++
Python i = 0 i += 1 ß i = i+1
![Page 45: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/45.jpg)
文字列型 • 3種類の記述方式
Python 入門 45
シングルクオテーション string = ‘ Hello Python’ ダブルクオテーション string = “Hello Python” トリプル・ダブルクオテーション string = “””Hello World Hello Python # this isn’t comment Hello CIsco”””
改行や特殊記号も そのまま文字列に。
![Page 46: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/46.jpg)
文字列型
• 文字列も演算記号を使える
Python 入門 46
print “I love “ + “python” => “I love Python” print “hello “ * 3 => “hello hello hello “ print “I say “ + (“hello “ * 3) => “I say hello hello hello”
x = “I love “ y = “Python” print(x+y) => "I love Python"
![Page 47: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/47.jpg)
Bool型
• いわゆる True, False を持つ型 • If 文などの制御分でよく利用される
Python 入門 47
演算子 意味 A and B A も B も True なら True A or B A か B が True なら True A == B A と B が同じなら True A != B A と B が違えば True A <> B 同上 not A A が False なら True
![Page 48: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/48.jpg)
Bool型
• いわゆる True, False を持つ型 • If 文などの制御分でよく利用される
Python 入門 48
演算子 意味 A > B A が B より大きければ True A >= B A が B 以上なら True A < B A が B より小さければ True A <= B A が B 以下なら True
![Page 49: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/49.jpg)
List型 • 拡張ができる配列 [x,y,z] という形式で作成 • 演算子 [x] で、配列の x 番目にアクセスする • 何番目か(index)の指定は0から数える
Python 入門 49
list1 = [3,4,5] print(list1) => [3, 4, 5] list2 = [“I”, “Love”, “Python”] print(list2[2]) => “Python”
list3 = [[1,2], ['A',”B”]] print(list3) => [[1, 2], [“A”, “B”]] print(list3[1][1]) => “B” print(list3[5][0]) => # index out of range の Error 表示
![Page 50: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/50.jpg)
List型 • 配列長を取得: len(X) • オブジェクトの index を取得: index(X) • 配列にオブジェクトを追加: append(x) • 配列からオブジェクトを削除: del
Python 入門 50
list1 = [1,2,3,4,5] print(list1.index(3)) => 2 print(len(list1)) => 5
list1.append(6) print(list) => [1,2,3,4,5,6] del list2[1] print(list2) => [1,3,4,5,6]
![Page 51: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/51.jpg)
その他の型(後日)
• Tuple • Dicconary • File • Dates, Times • ユーザ定義の型(クラス) • 関数
Python 入門 51
![Page 52: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/52.jpg)
演習1
Python 入門 52
![Page 53: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/53.jpg)
演習 (演算)
• 以下の図形の面積をプログラムで計算してください
• 余裕があれば、import 以外は一行(ワンライナー)としてください
Python 入門 53
4cm
3cm
10cm
5cm 2cm
8cm
半径 2cm
※ 円周率は math module の π を 使ってください
>>> import math >>> math.pi 3.141592653589793
![Page 54: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/54.jpg)
演習 (ドキュメント)
• 数字 1984 と文字列 “cisco” を文字列結合し、表示してください (そのまま結合するとエラーになるので、数字を文字列に変換する必要あり)
• ググるのではなく、以下のページから必要な「組み込み関数」を探してください
Python 入門 54
Python 標準ライブラリ h7p://docs.python.jp/2/library/index.html
(英) h7p://docs.python.org/2.7/library/index.html#python
![Page 55: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/55.jpg)
制御構造
Python 入門 55
![Page 56: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/56.jpg)
制御構造
• 簡単なバッチ処理: 上から下に一行ずつ実行していく
• プログラミング – 上から下に実行していく – 決められた文法と単語(予約語)で処理方法を記述 – if文、loop文などでプログラムの流れを制御する – クラスや関数などを使って処理をまとめる
Python 入門 56
![Page 57: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/57.jpg)
プログラムの処理の流れ
• プログラムの基本的な流れは上から下へ
Python 入門 57
Step1
Step2
Step3
![Page 58: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/58.jpg)
予約語 • 空白で区切られた単語の連続でプログラムを記述する • 予約語: プログラムの制御のための「特別」な単語 • 予約語以外: 定数、変数、関数、クラス名など自由につ
けられる名前
Python 入門 58
プログラムの制御 if, for, while 宣言 class, def
予約語の例
![Page 59: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/59.jpg)
コードブロックとインデント
• C,Javaなど: {} という記号で処理をまとめる • Python: インデント(字下げ)で処理をまとめる
Python 入門 59
for(int i=0; i<10; i++){ if(i%2 == 0){ System.out.println(i + " is even"); }else{ System.out.println(i + " is odd"); }
} System.out.println("done");
for i in range(10): if(i%2 == 0): print("{} is even".format(i)) else: print("{} is odd".format(i)) print("done")
Java Python
![Page 60: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/60.jpg)
条件分岐
Python 入門 60
![Page 61: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/61.jpg)
条件分岐 IF
• 特定の条件を満たす場合のみ処理を行う
Python 入門 61
Step1
Test Condicon
Path2 Path1
![Page 62: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/62.jpg)
条件分岐 IF
• 特定の条件を満たす場合のみ処理を行う
Python 入門 62
if(条件A): 条件AがTrueなら実行 …. elif(条件B): 条件AがFalseかつ条件BがTrueなら実行 …. else: 条件AもBもFalseなら実行 …. if の条件分岐の結果に関わらず実行 ….
![Page 63: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/63.jpg)
条件分岐 IF
• Python のコード
Python 入門 63
i = 5 if (i > 10): print “This is never printed” else: print “This might be printed”
![Page 64: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/64.jpg)
(補足)条件分岐 SWITCH-‐CASE
• 実装されていない。If文で作る
Python 入門 64
switch(条件){ case A: 条件がAの場合の処理 break; case B: 条件がBの場合の処理 break default: それ以外の場合の処理 }
if(条件 == A): 条件がAの場合の処理 elif(条件 == B): 条件がBの場合の処理 else: それ以外の場合の処理
Java Python
![Page 65: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/65.jpg)
ループ処理
Python 入門 65
![Page 66: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/66.jpg)
ループ処理 for
• 特定の処理を決められた回数こなす • Pythonではリストの走査に使用
Python 入門 66
Repeated Steps
Test Condicon
![Page 67: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/67.jpg)
リストとfor
• CやJavaなどのforとは別物 • CやJavaと同じような使い方もできる
Python 入門 67
A B C D リスト
(1) Aを使って処理を実行 (2) Bを使って処理を実行 (3) Cを使って処理を実行 (4) Dを使って処理を実行
![Page 68: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/68.jpg)
for文の書式
Python 入門 68
for 変数 in リスト: 実行する処理
リストの0番目を変数に代入して処理を実行 リストの1番目を変数に代入して処理を実行 .....
string = "" for char in ["H","e","l","l","o"]: string += char print(string)
>>> Hello
![Page 69: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/69.jpg)
forによる一定回数の処理
• 一定回数の処理には range 関数を併用 • range(x): 0 から x-‐1 までの連番のリストを返す • range(x,y): x から y-‐1 までの連番のリストを返す
Python 入門 69
for(int i=0; i<10; i++){ System.out.println(i) }
for i in range(10): print(i)
Java Python
![Page 70: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/70.jpg)
(補足)イテレータ
• python の for は iterator と呼ばれる仕組み • タプルや、文字列、辞書なども key として使える
Python 入門 70
for char in "hello": print(char) => h e l l o
![Page 71: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/71.jpg)
ループ処理 while • 特定条件を満たすまでループを繰り返す • 「〜 の間はずっとループ」というようなイメージ • For ほどは使われない
Python 入門 71
![Page 72: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/72.jpg)
while に適したループ処理
• 何周すればいいか分からない処理に使う • 無限ループにならないように注意が必要
Python 入門 72
x = 6789329 i = 1 while(2**i < x): i += 1 print("2 ^ {} > {}".format(i,x))
与えられた数を2進数で表現するのに必要な桁数を求める
2 ^ 23 > 6789329
![Page 73: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/73.jpg)
演習2
Python 入門 73
![Page 74: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/74.jpg)
演習 (条件分岐)
• 1 – 100 までの偶数の値を持つ List を作成する • 1 – 10000 までの素数を表示する。 素数: 1と自分以外の整数で割れない整数
• Fizz buzz を 100 まで行う 1-‐100までを表示。 3で割り切れる時は fizz, 5で割り切れる時は buzz と表示 3でも5でも割り切れる時は fizz buzz と表示する
Python 入門 74
![Page 75: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/75.jpg)
関数とモジュールの利用
Python 入門 75
![Page 76: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/76.jpg)
関数の呼び出し • 特定の処理を行うための呼び出し口 • 関数名に引数を与えて呼び出す • 関数は返り値を返す
Python 入門 76
関数名(引数)
返り値
>>> length = len([1,2,3,4,5]) >>> print(length) 5
![Page 77: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/77.jpg)
関数で複雑な処理を隠す
• 関数を使うことでコードがわかりやすくなる
Python 入門 77
i = -‐5 if(i<0): i = -‐i print i => 5
ぱっと見、何をやって いるか分からない
i = -‐5 i = abs(i) print i => 5
関数名ですぐ「絶対数を 得るプログラム」とわかる
![Page 78: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/78.jpg)
関数でコードの重複を減らす
• コードの重複をなくし、保守性を向上させる
Python 入門 78
i = -‐5 j = 8 If(i<0): i = -‐i If(j<0): j = -‐j print(i) => 5 print(j) => 8
i = -‐5 j = 8 関数 abs の定義 print(abs(i)) => 5 print(abs(j)) => 8
![Page 79: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/79.jpg)
モジュール
• モジュールはプログラムの整理整頓手法
Python 入門 79
vs
モジュールがない モジュールを利用
![Page 80: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/80.jpg)
モジュールによる階層化
• 機能ごとによるプログラムの整理
Python 入門 80
math file system
os 自分が作成
組み込み (デフォルトで 使える)
![Page 81: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/81.jpg)
モジュールへのアクセス
• モジュールを利用するには import する必要がある
Python 入門 81
>>> random() Traceback (most recent call last): File “<stdin>”, line 1, in <module> NameError: name 'random' is not defined >>> import random >>> random.random() 0.6019003331149728
import していないと 利用できずにエラー
「モジュール名.関数」 でモジュールの関数を利用
![Page 82: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/82.jpg)
関数とモジュールの作成
• 作成の仕方などについては day2 で扱う
Python 入門 82
![Page 83: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/83.jpg)
標準入力
Python 入門 83
![Page 84: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/84.jpg)
標準入力
• ユーザからの入力を受け取る
Python 入門 84
input = raw_input() ユーザからの入力を待つ
print(input) => “hello”
“hello” と入力される 入力待ちが解除される
![Page 85: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/85.jpg)
標準入力
• 無限 echo プログラム
Python 入門 85
while(True): print “please input:” input = raw_input() print input
※ Ctr-‐C で抜ける
![Page 86: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/86.jpg)
コマンドライン引数
Python 入門 86
![Page 87: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/87.jpg)
コマンドライン引数
• スクリプトを「パラメータ」つきで起動する • スクリプト内に直接書き込むより融通性がある
Python 入門 87
pingのプログラム (1) 宛先を引数で受け取る (1) 宛先へ icmp echo request を送る (2) 宛先から icmp echo reply を受け取る (3) 受信結果を表示
ping.py
cisco.com
python.org
#python ping.py cisco.com
#python ping.py python.org
![Page 88: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/88.jpg)
sys.argv • コマンドライン引数にアクセスするには sys モジュー
ルを import する • 引数がargvにリストとして格納されている
Python 入門 88
import sys print("-‐-‐-‐-‐ args -‐-‐-‐-‐") print(len(sys.argv)) print(sys.argv[0]) print(sys.argv[1]) print(sys.argv[2]) print("-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐") a = int(sys.argv[1]) b = int(sys.argv[2]) print("{} + {} = {}".format(a,b,a+b))
$ python test.py 1 5 -‐-‐-‐-‐ args -‐-‐-‐-‐ 3 test.py 1 5 -‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐ 1 + 5 = 6
test.py
出力
![Page 89: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/89.jpg)
演習3
Python 入門 89
![Page 90: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/90.jpg)
演習(標準入力)
• ユーザが入力した文字列の文字数を表示するプログラムを作成
• 入力は何度でも受け付けるが、文字列 exit を受け取ると終了すること
Python 入門 90
![Page 91: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/91.jpg)
次回予告
• 関数を作る • 高度な型を使う • ファイル処理
Python 入門 91
• できるようになること – テキスト処理によるログの解析 – OSを操作するためのシェルスクリプトの作成
![Page 92: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/92.jpg)
Python 入門 92
![Page 93: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/93.jpg)
Python 入門 Learning to Program
For Cisco Network Engineers Day 2/4
Japan TAC DC Team.
Yuichi Ito
![Page 94: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/94.jpg)
Agenda Day 2 • Python • 続データ型 • 関数の作成 • モジュールの作成 • 演習1(Map) • 文字列処理 • ファイル処理 • OSコマンドの利用 • 演習2(ログ解析、Linuxのスクリプト)
94 Python 入門
![Page 95: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/95.jpg)
PYTHONの歴史
Python 入門 95
![Page 96: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/96.jpg)
Python • 登場時期: 1990年 • 設計者: グイド・ヴァンロッサム • 型付け: 強い動的型付け
Python 入門 96
• 1.x: 1994年 • 2.x: 2000年。メジャー言語化 • 3.x: 2008年。後方互換性なし
![Page 97: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/97.jpg)
続データ型
Python 入門 97
![Page 98: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/98.jpg)
Python の型
• ユーザ定義の型(Class) • 組み込み型(pythonが提供)
Python 入門 98
数値型 -‐ 整数 -‐ 長製数 -‐ 浮動小数点 -‐ 複素数 シーケンス型 -‐ 文字列 -‐ リスト -‐ タプル -‐ xrange型
マップ型 -‐ 辞書 ファイル型 -‐ ファイルオブジェクト
![Page 99: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/99.jpg)
用語
• オブジェクト • インデックス • エレメント • リテラル • 代入 • 引数 • 返り値
Python 入門 99
![Page 100: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/100.jpg)
辞書型 • Key と Value のペアを保持するデータ型 • KeyからValueを取得する
Python 入門 100
Apple : Red
Lemon : Yellow
Grape : Purple
Dicconary
Appleの色は?
Red !!
X : Y
追加 取得
![Page 101: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/101.jpg)
辞書の操作
• 辞書の形式: {key1:value1, key2:value2} • 値の取得: 辞書オブジェクト[key] • 値の追加(更新): 辞書オブジェクト[key] = value • 値の削除: del 辞書オブジェクト[key] • key一覧の取得: 辞書オブジェクト.keys() • keyを持っているか: 辞書オブジェクト.has_key(key)
Python 入門 101
![Page 102: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/102.jpg)
辞書型の操作 # 辞書オブジェクトを作成 >>> d = {"Apple":"Red", "Lemon":"Yellow"} # key から Value を取得 >>> d["Apple"] 'Red' # 辞書オブジェクトに要素を追加 >>> d["Grape"] = "Purple" >>> d {'Grape': 'Purple', 'Lemon': 'Yellow', 'Apple': 'Red'} # 辞書オブジェクトの要素を削除 >>> del d["Apple"] >>> d {'Grape': 'Purple', 'Lemon': 'Yellow'}
Python 入門 102
![Page 103: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/103.jpg)
辞書とリストの違い
• リスト型は線形にデータ保持 • 辞書型はハッシュを利用してデータ保持 • 要素数が増えた場合の検索が高速
Python 入門 103
ハッシュの仕組み
![Page 104: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/104.jpg)
辞書型のサンプル • Arp Table を List と 辞書で実装(クラスなし)
Python 入門 104
ipList = [] macList = [] def registerMAC1(ip, mac): if ip in ipList: index = ipList.index(ip) macList[index] = mac else: ipList.append(ip) macList.append(mac) def getMAC1(ip): if ip in ipList: index = ipList.index(ip) return macList[index] else: return None
arpTable = {} def registerMAC2(ip, mac): arpTable[ip] = mac def getMAC2(ip): return arpTable.get(ip)
Listによる実装: 探索コスト Order(N) 辞書による実装: 探索コスト Order(1)
Listによる実装
辞書による実装
![Page 105: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/105.jpg)
セット
• 重複、順序のない複数のデータを保持する型 • Value のない Map に近い
Python 入門 105
>>> a = set([1,2,3,4,5,3,2]) >>> print(a) set([1, 2, 3, 4, 5])
>>> a = set("hello") >>> b = set("world") >>> print(a) set(['h', 'e', 'l', 'o']) >>> print(b) set(['d', 'r', 'o', 'w', 'l']) >>> print(a & b) set(['l', 'o'])
![Page 106: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/106.jpg)
セットの操作
• 初期化: set(シーケンス型のオブジェクト) • 追加: setオブジェクト.add(value) • 削除: setオブジェクト.discard(value)
Python 入門 106
![Page 107: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/107.jpg)
タプル型 • 不可変なデータ構造 • 要素の数が決まった「一組のデータ」
Python 入門 107
Link down
OSPF Neighbor XXX down
Admin up
Link up
OSPF Neighbor XXX up
....
# show logging
行数(要素数)は伸びる => List型
社員情報
Yuichi
Ito
2011-‐04-‐01
Tokyo
TAC
行数(要素数)は伸びない 順不同 => Tuple 型
![Page 108: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/108.jpg)
タプル型の操作
• Tuple の作成: tupleObject = (elem1, elem2,...) • 要素の取得: item = tupleObject[index] • 複数の要素の取得: • 要素の更新: できない
Python 入門 108
![Page 109: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/109.jpg)
タプル型の操作 # Tuple の作成 >>> yuiito = ("Yuichi", "Ito", 2011) >>> yuiito ('Yuichi', 'Ito', 2011) # 要素の参照 >>> yuiito[1] 'Ito' >>> yuiito = ("Yuichi", "Ito", 2011) >>> (name, famName, year) = yuiito >>> year 2011 # 要素の更新 >>> yuiito[2] = 2009 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
Python 入門 109
![Page 110: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/110.jpg)
タプル型サンプル
• データ構造を作成可能(クラスの簡易版) • 不可変なオブジェクト
Python 入門 110
def getMinMax(numList): minNum = numList[0] maxNum = numList[0] for n in numList: if n < minNum: minNum = n if n > maxNum: maxNum = n return (minNum, maxNum)
![Page 111: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/111.jpg)
None
• 何もないことを明示するための特殊な型 • C, Java の NULL とは違うが、ほぼ同じ
Python 入門 111
![Page 112: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/112.jpg)
関数の概念
Python 入門 112
![Page 113: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/113.jpg)
関数
• 特定の処理を行う受付窓口 • 細かい処理を隠蔽
Python 入門 113
成果物(パン) プログラム(パンの作成関数)
あんぱん
カレーパン
![Page 114: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/114.jpg)
あんぱんの製造工程
Python 入門 114
こねる
材料を用意 粉などをまぜる
こねる
発酵
生地を整形 放置
あんぱんの形作り
生地を適量とる 餡をいれる
丸める
焼く
オーブンを温める パンをいれる 一定時間待つ
取り出す
![Page 115: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/115.jpg)
カレーパンの製造工程
Python 入門 115
こねる
材料を用意 粉などをまぜる
こねる
発酵
生地を整形 放置
カレーパンの形作り
生地を適量とる カレーをいれる
丸める
揚げる
油を温める パンをいれる 一定時間待つ
取り出す
![Page 116: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/116.jpg)
関数を使わないベタ書き
• 処理の区切りが分かりづらく、重複が多い
Python 入門 116
材料を用意 粉を混ぜる
こねる 生地を整形
放置 生地を適量とる
餡を入れる 整形
オーブンを温める パンをいれる 一定時間待つ
取り出す
AnPan.py
材料を用意 粉を混ぜる
こねる 生地を整形
放置 生地を適量とる カレーを入れる
整形 油を温める
パンをいれる 一定時間待つ
取り出す
CurryPan.py
![Page 117: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/117.jpg)
関数による処理単位の整理
Python 入門 117
こねる 発酵
あんぱん形作り 焼く
カレーパン形作り 揚げる 重複の排除
![Page 118: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/118.jpg)
関数によるコードの整理
Python 入門 118
関数: こねる 材料を用意 粉を混ぜる こねる 関数: 発酵 生地を整形 放置 関数: あんぱん形作り 生地を適量とる 餡を入れる 整形 関数: 焼く オーブンを温める パンをいれる 一定時間待つ 取り出す <以下省略>
Pan.py (つづき)
関数: makeあんぱん こねる 発酵 あんぱん形作り 焼く 関数:makeカレーパン こねる 発酵 カレーパン形作り 揚げる …..
Pan.py
![Page 119: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/119.jpg)
関数名
• 関数を区別するための名前 • 組み込み関数と被らないように注意が必要
Python 入門 119
![Page 120: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/120.jpg)
引数
• 関数を呼び出す際に関数に与える値 • 仮引数(関数の定義側で受け取る変数) • 実引数(関数の呼び出し側で与える値)
Python 入門 120
def 関数名(仮引数) 関数内の処理
関数名(実引数)
定義
呼び出し
![Page 121: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/121.jpg)
返り値
• 関数で処理されたデータを呼び出し元に返す • 返り値がない場合もある(副作用のみの関数)
Python 入門 121
length = len([1,2,3,4,5])
len([1,2,3,4,5]) length
5 返り値
![Page 122: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/122.jpg)
関数の実装
Python 入門 122
![Page 123: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/123.jpg)
関数作成の書式1
• 引数、返り値なしの書式 • 返り値を明示しない場合は None が返る
Python 入門 123
def 関数名(): 処理
def printHello(): print("hello") printHello() => hello
![Page 124: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/124.jpg)
関数作成の書式2
• 引数、返り値あり • 引数は関数名の後の()に必要な数だけ指定 • 返り値は return で明示的に書く
Python 入門 124
def 関数名(引数): 処理 return 返り値
def adder(a, b): return a + b print(adder(3,4)) => 7
![Page 125: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/125.jpg)
関数のサンプル def power(x): return x*x def absolute(x): if(x<0): return -‐x else: return x print(power(6)) -‐> 36 print(absolute(-‐5)) -‐> 5
Python 入門 125
![Page 126: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/126.jpg)
引数のデフォルト値 • 指定しない場合に設定される引数
Python 入門 126
def func(a, b=1) print(a) print(b) func(5,6) -‐> 5 6 func(5) -‐> 5 5
![Page 127: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/127.jpg)
global
• 関数内でグローバル変数にアクセスするための宣言
Python 入門 127
gv = 0 def func1(): gv = 1 def func2(): global gv gv = 2
print(gv) -‐> 0 func1() print(gv) -‐> 0 func2() print(gv) -‐> 2
![Page 128: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/128.jpg)
演習1
Python 入門 128
![Page 129: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/129.jpg)
演習
• day2-‐1.py.zip をダウンロードし解凍 • text = """〜""" として事前定義されている文字列の
単語出現数をカウントするプログラムを作成 • 「単語:出現数」というフォーマットで出力する • 文字列の分割: 文字列.split() -‐> [単語の配列]
Python 入門 129
dog:1 cat:2 ...
• 出現数が多い単語順にソートして表示する • ヒントは次ページ
発展編
![Page 130: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/130.jpg)
演習補足 • リストを使った簡易ソートアルゴリズム • sort関数を使っても実装可能だが、まだ教えてない
テクニックが必要
Python 入門 130
list1 = [3,6,2,9,0,1,5] list2 = [] while(0 != len(list1)): maxValue = max(list1) index = list1.index(maxValue) list2.append(maxValue) del list1[index] print(list2) -‐> [9, 6, 5, 3, 2, 1, 0]
![Page 131: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/131.jpg)
モジュール
Python 入門 131
![Page 132: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/132.jpg)
モジュールの必要性
• モジュール • ユーザ作成モジュール: 1つのpythonファイル
Python 入門 132
![Page 133: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/133.jpg)
モジュールへのアクセス
• 機能ごとによるプログラムの整理
Python 入門 133
math file system
os 自分が作成
組み込み (デフォルトで 使える)
![Page 134: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/134.jpg)
ユーザによるモジュールの作成
Python 入門 134
ファイル 200行 ファイル 50000行
• プログラムの開発によりコードが巨大に。
![Page 135: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/135.jpg)
モジュールの分割
• 巨大なファイルは「どこに何があるか」わかりにくい • 適切な粒度でファイルを分割する
Python 入門 135
010101010101010101010101010101010010101010101010101010101010101010010101010101010101010101010101010010101010101010101010101010101010010101010101010101010101010101010010101010101010101010101010101010010101010101010101010101010101010010101010
010101010101010101010101010101010010101010101
010101010101010101010101010101010010101010101
010101010101010101010101010101010010101010101
010101010101010101010101010101010010101010101
巨大なファイル 複数の小さなファイル
![Page 136: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/136.jpg)
モジュールの参照
Python 入門 136
010101010101010101010101010101010010101010101
010101010101010101010101010101010010101010101
010101010101010101010101010101010010101010101
010101010101010101010101010101010010101010101
010101010101010101010101010101010010101010101010101010101010101
モジュールを使うプログラム 全体の流れを記述
モジュールを使うプログラム 全体の流れを記述
![Page 137: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/137.jpg)
import
• import することでモジュールが使える
Python 入門 137
import mymath print(mymath.add(2,3)) # -‐> 5 print(mymath.minus(2,3)) # -‐> -‐1 print(mymath.mulcply(2,3)) # -‐> 6 print(divide(2,3)) #ERROR HAPPEN Traceback (most recent call last): File "~/main.py", line 6, in <module> print(divide(2,3)) NameError: name 'divide' is not defined
def add(a,b): return a + b def minus(a, b): return a -‐ b def mulcply(a, b): return a * b def divide(a, b): return a / b
![Page 138: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/138.jpg)
from
• from ファイル名(パッケージ名) import * でファイル名の指定なしに呼び出しが可能になる
Python 入門 138
def add(a,b): return a + b def minus(a, b): return a -‐ b def mulcply(a, b): return a * b def divide(a, b): return a / b
from mymath import * print(add(2,3)) # -‐> 5 print(minus(2,3)) # -‐> -‐1 print(mulcply(2,3)) # -‐> 6 print(mymath.divide(2,3)) # ERROR HAPPEN Traceback (most recent call last): File "~/main.py", line 6, in <module> print(divide(2,3)) NameError: name 'mymath' is not defined
![Page 139: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/139.jpg)
(補足) 循環参照
• ファイルAとBが互いに参照しあっている • 望ましくなく、エラーになる場合がある
Python 入門 139
import file2 print("file1")
import file1 print("file2")
file1.py
$ python file1.py file1 file2 file1
file2.py なんで2回?
![Page 140: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/140.jpg)
文字列
Python 入門 140
![Page 141: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/141.jpg)
文字列の処理1
• 文字列の作成: str1="文字列", str2=' 文字列' • 文字列の結合: 文字列 + 文字列 • エスケープ記号: \ に続けて特定の文字 • 長さの取得: len(文字列)
Python 入門 141
![Page 142: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/142.jpg)
サンプル:文字列の処理1 # 文字列の作成 >>> str1 = "hello" >>> str2 = ' world' # 結合 >>> print(str1 + str2) hello world # エスケープ >>> print(str1 + "\t" + str2 + "\ncisco") hello world cisco # 長さの取得 >>> len(str1) 5
Python 入門 142
![Page 143: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/143.jpg)
文字列の処理2
• 繰り返し: 文字列 * 繰り返し回数 • 文字列化: str(文字列以外のオブジェクト) • 文字列の一文字を取得 文字列[index] • 文字列の範囲取得: 文字列[start:end]
Python 入門 143
![Page 144: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/144.jpg)
サンプル:文字列の処理2 # 繰り返し >>> print("cisco" * 3) ciscociscocisco # 文字列化 >>> print("value: " + str(5)) # 非文字列を文字列化してから結合 value: 5 # 文字列の一文字を取得 >>> "hello world"[4] 'o' # 文字列の一部を取得 >>> "hello world"[4:8] 'o wo'
Python 入門 144
![Page 145: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/145.jpg)
文字列の処理3
• 置き換え: 文字列.replace(old, new) • 分割: 文字列.split("区切り文字") • 含むか: "探す文字列" in "探される文字列" • 位置: 文字列.find("探す文字")
Python 入門 145
![Page 146: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/146.jpg)
サンプル:文字列の処理3 # 置き換え >>> "hello world".replace("world", "python") 'hello python' # 分割 >>> "hello world".split(" ") ['hello', 'world'] # 含むか >>> "hell" in "hello world" True # 位置 >>> "hello world".find("o") 4 >>> "hello world".find("X") -‐1 # 指定した文字列が含まれていない場合は -‐1
Python 入門 146
![Page 147: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/147.jpg)
正規表現
Python 入門 147
![Page 148: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/148.jpg)
正規表現とは
• 文字列"パターン"の定義 • 柔軟に文字列のパターンマッチングを行うこ
とができる – パターンマッチングに該当するか – 該当する文字列の取得
Python 入門 148
![Page 149: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/149.jpg)
正規表現の有効性 • 文字列が整数かどうか判定するためのプロ
グラムを作成する • 正規表現の有無でコード量が大幅に違う
Python 入門 149
def isIntegerString(string): numberList = ['1','2','3','4','5','6','7','8','9','0'] if len(string) == 0: return false for char in string: if char not in numberList: return False return True
import re def isIntegerString2(string): return re.match('^[\d]*$', string) != None
正規表現なし
正規表現あり
![Page 150: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/150.jpg)
python の正規表現作法
• re: 正規表現のパッケージ import re
• match : 合致する文字列群を抜き出す re.match(パターン文字列, 文字列)
• search: 合致する文字列の位置を返す re.search(パターン文字列、文字列)
Python 入門 150
![Page 151: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/151.jpg)
正規表現
Python 入門 151
>>> m = re.match("^[\d]*$", "12345") >>> print(m) <_sre.SRE_Match object at 0x1005bdbf8> >>> m.group() '12345' >>> m.start(), m.end() (0, 5)
![Page 152: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/152.jpg)
ファイル処理
Python 入門 152
![Page 153: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/153.jpg)
ファイル処理の流れ
• ファイル処理の流れ 1. fileをオープンして fileオブジェクトを取得 2. fileオブジェクトに対して処理を行う 3. fileをクローズする
Python 入門 153
![Page 154: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/154.jpg)
ファイルオブジェクト
• ファイルオブジェクトの作成 open(ファイルパス, オープンするモード)
– ファイルパス: 相対 or 絶対 – モード(デフォルトは"r") – r: 読み込みモード – w: 新規書き込みモード – a: 追加書き込みモード
• ファイルオブジェクトのクローズ f.close()
Python 入門 154
![Page 155: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/155.jpg)
読み込み処理
• Read – readline(): 一行読み込み – readlines(): 全ての行を list として読み込み
Python 入門 155
>>> f = open("file.txt", "r") >>> f.readline() 'hello world1\n' >>> f.readline() 'hello world2\n' >>> f.readlines() ['hello world3\n', 'hello world4\n']
hello world1 hello world2 hello world3 hello world4
file.txt
![Page 156: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/156.jpg)
書き込み処理 • Write – write(文字列) : 文字列を書き込み – writelines(文字列のリスト) : リストを書き込み – flush() : バッファをディスクにフラッシュ
Python 入門 156
>>> f2 = open("file2.txt", "w") >>> f2.write("hello") >>> f2.write("world") >>> f2.write("\n") >>> wlist = ["abc", "def", "ghi"] >>> f2.writelines(wlist) >>> f2.flush() >>> f2.close()
helloworld abcdefghi
file2.txt
![Page 157: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/157.jpg)
上書きと追記
• 上書き: ファイルの内容を消してから書き込む • 追記: ファイルの末尾に追加で書き込む
Python 入門 157
![Page 158: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/158.jpg)
PICKEL
Python 入門 158
![Page 159: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/159.jpg)
Pickel • プログラムの実行状態はプログラムを停止すると消失 • Pickel はオブジェクトをファイルに永続的に保存する手法
• Pickel – dump: オブジェクトをファイルに書き出し – load: ファイルからオブジェクトを読み出し
Python 入門 159
![Page 160: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/160.jpg)
Pickel
Python 入門 160
yuichi$ python >>> data = ["hello", "world", 1, 2, 3] >>> import pickle >>> f = open("dump.txt", "w") >>> pickle.dump(data, f) >>> f.close() >>> exit()
(lp0 S'hello' p1 aS'world' p2 aI1 aI2 aI3 a.
$ python >>> f = open("dump.txt") >>> import pickle >>> data = pickle.load(f) >>> print(data) ['hello', 'world', 1, 2, 3]
dump.txt
![Page 161: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/161.jpg)
PATH
Python 入門 161
![Page 162: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/162.jpg)
パス
• OS上のファイルやディレクトリの所在地を示す
Python 入門 162
/Users/yuichi/Documents/python.pptx
/ Users/ yuichi/ Documents/ python.pptx
etc/
var/
Shared/ Desktop/
Pictures/
java.pptx
VM/
![Page 163: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/163.jpg)
絶対パスと相対パス • 絶対パス: ルートから辿るパス • 相対パス: 現在の自分の位置から辿るパス – ./ : 自分がいるディレクトリ – ../ : 自分の上の階層のディレクトリ
Python 入門 163
/ Users/ yuichi/ Documents/ python.pptx
etc/
var/
Shared/ Desktop/
test.txt
java.pptx
VM/
/Users/yuichi/test.txt
../test.txt
![Page 164: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/164.jpg)
パスの取得 • 現在のカレントディレクトリを取得: os.getcwd() • ディレクトリの移動: os.chdir(移動先のパス) • 絶対パスの取得: os.path.abspath(path) • OS非依存のパスの取得方法 os.path.join(TUPLE)
Python 入門 164
yuichi$ ls | grep Documents Documents yuichi$ python >>> import os >>> os.getcwd() '/Users/yuichi' >>> os.path.abspath("Documents") '/Users/yuichi/Documents' >>> os.path.join("/","dir1","dir2","file1") '/dir1/dir2/file1'
![Page 165: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/165.jpg)
パスに関する関数
• ファイル or ディレクトリの存在確認: os.path.exists(パス) • ディレクトリか: os.path.isdir(パス) • ファイルか: os.path.isfile(パス)
Python 入門 165
![Page 166: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/166.jpg)
パスの操作関数
Python 入門 166
>>> os.path.exists("/Users/yuichi") True >>> os.path.isfile("/Users/yuichi") False >>> os.listdir("./") ['dir1', 'file1'] >>> os.mkdir("dir2") >>> os.rmdir("dir2") >>>
![Page 167: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/167.jpg)
ディレクトリの操作関数
• ディレクトリの作成: os.mkdir(ディレクトリのパス) • ディレクトリの削除: os.rmdir(ディレクトリのパス) • ディレクトリの中身一覧: os.listdir(パス) • ファイル、ディレクトリの削除: os.remove(パス) • ディレクトリの再帰的削除: os.removedirs(パス)
Python 入門 167
![Page 168: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/168.jpg)
PYTHON AS シェルスクリプト
Python 入門 168
![Page 169: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/169.jpg)
シェルスクリプト
• プログラミング: C や Java のようなシェルを意識しないスタイル
• シェルスクリプト: シェル自体を操作するプログラミングスタイル
Python 入門 169
import os currentDir = os.getcwd() files = os.listdir(currentDir) for fname in files: print(fname)
import commands files = commands.getoutput("ls").split() for fname in files: print(fname)
通常のプログラミングスタイル シェルスクリプトのスタイル
![Page 170: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/170.jpg)
シェルスクリプト記述のコツ
• 可能な限り既存のコマンドを使う • コマンドとコマンドの接続に python を使う
Python 入門 170
(1) 結果 = コマンドの発行 (2) 結果を処理 (3) 処理結果にもとづいて次のコマンドを作成 (4) (1)へ
![Page 171: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/171.jpg)
コマンドの呼び出し
Python 入門 171
• os.system("コマンド") : 出力が不要な場合 • commands.getoutput("コマンド") : 出力が必要な場合
>>> commands.getoutput("ls").split("\n") ['CONFIG_FILE', 'Cisco Mac Support.webloc', 'Desktop', 'Documents', 'Downloads', 'Dropbox', 'Library', 'MATERIAL', 'Movies', 'Music', 'Pictures', 'Public', 'SR', 'STP-‐BA-‐Dispute_Japan-‐RSVT.pptx', 'VM', 'appProperces', 'bingo.py', 'bingo.pyc', 'dump.txt', 'file.txt', 'file2.txt', 'get-‐fpath-‐info.py', 'mki-‐fp-‐capture.zip', 'tcpdump', 'tcpdump.zip', 'test', 'unctled folder']
![Page 172: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/172.jpg)
command.getoutput()
Python 入門 172
import commands result = commands.getoutput("ping -‐c 5 cisco.com") lines = result.split("\n") for line in lines: print(line)
PING cisco.com (72.163.4.161): 56 data bytes 64 bytes from 72.163.4.161: icmp_seq=0 7l=239 cme=195.865 ms 64 bytes from 72.163.4.161: icmp_seq=1 7l=239 cme=200.497 ms 64 bytes from 72.163.4.161: icmp_seq=2 7l=239 cme=197.125 ms 64 bytes from 72.163.4.161: icmp_seq=3 7l=239 cme=197.620 ms 64 bytes from 72.163.4.161: icmp_seq=4 7l=239 cme=197.553 ms -‐-‐-‐ cisco.com ping stacsccs -‐-‐-‐ 5 packets transmi7ed, 5 packets received, 0.0% packet loss round-‐trip min/avg/max/stddev = 195.865/197.732/200.497/1.519 ms
![Page 173: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/173.jpg)
exping の実装 • 複数の宛先のping到達率を測定
Python 入門 173
import commands def ping(dest): result = commands.getoutput("ping -‐c 5 {}".format(dest)) lines = result.split("\n") length = len(lines) packetLoss = lines[length -‐2].split()[6] r7 = lines[length -‐1].split()[3].split("/")[1] return (dest, packetLoss, r7) dests = ["cisco.com", "google.com", "yahoo.com"] for dest in dests: print(ping(dest))
('cisco.com', '0.0%', '196.756') ('google.com', '0.0%', '13.317') ('yahoo.com', '0.0%', '262.060')
![Page 174: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/174.jpg)
Linuxホスト上でのping • 特定IPアドレスのホスト間のみ通信できない • 事象発生確立は 1/16 程度
Python 入門 174
Nexus2000 FEX L2 Switch
Source Dest
Nexus5500 Primary
Nexus5500 Secondary
VPC(VSS)
ホスト50台 ホスト50台
50 x 50 -‐> 2500 flow
VLAN X VLAN Y
![Page 175: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/175.jpg)
ping 到達率の測定プログラム
Python 入門 175
![Page 176: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/176.jpg)
演習
Python 入門 176
![Page 177: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/177.jpg)
演習
• 未完成のログ抽出プログラムを完成させる • バグは3箇所にある
Python 入門 177
yuichi$ python log.py -‐f log.log -‐s "2014 Jan 28 12:30:50" -‐e "2014 Jan 29 16:06:15" -‐k "port-‐channel" -‐f : ファイル名 -‐s : スタート時刻 -‐e : 終了時刻 -‐k : キーワード
dhcp-‐10-‐141-‐56-‐250:Documents yuichi$ python log.py -‐f log.log -‐s "2014 Jan 28 12:30:50" -‐e "2014 Jan 29 16:06:15" -‐k "port-‐channel" 2014 Jan 29 12:14:20 N6K-‐2 %ISIS_FABRICPATH-‐5-‐ADJCHANGE: isis_fabricpath-‐default [5150] P2P adj L1 n7kb-‐MKI-‐FP over port-‐channel50 -‐ DOWN (New) on MT-‐0 2014 Jan 29 12:14:20 N6K-‐2 %ISIS_FABRICPATH-‐5-‐ADJCHANGE: isis_fabricpath-‐default [5150] P2P adj L1 n7kb-‐MKI-‐FP over port-‐channel50 -‐ INIT on MT-‐0 2014 Jan 29 12:14:20 N6K-‐2 %ISIS_FABRICPATH-‐5-‐ADJCHANGE: isis_fabricpath-‐default [5150] P2P adj L1 n7kb-‐MKI-‐FP over port-‐channel50 -‐ UP on MT-‐0 2014 Jan 29 12:24:58 N6K-‐2 %ISIS_FABRICPATH-‐5-‐ADJCHANGE: isis_fabricpath-‐default [5150] P2P adj L1 n7kb-‐MKI-‐FP over port-‐channel50 -‐ DOWN (Delete All) on MT-‐0 2014 Jan 29 12:27:01 N6K-‐2 %ISIS_FABRICPATH-‐5-‐ADJCHANGE: isis_fabricpath-‐default [5150] P2P adj L1 n7kb-‐MKI-‐FP over port-‐channel50 -‐ DOWN (New) on MT-‐0 2014 Jan 29 12:27:01 N6K-‐2 %ISIS_FABRICPATH-‐5-‐ADJCHANGE: isis_fabricpath-‐default [5150] P2P adj L1 n7kb-‐MKI-‐FP over port-‐channel50 -‐ INIT on MT-‐0 2014 Jan 29 12:27:01 N6K-‐2 %ISIS_FABRICPATH-‐5-‐ADJCHANGE: isis_fabricpath-‐default [5150] P2P adj L1 n7kb-‐MKI-‐FP over port-‐channel50 -‐ UP on MT-‐0
![Page 178: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/178.jpg)
コード(バグは2箇所)
Python 入門 178
import sys, os def getTimeString(line): return line[0:20] def parseTime(string): monthDict = {"Jan":1, "Feb":2, "Mar":3, "Apr":4, "May":5, "Jun":6, "Jul":7, "Aug":8, "Sep":9, "Oct":10, "Nov":11, "Dec":12} d1 = string.split(" ") d2 = d1[3].split(":") return (int(d1[0]), monthDict[d1[1]], int(d1[2]), int(d2[0]), int(d2[1]), int(d2[2])) def printFile(fname, start, end, keyword): if(not os.path.isfile(fname)): print("File \"{}\" isn't exist. exit".format(fname)) sys.exit() f = open(fname) for line in f.readlines(): line = line.rstrip() t = parseTime(getTimeString(line)) within = (start <= t) and (t <= end) contains = keyword in line if(within and contains): print(line)
fname = "" start = "1900 Jan 1 00:00:00" end = "2100 Jan 1 00:00:00" keyword = "" for index in range(len(sys.argv)): arg = sys.argv[index] if(arg == "-‐f"): fname = sys.argv[index + 1] elif(arg == "-‐s"): start = sys.argv[index + 1] elif(arg == "-‐k"): keyword = sys.argv[index + 1] if(fname == ""): s1 = "syntax: python log.py -‐f FILENAME -‐s " s2 = "START_TIME -‐e END_TIME -‐k KEYWORD" print(s1 + s2) print("START_TIME, END_TIME, KEYWORD are opcon.") else: printFile(fname, start, end, keyword)
ログの一行から時間の文字列を抽出
抽出した文字列を比較可能なタプルに変換
条件にマッチした行をprint出力
コマンド引数を読み取る
コマンド引数の初期値
ファイル名が与えられていたらプログラムを実行
![Page 179: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/179.jpg)
演習
Python 入門 179
発展編
キーワードを正規表現で指定できるようにする 正規表現にマッチした場合のみ表示を行う オプション -‐r に続けて正規表現を指定
![Page 180: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/180.jpg)
演習 • ラボのLinux(10.71.224.172)にログイン(guest, c1sco123)し、以下のスクリプトを作成し実行する
• ファイル名は <cecid>.py とする
Python 入門 180
以下の機器の開いているポート一覧を取得する -‐ rws1 (1.0.0.1) -‐ gateway (1.0.0.100) -‐ linux( 1.110.120.173) -‐ esxi ( 10.71.224.170) -‐ Nexus7000 (1.110.8.1)
![Page 181: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/181.jpg)
利用するコマンド
Python 入門 181
yuichi$ ssh -‐l guest 10.71.224.172 pass: c1sco123 [guest@fedora172 ~]$ nmap 127.0.0.1 Starcng Nmap 6.01 ( h7p://nmap.org ) at 2014-‐02-‐08 13:05 EST Nmap scan report for fedora172.localdomain (127.0.0.1) Host is up (0.0016s latency). Not shown: 995 closed ports PORT STATE SERVICE 22/tcp open ssh 23/tcp open telnet 25/tcp open smtp 111/tcp open rpcbind 631/tcp open ipp
![Page 182: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/182.jpg)
表示形式
Python 入門 182
アドレス1 TCP: xxx, yyy, zzz, ... UDP: xxx, yyy, zzz, ... アドレス2 TCP: xxx, yyy, zzz, ... UDP: xxx, yyy, zzz, ... ... アドレス3 TCP: xxx, yyy, zzz, ... UDP: xxx, yyy, zzz, ...
![Page 183: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/183.jpg)
次回予告
• オブジェクト指向 • クラス • アルゴリズム • pexpect によるCisco機器のプログラム操作
Python 入門 183
![Page 184: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/184.jpg)
Python 入門 184
![Page 185: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/185.jpg)
Python 入門 Learning to Program
For Cisco Network Engineers Day 3/4
Japan TAC DC Team.
Yuichi Ito
![Page 186: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/186.jpg)
Agenda Day 3
• クラスの概念 • クラスの作成 • 演習 • ドラクエの実装で学ぶオブジェクト指向 • 演習1-‐3 • pexpect による Cisco 機器の操作法 • 演習
186 Python 入門
![Page 187: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/187.jpg)
プログラミング言語の流派
Python 入門 187
![Page 188: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/188.jpg)
プログラミングの流派
• 手続き型 • 関数型 • オブジェクト指向型
Python 入門 188
![Page 189: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/189.jpg)
オブジェクト指向の概念
Python 入門 189
![Page 190: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/190.jpg)
なぜオブジェクト指向が必要か
あえてコード記述作法にルールを課すことでプログラムのカオス化を防ぐ -‐ 実装の境界が明確になる
Python 入門 190
ルールにしたがって プログラムを整理
![Page 191: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/191.jpg)
なぜオブジェクト指向が必要か
オブジェクト指向の機能で開発効率を向上させる -‐ 継承による機能の引き継ぎ -‐ ポリモーフィズム
Python 入門 191
Bu7on
Hello World
ボタンを押したら hello world と 表示するプログラム 10数行で作れる(継承のおかげ)
![Page 192: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/192.jpg)
人間の思考方法 • 「誰が何をするか」が重要 • 誰にどういう「メッセージ」を送ったら、どういう「結
果」が得られるか
Python 入門 192
[内部処理] 仕事をする
[メッセージ] この仕事をしてください
[結果] 成果物はこれです。 上司 部下
![Page 193: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/193.jpg)
関数 vs メソッド
Python 入門 193
関数チックな考え方
オブジェクト指向の考え方
「仕事をさせる」(部下A、仕事)
「部下A」に「仕事をさせる」(仕事)
![Page 194: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/194.jpg)
関数 vs メソッド • 関数: オブジェクトを「引数として」使う • メソッド: オブジェクト「から」処理を呼び出す
Python 入門 194
>>> string = "hello world python" # 関数 >>> length = len(string) # メソッド >>> words = string.split()
文字列の処理
![Page 195: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/195.jpg)
関数 vs メソッド
• 関数: データと処理の結びつきが弱い • メソッド: データと処理の結びつきが強い
Python 入門 195
len( ) string.split() 処理にデータを与える データに処理をさせる
関数 メソッド
len は何にでも使える split は string にしか使えない
![Page 196: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/196.jpg)
オブジェクト指向
• 誰(インスタンス)にメッセージを送る(メソッドを呼び出す)とどういう結果(返り値)が得られるか
• 細かい内部の仕組みは気にしない
Python 入門 196
返り値 = 誰.メソッド(パラメータ) 記述ルール
![Page 197: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/197.jpg)
• 内部の細かい挙動は考えず状態のみを意識する
データをHDDに書き込みたい (1) Block N に書き込み
書き込み処理 (1)Block N のDisk を選択 (2)Block N のセクタを指定 (3)書き込みを行なう
ストレージオブジェクト (専門家がプログラムを作成) ユーザアプリケーションの
オブジェクト (ストレージを使うだけ)
処理、情報の隠蔽
※ 現在のヘッド位置などは気にしない
![Page 198: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/198.jpg)
まとめ
• オブジェクト指向のコンセプト – 「誰が何をするか」 – 「誰が誰とどう協力するか」 – 「複雑な処理、データは外部に見せない」
• コードの秩序化 – 権限を持たないものは操作ができない
Python 入門 198
![Page 199: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/199.jpg)
クラスの概念
Python 入門 199
![Page 200: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/200.jpg)
クラス
• オブジェクトの種類 • クラスは属性としてデータと処理を持つ
Python 入門 200
属性 [データ] -‐ ガソリンの量 [処理] -‐ 走る -‐ 止まる -‐ 曲がる
![Page 201: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/201.jpg)
インスタンス • クラス自体で処理するのではなく、クラスから作るイ
ンスタンスで処理をする • 部下という概念(クラス)ではなく部下の◯◯(インスタ
ンス)が仕事をする
Python 入門 201
[内部処理] 仕事をする
[メッセージ] この仕事をしてください
[結果] 成果物はこれです。 クラス: 上司
インスタンス: BOB クラス: 部下
インスタンス: TOM
![Page 202: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/202.jpg)
クラスとインスタンスの関係 • クラス: インスタンスを作るための雛形 • インスタンス: クラスから作られるオブジェクト • 型(クラス) とその値(インスタンス)という理解でOK
Python 入門 202
クラス インスタンス インスタンス化
型(Class) String 値(Instance) "Hello Python", "Hello Cisco"
![Page 203: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/203.jpg)
コンポジション
• クラスは別のクラス(インスタンス)を持つことがある
Python 入門 203
クラス車は -‐ エンジンクラスを1インスタンス -‐ タイヤクラスを4インスタンス -‐ ハンドルクラスを1インスタンス 持っている
![Page 204: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/204.jpg)
クラスの作成
Python 入門 204
![Page 205: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/205.jpg)
クラスの宣言 • 以下の要件を満たすクラスを作る
Python 入門 205
string: 保持する文字列
set_string: stringをセット
get_string: stringを取得
double: stringを繰り返す
クラス: MyClass
属性: インスタンス変数
属性: メソッド
データとして文字列を内部に持つ その文字列を設定するメソッド その文字列を取得するメソッド 文字列を「文字列+文字列」にするメソッド
![Page 206: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/206.jpg)
クラスの宣言 • クラスの宣言は class クラス名: • メソッドの宣言: 第一引数が self として定義 • 属性へのアクセスは self.属性 とする
Python 入門 206
class MyClass: string = "" def set_string(self, string): self.string = string def get_string(self): return self.string def double(self): self.string *= 2
class の宣言
メソッドの宣言 第一引数を self とするのは python のルール
class が保持するデータの宣言
属性へのアクセス self.属性 とする (そうしないと関数だけのローカル変数となる)
![Page 207: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/207.jpg)
インスタンスの利用
• クラス名() でインスタンス化 • メソッドを呼び出す際は第一引数(self)は指定しない
Python 入門 207
class MyClass: string = "" def set_string(self, string): self.string = string def get_string(self): return self.string def double(self): self.string *= 2
# インスタンス化 >>> mc = MyClass() # メソッド呼び出し >>> mc.set_string("hello ") >>> print(mc.get_string()) hello >>> mc.double() >>> print(mc.get_string()) hello hello
![Page 208: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/208.jpg)
演習
• class Counter を作成 • 内部にカウンタを持つ。初期値は1 • get_value メソッドで現在のカウンタ値を返す • count_up メソッドで現在のカウンタ値を +1 する • clear_counter メソッドでカウンタを1に戻す
Python 入門 208
![Page 209: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/209.jpg)
コンストラクタの利用 • コンストラクタ: インスタンス作成時に呼び出されるメソッド • コンストラクタの引数はインスタンス作成時に指定
Python 入門 209
class MyClass: string = "" def __init__(self, string): print("__init__ is called") self.string = string def set_string(self, string): self.string = string def get_string(self): return self.string def double(self): self.string *= 2
# インスタンス化 >>> mc = MyClass("python ") __init__ is called # メソッド呼び出し >>> print(mc.get_string()) python >>>
![Page 210: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/210.jpg)
演習
• class Counter を改良 • 内部にカウンタを持つ。初期値はコンストラクタで指定 • clear_counter メソッドでカウンタを初期値に戻す
Python 入門 210
![Page 211: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/211.jpg)
補足)動的なメンバ変数
• 動的にメンバ要素を追加できる • Javaとは異なるので要注意!!
Python 入門 211
class MyClass: def func(self): print("func")
>>> mc = MyClass() >>> mc.a = "Hello World" >>> mc.a 'Hello World'
定義されていない メンバ変数 a に代入
メンバ変数 a は 定義されていない
![Page 212: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/212.jpg)
クラスサンプル
Python 入門 212
# bingo.py import random class BingoMachine: ballList = [] def __init__(self, min, max): self.ballList = range(min, max + 1) def getBall(self): if(len(self.ballList) == 0): return -‐1 index = int(random.uniform(0, len(self.ballList))) return self.ballList.pop(index)
# 実行結果 >>> from bingo import * >>> b = BingoMachine(1,5) >>> b.getBall() 1 >>> b.getBall() 5 >>> b.getBall() 2 >>> b.getBall() 3 >>> b.getBall() 4 >>> b.getBall() -‐1
ビンゴマシーン 数字 n – m の間の数字をランダムに返す 一度返した値は返さない
![Page 213: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/213.jpg)
クラスまとめ1
• メソッドの第一引数は自分自身のオブジェクト • メンバ変数やメソッドを呼ぶにはこのオブジェクトの指定が必要
Python 入門 213
class MyClass: var = 0 def method1(self): self.var = 1 print("method1") def method2(self): print(self.var) self.method1() print("method2")
メソッド定義の第一引数が self になっている
メソッド呼び出しは定義の第一引数は飛ばす
メンバ変数やメソッドを self.名前 として 呼び出している
![Page 214: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/214.jpg)
クラスまとめ2
Python 入門 214
class MyClass2: var = 0 def __init__(self, var): self.var = var def method(self, var): print(str(self.var) + " " + str(var)) print("method") m2 = MyClass2(5) m2.method(8) -‐-‐> 5 8 method
• インスタンス化: クラス名(コンストラクタに渡す引数) • コンストラクタ: __init__ というメソッド名
![Page 215: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/215.jpg)
ドラクエで理解するオブジェクト指向
Python 入門 215
![Page 216: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/216.jpg)
演習の目的
Python 入門 216
• 大きなプログラムの作成方法を学ぶ – 複数のクラスの連携 – どのようにしてコードを広げていくか – 題材はドラクエ1
![Page 217: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/217.jpg)
ドラゴンクエスト
Python 入門 217
主人公
全てを作るのは無理なので Map のみ実装する
町人
前後左右に動く ただし、マップの外には出ない 町人に話しかける
主人公に応答する
![Page 218: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/218.jpg)
AA版ドラゴンクエスト(完成図)
Python 入門 218
a:Left, s:Right, w:Up, x:Down d:Talk, Ctrl-‐C:Exit +-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | B< | | | | M| | | | | | P | +-‐-‐-‐-‐-‐-‐-‐-‐+ ####################### Hello I'm Bukiya #######################
主人公
メッセージ欄
前後左右に動く ただし、マップの外には出ない 町人に話しかける 向いている向きでアイコンが変わる
主人公に応答する 町人
マップ
![Page 219: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/219.jpg)
作成プログラムの要素
Python 入門 219
町人(複数) 主人公 (イベント処理)
マップ(全体の管理)
入力
キー入力管理クラス (実装済み)
![Page 220: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/220.jpg)
クラス町人
Python 入門 220
クラス: 町人 メンバ変数 x座標 y座標 外見の種類 セリフ メソッド: respond: 主人公に応答する
外見 B: 武器屋 M: 商人 P: 神父
![Page 221: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/221.jpg)
クラス町人のインスタンス
Python 入門 221
インスタンス 町人A メンバ変数 x: 8 y: 4 外見: 男A セリフ: "こんにちは" メソッド: respond: 主人公に応答する
インスタンス 町人B メンバ変数 x: 4 y: 2 外見: 魔法使い セリフ: "いい天気じゃのう" メソッド: respond: 主人公に応答する
![Page 222: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/222.jpg)
主人公
Python 入門 222
主人公のアイコン < : 左向き > : 右向き ^ : 上向き V : 下向き
クラス: 主人公 メンバ変数 x座標 y座標 向いている方向 セリフ メソッド: run: キー入力を待つ(標準入力の無限ループ) move: キー入力で上下左右に動く talk: 向いている方向の町人と話す
![Page 223: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/223.jpg)
マップ
Python 入門 223
クラス: Map メンバ変数 -‐ 主人公のインスタンス -‐ 町人たちのインスタンス -‐ マップ情報 メソッド: -‐ render: マップを書き出す -‐ 主人公と町人を管理するメソッド群
+-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | B< | | | | P | +-‐-‐-‐-‐-‐-‐-‐-‐+
外枠 主人公 町人(複数)
![Page 224: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/224.jpg)
クラスとクラスの相互関係
• 十字キーを操作すると勇者が動く • 地図はその情報を反映しなければならない
Python 入門 224
インスタンス 勇者
インスタンス Map
入力(keyInput)
自分のX,Y情報を アップデート
描画を依頼 画面出力
![Page 225: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/225.jpg)
マップ描画の全体の流れ
Python 入門 225
Class: Field 変数: hero 変数: peopleMap 変数: 地形情報 renderMap()
描画(render) 地形情報 + 勇者 + 町人達
Class: Hero move() talk() getXY() getImage() keyInputEvent()
Class: People respond() getImage()
入力(keyInput)
x,y座標や見た目 などの情報を取得
ディスプレイに出力
① ②
③ ④ +-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | B< | | | | P | +-‐-‐-‐-‐-‐-‐-‐-‐+
![Page 226: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/226.jpg)
演習1
Python 入門 226
![Page 227: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/227.jpg)
マップ
• 何もないマップを描画 • 縦と横の長さを指定可能 • 行(row)指向で描画する
227
+-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | | +-‐-‐-‐-‐-‐-‐-‐-‐+
4隅は 「+」 y座標0, 最大値は 「–」 x座標0, 最大値は 「|」 それ以外は空白
class DQMap: max_x = 0 max_y = 0 def __init__(self, max_xy): (self.max_x, self.max_y) = max_xy def render_map(self): map_string_list = [] for y in range(self.max_y): for x in range(self.max_x): if(y == 0 or y == self.max_y -‐ 1): if(x == 0 or x == self.max_x -‐ 1): map_string_list.append("+") else: map_string_list.append("-‐") else: if(x == 0 or x == self.max_x -‐ 1): map_string_list.append("|") else: map_string_list.append(" ") map_string_list.append("\n") map_string = "".join(map_string_list) print(map_string.rstrip())
![Page 228: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/228.jpg)
主人公 • キー入力で主人公のx,y座標と「向き」をアップデートする • Ctrl-‐C でプログラムを終了する
228
import getch, sys class Hero: x = 0 y = 0 direccon = "N" def __init__(self, x, y): self.x = x self.y = y self.direccon = "N" def run(self): gc = getch.Getch() while(True): keycode = ord(gc()) self.move(keycode) print("x:{}, y:{}, dir:{}".format(self.x, self.y, self.direccon)) if(keycode == 3): sys.exit()
def move(self, keycode): if(keycode == 97): #Le� self.x -‐= 1 self.direccon = "W" elif(keycode == 115): #Right self.x += 1 self.direccon = "E" elif(keycode == 119): #Up self.y -‐= 1 self.direccon = "N" elif(keycode == 122): #Down self.y += 1 self.direccon = "S" hero = Hero(10,10) hero.run()
![Page 229: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/229.jpg)
マップと主人公(課題) • マップの中に主人公を描画 • 向いている方向で主人公のアイコンを変える • マップの範囲外に主人公がアクセスしない • プログラムの起点は main.py
229
実装のヒント DQMap: -‐ DQMap が Hero のインスタンスを持つ -‐ 主人公と同じ x, y 座標の場合は主人公のアイコンを表示 (主人公のインスタンスからアイコンを取得) Hero: -‐ 新しい座標が Map 範囲内である場合だけ、x,y をアップデート (範囲外へのアクセスは x,y をアップデートしない) -‐ 表示する主人公のアイコンは主人公の向きで決まる (向きの応じたアイコンを返すメソッドを実装)
![Page 230: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/230.jpg)
演習2
Python 入門 230
![Page 231: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/231.jpg)
町人の実装
Python 入門 231
class People: icon = "" x = 0 y = 0 comment = "" def __init__(self, icon, x, y, comment): self.icon = icon self.x = x self.y = y self.comment = comment def get_icon(self): return self.icon def get_xy(self): return (self.x, self.y) def get_response(self): return self.comment
町人は -‐ アイコン(一文字) -‐ x,y -‐ セリフ をコンストラクタで設定 「ゲッターメソッド」を実装 ※ パラメータを取得するためのメソッド
![Page 232: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/232.jpg)
マップと町人の実装
Python 入門 232
class DQMap: ... people_map = {} def __init__(self, max_xy, hero_xy, people_paramList): .... for params in people_paramList: (icon, x, y, comment) = params self.people_map[(x,y)] = people.People(icon, x, y, comment)
def render_map(self, comment): map_string_list = [] (hx, hy) = self.hero.get_xy() for y in range(self.max_y): for x in range(self.max_x): if((x,y) == (hx, hy)): map_string_list.append(self.hero.get_icon()) elif(self.people_map.has_key((x, y))): p = self.people_map[(x, y)] map_string_list.append(p.get_icon())
コンストラクタで町人の 情報をリスト形式で指定
町人のインスタンスを作成 (x,y)をキーにし辞書で町人を管理
描画の際に、x, y に町人がいるか確認 もしいれば町人を描画する
![Page 233: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/233.jpg)
主人公と町人の実装(課題)
• 主人公が町人と被らないようにする
Python 入門 233
Hint 次に動こうとする先に町人がいるか確認 いる場合は主人公の x, y をアップデートしない
![Page 234: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/234.jpg)
演習3
Python 入門 234
![Page 235: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/235.jpg)
会話機能の実装
• 主人公が向いている方向に町人がいるか確認 • 町人がいれば町人のレスポンスを取得し表示 • いなければ誰もいない旨のメッセージを表示 • DQMapのメソッドrender_mapにコメントを渡して描画(実装済)
Python 入門 235
+-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | B | | | | >M| | | | | | P | +-‐-‐-‐-‐-‐-‐-‐-‐+ ####################### Hello I'm Merchant #######################
+-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | B | | ^ | | M| | | | | | P | +-‐-‐-‐-‐-‐-‐-‐-‐+ ####################### No one exists on that way #######################
![Page 236: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/236.jpg)
その他
Python 入門 236
![Page 237: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/237.jpg)
__name__
• __name__ • __name__ が "__main__" のときは起点
Python 入門 237
import uclity def func(): print("func on main.py") print("global on main.py") func() uclity.func() if __name__ == "__main__": print("__name__ is __main__ on main.py")
def func(): print("func() on uclity.py") print("global on uclity.py") func() if __name__ == "__main__": print("__name__ is __main__ on uclity.py")
main.py
uclity.py
![Page 238: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/238.jpg)
__name__
Python 入門 238
def func(): print("func() on uclity.py") print("global on uclity.py") func() if __name__ == "__main__": print("__name__ is __main__ on uclity.py")
# python uclity.py global on uclity.py func() on uclity.py __name__ is __main__ on uclity.py
True
実行結果
![Page 239: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/239.jpg)
__name__
Python 入門 239
import uclity def func(): print("func on main.py") print("global on main.py") func() uclity.func() if __name__ == "__main__": print("__name__ is __main__ on main.py")
def func(): print("func() on uclity.py") print("global on uclity.py") func() if __name__ == "__main__": print("__name__ is __main__ on uclity.py")
main.py
uclity.py True
False
#python main.py global on uclity.py func() on uclity.py global on main.py func on main.py func() on uclity.py __name__ is __main__ on main.py
実行結果
![Page 240: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/240.jpg)
コピーと参照
• コピー: 異なるオブジェクト • 参照: 同一オブジェクトを複数箇所で利用 • 参照に対しては副作用の注意が必要
Python 入門 240
>>> a = [1,2,3,4] >>> b = a >>> b.append(5) >>> a [1, 2, 3, 4, 5]
![Page 241: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/241.jpg)
PEXPECT
Python 入門 241
![Page 242: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/242.jpg)
Pexpect
• EXPECT を Python で使うためのパッケージ • Ciscoの機器やLinuxといったCLI操作を必要とする機器を
プログラミングで規定通りに動かすために利用
Python 入門 242
Python Script
![Page 243: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/243.jpg)
Expect
• LinuxなどのインタラクティブなCLIを制御するためのプログラム
• pexpect の元になったプログラム • Teraterm Macro に似ている
Python 入門 243
The Expect Home Page
h7p://expect.sourceforge.net/
Expect Script
![Page 244: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/244.jpg)
Expect の動作
• spawn: セッションを開始 • expect: 期待する標準入力(from リモート)を待つ • send: リモートに出力を送る
Python 入門 244
dhcp-‐10-‐141-‐56-‐250:~ yuichi$ telnet -‐l yuiito rws1 Trying 10.71.231.245... Connected to rws1.cisco.com. Escape character is '^]'. Password: cisco123 Last login: Thu Jan 23 14:53:37 from dhcp-‐10-‐141-‐56-‐250.cisco.com unknown terminal "xterm-‐256color" unknown terminal "xterm-‐256color" [yuiito@rws1 yuiito]$ echo hello > test [yuiito@rws1 yuiito]$ ls snmpget.sh test
青がリモートからの標準入力 赤がリモートへの標準出力
![Page 245: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/245.jpg)
expect サンプル
• Linux へのログインと操作
Python 入門 245
Password:
cisco123
yuiito$
echo hello > test
#! /usr/bin/expect spawn telnet -‐l yuiito rws1 expect "Password:" send "cisco123\n" expect "yuiito\]\\\$" send "touch hello\n" interact
yuichi$ expect login-‐to-‐rws1.exp
login-‐to-‐rws1.exp
呼び出し
![Page 246: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/246.jpg)
Pexpect
• pip を使ってインストール • コード pexpect.py 同一フォルダに配置(利用) • import pexpect
Python 入門 246
![Page 247: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/247.jpg)
Pexpect の作法
• spawn session = pexpect.spawn("telnet等のコマンド")
• expect session.expect("入力されるのを待つ文字列")
• sendline session.sendline("送信する文字列。自動で改行コードがつく")
Python 入門 247
![Page 248: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/248.jpg)
pexpect
• マッチした文字列当を抽出
Python 入門 248
session.a�er: マッチした文字列 session.before: マッチした文字列までの文字列 session.buffer:
![Page 249: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/249.jpg)
pexpect のサンプル
• rws1 にログインしてファイル pexpect を作成
Python 入門 249
import pexpect child = pexpect.spawn("telnet -‐l yuiito rws1") child.expect("Password:") child.sendline("cisco123") child.expect("yuiito\]\$") child.sendline("touch pexpect")
![Page 250: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/250.jpg)
pexpextのサンプル • Nexusの設定をファイル名を日時にしてFTPサーバに保存
Python 入門 250
import pexpect, datecme def getLines(string): lines = lines = [x.strip() for x in string.split("\n")] return filter(lambda x: x!= '', lines) def getHostName(exp): exp.sendline("show hostname") exp.expect("#") return getLines(exp.before)[1] def getToDay(): d = datecme.datecme.today() return "{}_{}_{}-‐{}_{}_{}".format(d.year, d.month, d.day, d.hour, d.minute, d.second) def makeFileName(exp): hostName = getHostName(exp) today = getToDay() return "{}-‐{}.conf".format(hostName, today)
def login(exp, password): exp.expect("Password:") exp.sendline(password) exp.expect("#") exp.sendline("terminal length 0") exp.expect("#") def saveFile(exp, saveFrom, saveTo, vrf, username, password): command = "copy {} {}".format(saveFrom, saveTo) exp.sendline(command) exp.expect("Enter vrf") exp.sendline(vrf) exp.expect("Enter username:") exp.sendline(username) exp.expect("Password:") exp.sendline(password) exp.expect("#") child = pexpect.spawn("telnet -‐l admin 10.71.156.229") login(child, "cisco") saveTo = "�p://10.71.224.115/yuiito/" + makeFileName(child) saveFile(child, "running-‐config", saveTo, "management", "anonymous", "") child.close() ファイル名やコマンドの生成が python 任せ
![Page 251: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/251.jpg)
pexpect
• showコマンドや設定変更はほぼ同じような手順で実装される
• 継承やクロージャを使うことで各処理を実装すれば簡単に機能を増やせる
Python 入門 251
![Page 252: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/252.jpg)
演習
• Nexusの現在のバージョンを取得するプログラムを作成する
Python 入門 252
Nexus ip: 1.110.8.1 user-‐name: admin pass: cisco
踏み台 ip: 10.71.224.172 user-‐name: guest pass: c1sco123
![Page 253: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/253.jpg)
Python 入門 253
![Page 254: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/254.jpg)
Python 入門 Learning to Program
For Cisco Network Engineers Day 4/4
Japan TAC DC Team.
Yuichi Ito
![Page 255: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/255.jpg)
Agenda Day4 • Pythonのプログラム配布手法 • Tkinter (GUI) • Tkinter で学ぶ継承 • 例外処理 • NETWORKプログラミング • Pexpect
Python 入門 255
![Page 256: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/256.jpg)
プログラム配布手法
Python 入門 256
![Page 257: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/257.jpg)
ソースコードの配布 • 長所: 配布が簡単 • 短所: ライブラリに依存。コードが丸見え
Python 入門 257
python ソースコード
python ソースコード
python ソースコード
開発者 利用者 利用者
![Page 258: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/258.jpg)
バイナリ化して実行環境ごと配布 • 長所: 利用者が使いやすい。 • 短所: 作成が難しい
Python 入門 258
python ソースコード
開発者 利用者(Windows) 利用者(Mac)
.exe .app
![Page 259: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/259.jpg)
関数(メソッド)の引数
Python 入門 259
![Page 260: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/260.jpg)
関数とパラメータ • 関数(メソッド)にはデフォルト値を使える • 呼び出し側で引数を好きな順序で指定可能
Python 入門 260
def func(a, b="python", c="cisco"): print("hello {} {} {}".format(a,b,c)) func("world", "PYTHON", "CISCO") # => "hello world PYTHON CISCO" func("world") # => "hello world python cisco" func(b="world", a="python") # => "hello python world cisco"
引数 b, c にはデフォルト値を指定
引数 a,b,c に全て任意の値を設定
引数 a のみ指定して呼び出し
任意の順序で引数を指定
![Page 261: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/261.jpg)
GUI TKINTER
Python 入門 261
![Page 262: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/262.jpg)
GUI の学習目的
• アプリケーションにGUI一般的 • 見た目に分かりやすいので中級者向き • 継承の概念などを理解するのに最適な題材
Python 入門 262
![Page 263: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/263.jpg)
Tkinter
• Python の標準的なGUIライブラリ • インストールなしに利用可能 • 他のGUIライブラリ(Qt, wxpython)と概念が似ている
Python 入門 263
![Page 264: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/264.jpg)
Hello Tkinter
Python 入門 264
import Tkinter as tk font=("Helevecca", 32, "bold") label = tk.Label(text="Hello Cisco", font=font, bg="red") label.pack() label.mainloop()
![Page 265: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/265.jpg)
Hello Tkinter
• GUI 作成の流れ – Widgetと呼ばれるパーツを初期化 – パーツを配置 – GUIアプリケーションを起動
Python 入門 265
Widget はGUIの部品。 ボタンやテキストボックスなどの全てのパーツはWidget
![Page 266: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/266.jpg)
Hello Tkinter の解説
Python 入門 266
import Tkinter as tk font=("Helevecca", 32, "bold") label = tk.Label(text="Hello Cisco", font=font, bg="red") label.pack() label.mainloop()
Tkinter というモジュールをインポート。呼び出し時は tk という別称を使う Widget の Label を作成する。引数として文字列とフォント、背景色を指定 pack() メソッドで配置 mainloop() メソッドを呼び出すことでアプリケーションを実行
![Page 267: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/267.jpg)
演習1 • ラベルに表示する文字列を Hello Python に変更 • フォントサイズを 44 にする • 背景色を blue にする
発展 • アンダーラインを付ける • 幅を50にする
Python 入門 267
An IntroducYon to Tkinter (Work in Progress) h7p://e�ot.org/tkinterbook/
![Page 268: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/268.jpg)
Frame • Widget を配置するための Widget • Frame in Frame も可能(複雑な構成を作れる)
Python 入門 268
Frame1
Frame2
Frame3
widget 1
widget 2
widget 3
widget 4
widget 5
widget 6
Frame1 | |-‐-‐ Frame 2 | | -‐-‐ Widget1 | | -‐-‐ Widget2 | | -‐-‐ Widget3 | | -‐-‐ Widget4 | | -‐-‐ Frame3 | -‐-‐ Widget5 | -‐-‐ Widget5
![Page 269: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/269.jpg)
Hello Frame
Python 入門 269
import Tkinter as tk frame = tk.Frame() font=("Helevecca", 32, "bold") label1 = tk.Label(frame, text="Hello Cisco", font=font, bg="red") label2 = tk.Label(frame, text="Hello Python", font=font, bg="blue") label1.pack() label2.pack() frame.pack() frame.mainloop()
![Page 270: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/270.jpg)
Hello Frame の解説 • Frame のインスタンスを作成 • Frame の子要素(中にある)は第一引数を Frame の
インスタンスにする • トップレベルの widget で mainloop() を呼び出す
Python 入門 270
import Tkinter as tk frame = tk.Frame() font=("Helevecca", 32, "bold") label1 = tk.Label(frame, text="Hello Cisco", font=font, bg="red") label2 = tk.Label(frame, text="Hello Python", font=font, bg="blue") label1.pack() label2.pack() frame.pack() frame.mainloop()
![Page 271: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/271.jpg)
演習 • 3つのラベルが表示されるように改造する • 3番目の背景色は green
Python 入門 271
• Hello Cisco, Hello World の横の空白を埋める • Hint: widgetの pack に fill=tk.X を指定
発展編
![Page 272: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/272.jpg)
Frame の縦横 • Frameが並ぶのはデフォルト縦方向 • 子要素の pack() メソッドの引数に方向を指定 • 横方向は side=LEFT を指定
272
import Tkinter as tk frame = tk.Frame() font=("Helevecca", 32, "bold") label1 = tk.Label(frame, text="Hello Cisco", font=font, bg="red") label2 = tk.Label(frame, text="Hello Python", font=font, bg="blue") label1.pack(side=tk.LEFT) label2.pack(side=tk.LEFT) frame.pack() frame.mainloop()
![Page 273: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/273.jpg)
演習
• Frame に Frame を入れて以下のウィンドウを作成する
Python 入門 273
![Page 274: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/274.jpg)
演習の解答例
Python 入門 274
import Tkinter as tk frame1 = tk.Frame() frame2 = tk.Frame() font=("Helevecca", 32, "bold") label1 = tk.Label(frame2, text="Hello Cisco", font=font, bg="red") label2 = tk.Label(frame2, text="Hello Python", font=font, bg="blue") label1.pack(side=tk.LEFT) label2.pack(side=tk.LEFT) label3 = tk.Label(frame1, text="Hello Wodld", font=font, bg="green") label3.pack() frame2.pack() label3.pack() frame1.pack() frame1.mainloop()
![Page 275: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/275.jpg)
継承の概念
Python 入門 275
![Page 276: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/276.jpg)
継承
Python 入門 276
• クラスが別のクラスの特性を引き継ぐための機能 • 元のクラスをスーパークラス(親クラス)と呼ぶ • 派生されたクラスをサブクラス(子クラス)と呼ぶ
親クラス(車)
子クラス(ジープ)
子クラス(スーパーカー)
![Page 277: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/277.jpg)
TKinter の継承 • Label や Bu7on は継承で作成されている • 継承元で根本の描画処理などを実装 • Label や Bu7on は差分のみ実装
Python 入門 277
Widget
Bu7on
Hello World 描画の仕組みの実装
ボタン特有の機能の実装
ラベル特有の機能の実装
![Page 278: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/278.jpg)
継承のメリット
• 子クラスの実装を単純化できる • クラス自体もそれを使う側もコードの保守性が増す
Python 入門 278
Label も Bu7on も Frame の 子要素となることができる
Label と Bu7on のスーパークラスが Frame の子要素となることができる
![Page 279: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/279.jpg)
Tkinter の自作クラス
• 継承してクラスを作ると、Frameにいれることができるパーツが作れる
Python 入門 279
Frame Frame
継承していない場合 Frame にいれられない
継承している場合 Frame にいれられる
![Page 280: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/280.jpg)
継承されたクラスの特徴
• 親クラスのメンバ変数にアクセス可能 • 親クラスのメソッドにアクセス可能 • 子クラスのコンストラクタ内で親クラスのコン
ストラクタを呼び出す
Python 入門 280
親クラス 子クラス 継承のイメージ
![Page 281: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/281.jpg)
継承クラスの作成
Python 入門 281
![Page 282: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/282.jpg)
クラス継承の作法 クラスの宣言 class 子クラス(親クラス): 子クラスのコンストラクタで親クラスのコンストラクタを呼び出す 親クラスのコンストラクタの引数は全て指定。 子クラスは親クラスの変数とメソッドにアクセス可能 (上書きも可能)
Python 入門 282
class Parent: text = "" def __init__(self, text): print("Parent.__init__()") self.text = text def get_text(self): return self.text class Child(Parent): def __init__(self, text): print("Child.__init__()") Parent.__init__(self, text) def double(self): self.text *= 2
![Page 283: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/283.jpg)
演習 • クラス Counter を継承して Counter2 を作る • Counter2 に以下のメソッドを実装する -‐ double: 現在のカウンターの値を2倍する -‐ clear_counter: カウンターを初期化する
Python 入門 283
class Counter: value = -‐1 def __init__(self, value): self.value = value def get_value(self): return self.value def count_up(self): self.value += 1
![Page 284: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/284.jpg)
Tkinter の Bu7on
• ボタンを押された際に特定の関数(メソッド)を呼び出す • Bu7on(command=「呼び出す関数(メソッド)名」)
Python 入門 284
import Tkinter as tk def clicked(): print("clicked") bu7on = tk.Bu7on(text="Click", command=clicked) bu7on.pack() bu7on.mainloop()
>>> clicked
click する
表示される
![Page 285: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/285.jpg)
継承を使わないカウンターの実装
Python 入門 285
import Tkinter as tk class Counter: label = None value = -‐1 def clicked(self): # Click時に呼ばれる self.value += 1 self.label.configure(text=self.getText()) def getText(self): # 表示する文字を作成 return "Count:{}".format(self.value)
def __init__(self, value): self.value = value frame = tk.Frame() font = ("Helevecca", 32, "bold") self.label = tk.Label(frame, text=self.getText(), font=font, bg="red") bu7on = tk.Bu7on(frame, text="Click", command=self.clicked) self.label.pack() bu7on.pack() frame.pack() frame.mainloop() c = Counter(0)
![Page 286: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/286.jpg)
継承を使うカウンタの実装
Python 入門 286
import Tkinter as tk class Counter(tk.Frame): label = None value = -‐1 def clicked(self): self.value += 1 self.label.configure(text=self.getText()) def getText(self): return "Count:{}".format(self.value)
def __init__(self, master=None, value=0): tk.Frame.__init__(self, master) self.value = value font = ("Helevecca", 32, "bold") self.label = tk.Label(self, text=self.getText(), font=font, bg="red") bu7on = tk.Bu7on(self, text="Click", command=self.clicked) self.label.pack() bu7on.pack() c = Counter(value=0) c.pack() c.mainloop()
![Page 287: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/287.jpg)
• クラス Counter 自身も Widget
Python 入門 287
継承を使うカウンタの実装
frame = tk.Frame() c1 = Counter(master=frame, value=0) c2 = Counter(master=frame, value=5) c1.pack(side=tk.LEFT) c2.pack(side=tk.LEFT) frame.pack() frame.mainloop()
![Page 288: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/288.jpg)
演習
• 継承を使ったクラス Counter に Clear ボタンを追加する
• Clear ボタンをクリックするとカウンタを初期値に戻す
Python 入門 288
![Page 289: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/289.jpg)
例外処理
Python 入門 289
![Page 290: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/290.jpg)
例外 • プログラムの継続実行を妨げる意図しない挙動
Python 入門 290
1: 2 Traceback (most recent call last): File "/Users/yuichi/Documents/python-‐training/excepcon.py", line 3, in <module> b = 5 / 0 ZeroDivisionError: integer division or modulo by zero
a = 1 + 1 print("1: " + str(a)) b = 5 / 0 print("2: " + str(b)) c = a + 1 print("3: " + str(c))
0 での割り算。ここで例外が発生し、処理を中断!!
0 での割り算は数学的に許容されない Python が例外を発生させる
![Page 291: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/291.jpg)
例外 • プログラム自身に起因する例外 – 0での割り算 – 配列長外にアクセス
• プログラムの外の環境に起因する例外 – ネットワークに接続できない – ユーザからの入力が不正な値
Python 入門 291
![Page 292: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/292.jpg)
例外の対処方法
• 例外の「キャッチ(補足)」
Python 入門 292
a = 1 + 1 print("1: " + str(a)) b = 5 / 0 print("2: " + str(b)) c = a + 1 print("3: " + str(c))
例外を補足した場合の処理
例外が発生
例外を補足
![Page 293: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/293.jpg)
try/except
• 例外の補足には try, except を利用 • 補足する Except は例外の種類に対応してい
る必要がある
Python 入門 293
try: 例外が発生する可能性のある処理 except エラークラス: 例外処理 ※ エラークラスは先の「例外の種類」のクラス
![Page 294: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/294.jpg)
try/except
Python 入門 294
try: a = 1 + 1 print("1: " + str(a)) b = 5 / 0 print("2: " + str(b)) c = a + 1 print("3: " + str(c)) except Excepcon: print("Error happens") print("Done")
1: 2 Error happens Done
![Page 295: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/295.jpg)
NETWORK(おまけ)
Python 入門 295
![Page 296: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/296.jpg)
通信の手順
Python 入門 296
ソケットをオープン 通信を待つ ソケットをオープン
通信を開始 Hello
相互にやりとり
ソケットをクローズ
クライアント サーバ
![Page 297: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/297.jpg)
ソケットを使ったサーバ • ソケットをオープンしてデータを待つ • ソケットには受信IPとポートを指定する
Python 入門 297
import socket IP = socket.gethostbyname(socket.gethostname()) PORT = 12345 BUFF_SIZE = 2048 ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ssock.bind((IP, PORT)) ssock.listen(10)
while(True): (csock, ip) = ssock.accept() while(True): data = csock.recv(BUFF_SIZE) if(not data): break print(data)
![Page 298: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/298.jpg)
ソケットを使ったクライアント
• ソケットをオープンしてデータを送る • ソケットには宛先IPとPORTを指定
Python 入門 298
import socket IP = socket.gethostbyname(socket.gethostname()) PORT = 12345 BUFF_SIZE = 2048 csock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) csock.connect((IP, PORT)) csock.send("Hello World") csock.close()
![Page 299: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/299.jpg)
サンプルプログラム
• チャット用アプリケーション
Python 入門 299
自分のIP
宛先IPとメッセージ
送信元IPとメッセージ
![Page 300: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/300.jpg)
演習
• チャット用のアプリケーションには送信先に問題があるとクラッシュするという問題がある。これを解決する。
• ヒント: クラッシュは例外に対処できていないため発生している
Python 入門 300
![Page 301: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/301.jpg)
Python 入門 301
![Page 302: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/302.jpg)
Next Plan
• Network Programming • GUI Programming(tkinter, wxPython, Qt) • Big Data Broker • Python on Nexus • XML, json, Rest API • Advanced Object Oriented Programming • Funcconal Programming • Algorithm
Python 入門 302
![Page 303: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/303.jpg)
ボツ スライド
Python 入門 303
![Page 304: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/304.jpg)
メソッドの属性
• メソッドには複数種類ある • 通常のメソッド: 第3回で扱ったもの • クラスメソッド • スタティックメソッド
Python 入門 304
![Page 305: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/305.jpg)
クラスメソッド
Python 入門 305
![Page 306: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/306.jpg)
スタティックメソッド
Python 入門 306
![Page 307: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/307.jpg)
クラスの継承
Python 入門 307
![Page 308: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/308.jpg)
名前空間(NAMESPACE)
Python 入門 308
![Page 309: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/309.jpg)
名前空間
• 変数名などの重複を防ぐための仕組み
Python 入門 309
10万行以上の巨大なプログラム
.... global 変数 index .... global 変数 index
違う目的の変数を複数回定義(名前が衝突) 意図せず変数の中身が書き換わる
![Page 310: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/310.jpg)
名前空間 • 変数名などの重複を防ぐための仕組み
Python 入門 310
10万行以上の巨大なプログラム
.... global 変数 index1 .... global 変数 index2 .... global 変数 index3
10万行以上の巨大なプログラム
.... 変数 index ....
.... 変数 index ....
.... 変数 index ....
.... 変数 index ....
名前空間なし: 変数名で衝突を防ぐ 名前空間あり: 衝突範囲が狭い
名前空間A 名前空間B
名前空間C 名前空間D
![Page 311: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/311.jpg)
名前空間
• スコープ • 代表的なスコープ
1. ビルトインスコープ 2. グローバルスコープ 3. Classや関数のスコープ 4. for文などのローカルスコープ
Python 入門 311
![Page 312: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/312.jpg)
クロージャ • 関数を生成する関数。別名はファクトリ関数 • 似たような関数を大量生成する際に使う
Python 入門 312
def getPrintFunccon(string): def f(): print(string) return f hello = getPrintFunccon("hello") python = getPrintFunccon("python") cisco = getPrintFunccon("cisco") hello() python() cisco()
![Page 313: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/313.jpg)
try/except
• 複数の except 節を使って細かい制御が可能
Python 入門 313
try: 例外が発生する可能性のある処理 except エラークラス1: 例外処理1 except エラークラス2: 例外処理2 ※ エラークラスは先の「例外の種類」のクラス
![Page 314: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/314.jpg)
try/except/else • else節で「例外がない場合の処理」を書ける
Python 入門 314
try: a = 1 + 1 print("1: " + str(a)) b = 5 / 0 print("2: " + str(b)) c = a + 1 print("3: " + str(c)) except Excepcon: print("Error happens") else: print("No problem") print("Done")
try: a = 1 + 1 print("1: " + str(a)) #b = 5 / 0 #print("2: " + str(b)) c = a + 1 print("3: " + str(c)) except Excepcon: print("Error happens") else: print("No problem") print("Done")
1: 2 Error happens Done
1: 2 3: 3 No problem Done
![Page 315: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/315.jpg)
例外を発生させる
Python 入門 315
try: print(1) raise Excepcon("Hello") print(2) except Excepcon: print("Error happens") print(3)
1 Error happens 3
![Page 316: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/316.jpg)
デバッグ
Python 入門 316
![Page 317: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/317.jpg)
デバッグの役割
• プログラムの問題を発見する – プログラムを運用させる前に発見し修正するため – 運用後に見つかった問題を修正するため
Python 入門 317
![Page 318: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/318.jpg)
プリントデバッグ
• 一番手軽にできる基本的な debug 手法
Python 入門 318
![Page 319: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/319.jpg)
モジュールレベルのデバッグ
if __name__ == "__main__": モジュールのテストコード
Python 入門 319
![Page 320: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/320.jpg)
assercon
• デバッグに特化した rise 処理
Python 入門 320
![Page 321: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/321.jpg)
PyUnit によるユニットテスト
Python 入門 321
![Page 322: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/322.jpg)
pdbによるデバッグ
Python 入門 322
![Page 323: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/323.jpg)
デバッグ処理
Python 入門 323
![Page 324: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/324.jpg)
オブジェクト指向(発展編)
Python 入門 324
![Page 325: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/325.jpg)
オブジェクトツリー
Python 入門 325
![Page 326: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/326.jpg)
ガーベジコレクション
Python 入門 326
![Page 327: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/327.jpg)
型チェック
Python 入門 327
![Page 328: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/328.jpg)
ポリモーフィズム
Python 入門 328
![Page 329: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/329.jpg)
ダックタイピング
Python 入門 329
![Page 330: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/330.jpg)
リスト発展編
Python 入門 330
![Page 331: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/331.jpg)
map 関数
• List の各要素に対して関数を適用する関数
Python 入門 331
N = 10 def double(x): return x * 2 list1 = map(double, range(N)) list2 = [] for i in range(N): list2.append(i*2) print(list1) => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] print(list2) => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
map(関数, リスト)
![Page 332: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/332.jpg)
filter 関数
• List の各要素に対して関数を適用し、True になった要素のみで List を作る
Python 入門 332
def isOver0(x): return x > 0 list1 = range(-‐5,5) list2 = filter(isOver0, list1) print(list1) => [-‐5, -‐4, -‐3, -‐2, -‐1, 0, 1, 2, 3, 4] print(list2) => [1, 2, 3, 4]
![Page 333: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/333.jpg)
lamda式
• 関数をその場で定義するための手法 • 関数を返す
Python 入門 333
lamda(引数): 処理
>>> power = lambda x: x**2 >>> list1 = range(10) >>> map(power, list1) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> map(lambda x: x**2, range(10)) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
![Page 334: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/334.jpg)
reduce
• 「たたみ込み」と呼ばれる処理
Python 入門 334
>>> getSum = lambda x, y: x+y >>> reduce(getSum, range(10)) 45
![Page 335: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/335.jpg)
yield
Python 入門 335
![Page 336: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/336.jpg)
リスト内包表記
• if 文を使って要素を絞れる
Python 入門 336
>>> [x**2 for x in range(10) if x % 2 == 0] [0, 4, 16, 36, 64] 1. リストから偶数のみ抜き出す 2. 偶数のリストに対して 2乗する処理を適用
[処理 for 要素 in リスト if 条件式] リストの要素から条件式がTrueになるもののみ抽出 それに対して処理を適用
![Page 337: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/337.jpg)
Python 入門 337
![Page 338: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/338.jpg)
ドキュメント
Python 入門 338
![Page 339: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/339.jpg)
dir
• クラスやパッケージの中身を確認する関数
Python 入門 339
>>> dir(str) ['__add__', '__class__', '__contains__', '__dela7r__', '__doc__', '__eq__', '__format__', '__ge__', '__geta7ribute__', '__gectem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__seta7r__', '__sizeof__', '__str__', '__subclasshook__', '_forma7er_field_name_split', '_forma7er_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'isctle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'parccon', 'replace', 'rfind', 'rindex', 'rjust', 'rparccon', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'ctle', 'translate', 'upper', 'zfill']
![Page 340: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/340.jpg)
help • man コマンドに近い関数
Python 入門 340
>>> help(int) Help on class int in module __builcn__: class int(object) | int(x=0) -‐> int or long | int(x, base=10) -‐> int or long | | Convert a number or string to an integer, or return 0 if no arguments <省略> | Methods defined here: | | __abs__(...) | x.__abs__() <==> abs(x) | | __add__(...) | x.__add__(y) <==> x+y
![Page 341: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/341.jpg)
PYTHON ON NEXUS
Python 入門 341
![Page 342: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/342.jpg)
Python Script on Nexus
• Nexus 内で特定の処理をさせることが可能 • 機器の状態に応じたコマンドの発行 • 定期的な複雑なログの取得
Python 入門 342
![Page 343: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/343.jpg)
強力なEEMとしての利用
• 従来の EEM のイベントで python script を呼び出す • show コマンドの発行、解析を python にさせる • 結果に応じてclear mac や、shut/no shutコマンドの発行
Python 入門 343
![Page 344: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/344.jpg)
Python Script on Nexus VPC+ 障害時における RIB と FIB Inconsistency 解消
Python 入門 344
N7K-‐1 SID:71
N6K-‐1 SID:61
N7K-‐2 SID:72
N6K-‐2 SID62
Z
Z
N7K-‐A(OK)
N7K-‐B(OK)
IXIA-‐1
IXIA-‐2
Z
Z
Z
Z
FP NETWORK
keep alive
keep alive
secondary primary 事象(2013年末に発生) N7K1-‐2 においてVPC+の冗長構成が 壊れた際にFabricPath Route の FIB が 更新されない。 その結果として間違ったスイッチに 転送を継続し続けて Dropが発生 解消法 VPC+ の secondary 側のFP網に接する 物理リンクを shut させることで FIBを 強制的に更新させる
![Page 345: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/345.jpg)
Python 入門 345
MKI-‐VDC2# show file boomlash:if-‐mon.py # VPC の状態確認コマンドを発行。VPC のステートを得る shVpc = cli ("show vpc") shVpcLines = shVpc.splitlines() stateList = shVpcLines[11].split() vpcState = stateList[len(state_list)-‐1] # もしVPCが secondary なら、特定インタフェースを落とす if (vpcState == "secondary"): print("shutdown fp interface") cli("conf t ; int e7/9,e9/9 ; shut")
EEM で peer-‐link のダウンを検出 (コンソール表示をチェック) 検出したら、以下のスクリプトを実行
![Page 346: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/346.jpg)
検証での python script の利用
• 多量のコマンドの出力結果を何度も得る • 定期的にコマンドを発行
Python 入門 346
手元のメモ帳に取得コマンド一覧を作って流し込む -‐ 作るのが簡単 -‐ 融通が効かない(書き出しファイル名の変更などが大変) python script を呼び出す -‐ 作るのが若干大変 -‐ 修正が簡単 -‐ 融通が効く
![Page 347: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/347.jpg)
FPの検証プログラム
• 実際に検証で使ったプログラムのCSC版
Python 入門 347
Python Script を利用したログの取得方法 h7ps://suppormorums.cisco.com/docs/DOC-‐39662
![Page 348: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/348.jpg)
Python 入門 348
if __name__ == "__main__": if(len(sys.argv) == 4): fileName = sys.argv[1] sleepInterval = int(sys.argv[2]) sleepCount = int(sys.argv[3]) print("taking Rate logs") writeTime(fileName) writeRateLogs(fileName, sleepInterval, sleepCount) print("taking FP logs") writeTime(fileName) writeFPLogs(fileName) writeOldLogs(fileName)
def makeEcho(string, fileName): return 'echo \"' + string + '\" >> boomlash:' + fileName def makeShow(string, fileName): return string + " >> boomlash:" + fileName def makeCombi(string, fileName): #コマンドの時刻, 名前, 結果を書く return makeShow("show clock", fileName) + " ;" + makeEcho("#" + string, fileName) + " ;" + makeShow(string, fileName) + " ;" + makeEcho("", fileName) def writeRateLogs(fileName, interval, n): # Rate を定期測定 for i in range(0, n): cli(makeCombi(SHOW_RATE_BETWEEN_N6K_AND_N7K, fileName)) cli(makeCombi(SHOW_RATE_AT_PEER_LINK, fileName)) cli(makeEcho("", fileName)) cme.sleep(n) def writeFPLogs(fileName): # コマンドの羅列 cli(makeCombi(SHOW_FP_ISIS_ROUTE, fileName)) cli(makeCombi(SHOW_FWM_L2MP_NEXT_HOP, fileName)) cli(makeCombi(SHOW_FWM_HWSTM, fileName)) cli(makeCombi(SHOW_FWM_L2MP_ROUTE, fileName)) cli(makeCombi(SHOW_FWM_MAC_HSRP_VMAC, fileName)) cli(makeCombi(SHOW_FWM_L2MP_VLAN, fileName)) cli(makeCombi(SHOW_FWM_L2MP_TOPO_0, fileName))
![Page 349: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/349.jpg)
ライブラリ紹介
Python 入門 349
![Page 350: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/350.jpg)
日付
Python 入門 350
![Page 351: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/351.jpg)
数学
Python 入門 351
![Page 352: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/352.jpg)
スレッド
Python 入門 352
![Page 353: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/353.jpg)
データベース
Python 入門 353
![Page 354: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/354.jpg)
ネットワークプログラミング
Python 入門 354
![Page 355: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/355.jpg)
webアプリケーション
Python 入門 355
![Page 356: Python入門 : 4日間コース社内トレーニング](https://reader034.vdocuments.mx/reader034/viewer/2022052200/55a209d71a28ab90368b45d2/html5/thumbnails/356.jpg)
GUI
Python 入門 356