今日のPython
GWはバイト地獄+輪講の資料作成が重なって、全然Pythonに触れなかった・・・
気合いを入れ直していざ!やるぞー
リストや辞書の中のユニコード
p.187
>>> a = [u"あいう", u"かきく", "あまの"] >>> a #中身を確認 [u'\u3042\u3044\u3046', u'\u304b\u304d\u304f', '\xe3\x81\x82\xe3\x81\xbe\xe3\x81\xae'] #エスケープしちゃう >>> for item in a: #要素をひとつずつ表示 ... print item ... あいう #見れた! かきく あまの
文字列を要素として含むリストや辞書などを表示すると、数値にエスケープされてしまう。
元の文字列を表示するためには、for文などのループを使い、要素ごとにprintする。
モジュールを使う
p.190 モジュールをインポートする
import モジュール名
p.190 mathモジュールをインポートする
>>> import math >>> 10 * 20 * math.sin(math.radians(45)) / 2 70.710678118654741
from文を使ったインポート
p.192
import文の代わりにfrom文を使ってモジュールを読み込むことができる。「math.sin」のように、モジュール名を記述せず関数や変数を利用したいときに利用する。
先ほどのコードは以下のように書ける。
>>> from math import sin, radians >>> 10 * 20 * sin(radians(45)) / 2 70.710678118654741
math.と書く必要がなくなった。
モジュール内の特定の関数をそのまま利用するために使うという感じかな。
モジュールファイルを作る
p.196 testmodule.py
#!/usr/bin/env python import sys a = 1 b = "ama-ch" def foo(): print "This is function 'foo' !!" print "this is top level" if __name__ == '__main__': print "this is code block"
インポートして利用する
>>> import testmodule #モジュールをインポート this is top level >>> testmodule.a #変数を表示 1 >>> testmodule.b 'ama-ch' >>> testmodule.foo() #関数を呼び出す This is function 'foo' !! >>> testmodule.sys.argv #モジュール内でインポートしたモジュールを使う ['']
インポート時にprint文が実行されるのは、読み込んだ時点で変数の初期化などをするため?
モジュールファイルの最後の2行について。
if __name__ == '__main__':
というif文のブロックを記述すると、モジュールファイルをインポートしてもブロック内部は実行されない。かわりに、Pythonの引数にモジュールファイル名を与えると、ブロック内部が実行される。
$ python testmodule.py this is top level this is code block
このようなif文には、機能をテストするためのテストコードを書くことがある。こうすることで、モジュールをインポートする前に単体で実行することができ、正しく動くかどうか確認できる。
p.198
Pythonには何種類かの組み込み属性があり、__name__も組み込み属性のひとつ。ファイルがモジュールとしてインポートされた場合、この変数にモジュール名を代入する。ファイルを直接実行した場合、「__main__」という文字列を代入する。これを利用することで、プログラムがどのように読み込まれたのかを判断できる。
標準ライブラリを使う
fileinputモジュール
p.206
#!usr/bin/env python # -*- coding: utf-8 -*- import fileinput width = 8 #要素の表示幅 for line in fileinput.input(): tsv = line.split() #空白文字列で行を区切る print "+".join(["-"*(width)]*len(tsv)) for cnt in range(len(tsv)): tsv[cnt] = tsv[cnt].center(width) print "|".join(tsv)
実行結果
$ python test.py words.txt --------+-------- hello | Hello --------+--------+--------+--------+-------- My | my | name | is |ama-ch.
インターネット上のデータを取得する:urllibモジュール
p.208
>>> import urllib >>> import urlparse >>> url = "http://d.hatena.ne.jp/ama-ch/" >>> filename = urlparse.urlparse(url)[2].split('/')[-2] >>> filename #ファイル名を確認 'ama-ch' >>> urllib.urlretrieve(url, filename) #ファイルを取得、保存 ('ama-ch', <httplib.HTTPMessage instance at 0xbc3148>)
このブログのトップページを取得、保存するコード。
urlparse()についてはこちらを参照。http://www.python.jp/doc/release/lib/module-urlparse.html