はてブロ@ama_ch

https://twitter.com/ama_ch

今日の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