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

javascriptrubyではリストに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

Set型

SetにはSQLのような集合操作関数がいくつかある。

  • union(和集合)
  • intersection(積集合)
  • difference(差集合)

など

for文

シーケンスに対するループ処理は以前に学習した通りだが、
ループ中にカウンタ変数を参照したい場合はenumerate関数を使う。

d = {}
for i,e in enumerate(["a", "b", "c"]):
  d.setdefault(i,e)

>d
{0:"a",1:"b",2:"c"}

日本語処理

この本によく出てくる「spam」というのは
『空飛ぶモンティパイソン』というTV番組第25話の「スパム・スケッチ」
というのが題材だそうだ。


この章は特に気になるところがなかった。。。

モジュール

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する。



あー疲れた。やっと本全体の半分くらいまできたかな。