Contenu connexe Similaire à Python勉強会4-制御構文とパッケージ (20) Python勉強会4-制御構文とパッケージ2. 前回の復習―リスト
• リスト
• Fortranの配列に似た概念
• サイズが後から変えられる
• list = [1, 2, 3, 4, 5]のようなもの
• リストの参照
• list[i]で要素の参照、list[i]=xで要素の代入
• しかし、実際にはリストの要素を順に参照したい
• →ループと同時に使うことがとても多い
• 今回:ループなどの制御構文
3. if文
• 条件分岐
• if cond1:で条件分岐を表す
• cond1が偽のときの条件はelif cond2:で表す
• ifやelif以外の場合はelse:で表す
• ifやelseの次の行(ブロック)はインデントが必要
• ブロックで何もしないときはpassと書く
• 例
if light == 'Green': # lightが'Green'ならば
pass # 何もしない
elif light == 'Yellow': # lightが'Yellow'ならば
print('Be Careful') # Be Carefulと表示
else: # どれでもなければ
print('Stop') # Stopと表示
4. 比較演算子など
• 比較演算子
== 等しい != 等しくない
< 小さい > 大きい
<= 以下 >= 以上
in 含まれる not in 含まれない
• 「真」と「偽」
True 真 False 偽
• 「かつ」と「または」と「not」
A and B AかつB A or B AまたはB
not A Aでない
5. TrueとFalse
• TrueとFalse
• ifや後述のwhileの判定条件に使う
• 例えば1 == 1はTrue、1==3はFalse
• 「値」なので変数に代入できる(例: x = (1 == 1))
• 実は全ての値(数字等も)はTrueかFalseにみなせる
• Falseとみなされるもの
• False、None、0、0.0、''(空文字列)、[](空リスト)、
(,)(空タプル)、{}(空辞書)、Set()(空集合)
• Trueとみなされるもの
• Falseとみなされるもの以外のほぼすべて
• "0"、"False"、[[]]、"¥n"(改行)などもTrue
6. while文
• while文
• while cond:でループを表す
• 実用上は後述のforが重要で、あまり使わない
• ループの先頭に移動するにはcontinueを使う
• ループを脱出するときはbreakを使う
• while True: で無限ループになる
• 例(1から10までを表示)
i = 1 # 初期値は1
while i <= 10: # iが10以下の間
print(i) # iを表示
i += 1 # iを1増やす
7. for文
• for文
• リストやファイルについて反復
• breakとcontinueはwhileと同じ
• 例
for i in [0, 1, 2]: # [0, 1, 2]はリスト
print(i) # 0 1 2を合計3行で表示
for l in sys.stdin: # 標準入力の各行について
print(l.rstrip()) # 改行を削除して表示
for y in [x * x for x in range(5)]:# リスト内包表記
print(y) # y(xの2乗)を表示
8. イテレータ、特にrange
• イテレータ
• 「次」が定義されたもの
• リスト→次の要素、ファイル→次の行、…
• range()
• 整数が出てくるイテレータ
• range(5) # [0, 1, 2, 3, 4](のようなもの)
• range(0, 5) # [0, 1, 2, 3, 4](のようなもの)
• range(0, 5, 2) # [0, 2, 4](のようなもの)
• for文―イテレータの用途
• for文のinの後ろは正確にはイテレータが来る
for i in range(5): # ループの範囲として使う
print(i) # 0,1,2,3,4を一行づつ表示
9. 発展―例外構文
• 例外(構文は下記を参照)
• エラーの一種
• Fortranではreadのiostatのようなもの
• try:内で例外が発生すると処理がcatchに移る
• 例外にはStopIteration、IndexError等がある
• catchはErrorで指定した指定した例外を補足する
• catchされないとプログラムが停止する
• 構文
try:
何らかの処理
catch Error:
例外処理
10. 演習10―FizzBuzz (file)
• FizzBuzz問題
• 1から40まで以下の条件に従って表示します
• 3の倍数のときはFizz
• 5の倍数のときはBuzz
• 3かつ5の倍数のときはFizzBuzz
• それ以外は数自体
• 実行結果(実際には1つずつ改行して下さい)
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz
11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz
Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz
31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz
11. 関数
• 関数
• プログラムの小さな単位の切り出し
• サブルーチンも(返り値なしの)関数として表現
• def func(argv):で定義、func(argv)で呼び出し
• 定義(例)
• def tashizan(a, b): # 関数を作る
• return a + b # 関数の返り値はa+b
• 呼び出し(例)
• sum = tashizan(1, 2) # 関数を使って計算
• print(sum) # => 3
12. 関数―変数のスコープ
• スコープ
• 変数が見える範囲
• 百聞は一見にしかず
• というわけで、例。
x = 1 # xをグローバルスコープで定義
def f(): # 関数fを定義(同時にスコープを設定)
y = 2 # yをfのスコープで定義
print(x) # xは関数の中からでも見える
f() # fを実行(print(x)は実行できる)
print(y) # yを表示…できない(スコープ外)
14. 演習11―指数関数 (file)
• 指数関数
• テーラー展開: 𝑒 𝑥
= 1 +
1
1!
𝑥 +
1
2!
𝑥2
+ ⋯
• 問題
• 上記に基づいてexp(x)=𝑒 𝑥を定義して下さい
• exp(1.0)を求めて下さい
• math.exp(1.0)と比較して下さい
• 出力結果
exp 2.7182818284590455
math.exp 2.718281828459045
15. モジュール
• ライブラリのimport
• import moduleでライブラリを読み込む
• ライブラリの関数はmodule.func(argv)で呼べる
• 例
• import math
• print(math.sqrt(2.0)) # => 1.4142135623730951
• 重要なライブラリ(※個人の感想です)
• re (正規表現)
• sys (シェル関連)
• math (数学関数)
17. オブジェクト
• オブジェクト
• オブジェクト=データ+関数(メソッド)
• リスト、タプルなどはオブジェクト
• リストの場合
• データ=各要素
• list.append(x) # listにxを追加
• list.extend(x) # listにxを展開して追加
• list.pop(i) # listからi番目の要素を削除し返す
• クラス
• オブジェクトの「型」
• リストの場合「リスト」という概念がクラス
• 配列1つ1つがオブジェクト
18. 発展―クラスの作り方
• クラスの作り方
• class Klass(ancestors):でクラスを作る
• ancestorsを指定すると「継承」ができる
• プロパティとメソッドの定義
• def method(self, args):でメソッドが定義できる
• selfにはオブジェクト自身が代入される
• self.propertyでプロパティが定義・参照できる
• オブジェクトの作り方
• class Klass(): …でクラスを作る
• obj = Klass()でKlass型のオブジェクトができる
• __init__(self, args)メソッドがあれば実行される
• obj.methodでメソッドを呼び出す
19. 発展―クラスの作り方・例
• 例(ベクトル):
class Vector():
def __init__(self, x, y):
self.x, self.y = x, y
def add(self, another):
return Vector(self.x+another.x, self.y+another.y)
def sub(self, another):
return Vector(self.x-another.x, self.y-another.y)
def __str__(self):
return "(" + str(self.x) + ", " + str(self.y) + ")"
u, v = Vector(1, 2), Vector(3, 4)
print(u.add(v), u.sub(v))
20. 発展―クラスの情報を得る
• help(obj)
• objの属するクラスについてヘルプを読む
• objがクラスそのものだった場合そのヘルプを読む
• 例: help(1) # intクラスのヘルプを読む
• 例: help(str) # strクラスのヘルプを読む
• dir(obj)
• objの属するクラスのメソッドを調べる
• objがクラスそのものの場合そのメソッドを調べる
• 例: dir(1) # intのメソッドを調べる
• 例: dir(str) # strのメソッドを調べる
• この資料を作るときにかなり使いました。
21. 発展―特殊メソッド
• 特殊メソッド
• 構文や演算子、関数の裏側で使われるメソッド
• a+bはa.__add__(b)に読み替えられる、など
• 1+3が4で'1'+'3'が'13'の理由
• intの__add__は整数の加法を返す
• strの__add__は連結した文字列を返す
• 特殊メソッドの例
a + b a.__add__(b) クラスの作成 x.__init__()
a == b a.__eq__(b) for x in iter: iter.__next__()
str(x) x.__str__() x in s (for以外) s.__contains__(x)
len(s) s.__len__() ifの条件 x.__bool__()
x[i] x.__getitem__(i) print(x) x.__str__()
x[i] = v x.__setitem__(i, v) 関数呼び出し f.__call__(args)
22. 演習12―残基 (file)
• collections.Counter
• リストなどを項目ごとに集計するクラス
• 使うにはcollectionsをimportした後、
• cnt = collections.Counter(list)とする
• dict(cnt.items())で集計後の辞書が手に入る
• 問題
• 次のページに示す化合物名に含まれる原子団を
種類ごとに数えて下さい
• -ylで区切ると原子団名(の形容詞形)になります
• 末尾のserineはserylにしなくて構いません
• ヒント
• ylで分割: 'yl'を'yl-'に置換→str.split('-')