Pythonのお勉強5回目
『みんなのPython』を使っての読書会の5回目。
4回目が抜けたけどまとめて一気にいってみる。
4回目の範囲がP.128〜P.167で5回目がP.168〜P.202。
組み込みのデータ型
数値から文字列への変換
- 整数から16進数表記の文字列への変換にはhex関数を使う。
- 整数から10進数表記の文字列への変換にはstr関数を使う。
- 整数から 8進数表記の文字列への変換にはoct関数を使う。
文字列から整数への変換
int関数を使う。第2引数で基数を指定できる。
# 2進数として変換 >int("10101",2) 21 # 16進数として変換 >int("FFF",16) 4095 # 20進数として変換 >int("FFF",20) 6315 # 基数の範囲外の値を指定するとエラー >int("555",2) ValueError: invalid literal for int() with base 2: '555'
raw文字列
ファイルのパスなどバックスラッシュをエスケープしたくない場合にraw文字列を使う。
# 通常の文字列でのバックスラッシュの扱い >"C:\abc\abc" 'C:\x07bc\x07bc' # raw文字列でのバックスラッシュの扱い >r"C:\abc\abc" 'C:\abc\abc'
パス文字列を与える時にすっきりと書けるのは嬉しい。
Javaなどではエスケープなのかバックスラッシュなのか分らなくなるし。
Pattern.compile("\\\\100\\r\\n");
new Statement("select * from t where a='don''t\\\\hoge'");
みたいに。
文字列操作メソッド
- join
文字列のシーケンスだけというのが微妙に使いにくい。
>"&".join(["a","b","c"]) 'a&b&c' # 数値のシーケンスを与えるとエラー >"&".join([1,2,3]) TypeError: sequence item 0: expected string, int found
javascriptやrubyではリストにjoinメソッドがあるので少し違和感を感じる。
- split
分割文字に指定できるのが文字列のみ。正規表現は使えない。
後で出てくる正規表現オブジェクトで定義されてるのかもれしない。
>"a&b&c".split("&") ['a','b','c']
- ljust,rjust,center
パディング処理。第2引数は「埋め草文字列」と書いてあるが、正しくは「埋め草文字」。
2文字以上を指定するとエラーになる。
>"ab".ljust(5,"=") 'ab===' # 第2引数に2文字以上を指定するとエラー >"ab".ljust(5,"--") TypeError: rjust() argument 2 must be char, not str # centerは割り切れない場合、左側を優先する。 >"ab".center(5,"=") '==ab='
リスト、タプルの操作
スライスを使った代入処理
>ar = [1,2,3,4,5] >ar[2:4] = ["a","b"] >ar [1,2,"a","b",5] # スライスした要素より少ない数の要素を代入してみる。 >ar = [1,2,3,4,5] >ar[2:5] = ["a", "b"] >ar [1, 2, 'a', 'b'] # 要素が減った! # スライスした要素より多い数の要素を代入してみる。 >ar = [1,2,3,4,5] >ar[2:4] = ["a","b","c"] >ar [1, 2, 'a', 'b', 'c', 5] # 要素が増えた!
だいぶわかってきた。
>ar = [1,2,3,4,5,6,7,8] >ar[2::3] = ['a', 'b', ['c', [3,4][:1],'d'],'e',[],'f'][2:5:2] [1, 2, ['c', [3], 'd'], 4, 5, [], 7, 8]
もはやわけがわからない。
アンパック代入
アンパック代入を使えば一時変数を使わずに変数の値の入れ替えができる。
a = 10 b = 20 a,b = b,a # a → 20, b → 10
リストの末尾への要素の追加と取り出しは
pushとpop
ではなく
appendとpop
>ar = [1,2,3] >ar.append(4) >ar.pop() 4
for文
シーケンスに対するループ処理は以前に学習した通りだが、
ループ中にカウンタ変数を参照したい場合はenumerate関数を使う。
d = {} for i,e in enumerate(["a", "b", "c"]): d.setdefault(i,e) >d {0:"a",1:"b",2:"c"}
モジュール
importを使う
# mathモジュールの関数が使いたい場合 import math # 関数を呼び出す時は math.radians(45)
モジュール名を省略して関数を呼び出したい場合は、
from importを使う。
from math import radians # 関数を直接呼べる radians(45) # アスタリスクを使ってモジュール内の関数全てをインポート from math import *
インポートするモジュールを別の名前でインポートする場合は、
asを使う。
import math as hoge hoge.radians(45)
sysモジュールにはpathというシーケンス型の変数が定義されていて、
importを実行した場合、pathの中にあるファイルシステム上から、
ファイル名が一致したモジュールをimportする。
以下はwindowsのpython2.5のデフォルトパス。
['', 'C:\\WINDOWS\\system32\\python25.zip', 'C:\\Python25\\DLLs', 'C:\\Python25\ \lib', 'C:\\Python25\\lib\\plat-win', 'C:\\Python25\\lib\\lib-tk', 'C:\\Python25 ', 'C:\\Python25\\lib\\site-packages']
sys.pathに独自のパスを追加してやる事で任意のパスからモジュールをインポートできる。
同じ名前のモジュールが複数のパス上にある場合はsys.pathの先頭から早く見つかった方をimportする。
あー疲れた。やっと本全体の半分くらいまできたかな。