ラベル Python の投稿を表示しています。 すべての投稿を表示
ラベル Python の投稿を表示しています。 すべての投稿を表示

2010年1月9日土曜日

Pythonの新スタイルクラス

Pythonのクラスは次のように定義します。

class クラス名(親クラス, 親クラス)
    クラス変数
    def __init__(self):
        self.インスタンス変数 = 値
    def メソッド(self):
        return 値

__init__はインスタンス化される際に呼び出されるメソッドです。

Pythonのクラスには、旧スタイルクラスと新スタイルクラスがあります。

class A: ←旧スタイル
    …

class A(object): ←新スタイル
    …

新スタイルクラスはPython2.2で取り入れられました。Python3.0では新スタイルクラスのみが使用できるようになっています。新スタイルクラスには以下の違いがあります。

多重継承の評価順番が違う 旧スタイルは上下優先(まず親をたどってから、同世代をたどる)。新スタイルは左右優先(同世代をたどってからその親世代をたどる)。
スタティックメソッド、クラスメソッドが使用できる スタティックメソッドは第一引数にインスタンスオブジェクトを渡さないでよいメソッド。
クラスメソッドは第一引数にクラスを渡せるメソッド。
__slots__属性が使用できる __slots__があるとインスタンスは指定された変数しかもてなくなる。指定されていない変数を指定するとAttributeErrorとなる

class A(object):
    __slots__ = [“x”, “y”]

a = A()
a.x = 10
a.y = 10
a.z = 10 → AttributeError
__getattribute__メソッドが使用できる よくわからん
プロパティが使用できる y=property(getter、setter、del、docs);

 

withステートメント

Python2.5からwithステートメントが使えるようになりました。ただし、2.5では機能を有効化する必要があります。

Pythonリファレンスマニュアル

注意: Python 2.5 では、with 文は with_statement 機能が有効に された場合にだけ許可されます。これは Python 2.6 では常に有効になります。__future__ インポート文が この機能を有効にするために利用できます:

from __future__ import with_statement

使い方は簡単。

import os

DIR = os.path.join(“C:\Temp”)

def main(s)
    os.chdir(DIR)
    with open(“hoge.txt”, ‘wb’) as f:
        f.write(s)

# withを使わない場合
#    f = open((“hoge.txt”, 'wb')
#    try:
#        f.write(s)
#    finally:
#        f.close()

if __name__ == "__main__":
    import sys
    args = sys.argv
    if len(args) > 1:
        s = u" ".join(args[1:])
        main(s)

withステートメントは便利ですが、Python2.6のurllib.urlopenなどの組込モジュールなど対応していないものもあります。

コマンドライン引数の取り方

コマンドライン引数はsys.argvから取得できます。sys.argvはリストになっていて、1番目がファイル名、2番目以降が引数となっています。

args.py

#! /usr/bin/env python
# coding: utf-8

if __main__ == ‘__main__’:
    import sys
    args = sys.argv
    print args

実行
>python args.py hoge
[‘args.py’, ‘hoge’]

2010年1月8日金曜日

PythonでRSS

PythonでRSSを使うには以下の方法があります。一般的にはXMLパーサを使うか専用モジュールを使います。

  1. 正規表現(re)で取り出す
  2. XMLパーサ(ElementTree)でパース
  3. 専用モジュール(feedparser)

feedparserはeasy_installに対応しているので、以下のようにしてインストールできます。

>easy_install.exe feedparser

RSSには以下の種類があります。RSSはバージョン間の互換性がなく、またバージョン番号が大きい方が最新と言うわけでもありません。1.0と2.0がよく使われています。

  • RDF Site Summary(RSS 0.9, 1.0)
  • Rich Site Summary(RSS0.91)
  • Really Simple Syndication(RSS2.0)

feedparserは各バージョンの差異(例えば、日時を表すpubDateやDateなど)を吸収してくれます。

import feedparser
url = “http://pipes.yahoo.com/poolmmjp/ej_translation_api?_render=rss&text=python”
d = feedparser.parse(url)
for item in d[‘item’]:
    title = item.title
    desc = item.desc
    print title, ‘=’, desc

2010年1月1日金曜日

文字列のフォーマット

%を使うと文字列のフォーマットができます。

>>> “Hello, %s” % “Python”
’Hello, Python’

>>> “%s, %s” % (“Hello”, “Python”)
’Hello, Python’

joinを使うと文字列の連結ができます。

>>> “ + “.join([“a”, “b”, “c”])
’a + b + c’

全角・半角や機種依存文字の変換

全角・半角や機種依存文字を変換して統一したい場合は以下のようにします。機種依存文字も変換してくれますが、マイナス記号「ー」、長音「ー」、波ダッシュ「~」など対応していないものもあります。

>>>import unicodedata
>>>s = u’アイウ123’
>>>print unicodedata.normalize(‘NFKC’, s)
アイウ123

NFKCはテキスト正規化処理方法の指定。NFKCの他にNFC,NFDの3種類がある。

 

Pythonの文字列のエンコードとデコード

Python3.0からはすべてのテキストがunicodeです。Python2.xではuの前置きでunicodeになります。

エンコード:unicode型 → str型に変換

unicode型の文字列をShift_JISにエンコード
u’あああ’.encode(‘Shift_JIS’)

デコード:str型 → unicode型に変換

str型の文字列をunicode型にデコード
’あああ’.decode(‘Shift_JIS’)
→ 文字コードを指定しない場合はデフォルトエンコーディングでデコードされる

s.decode()
unicode(s)

デコード前のエンコーディングを指定
s.decode(‘utf-8’)
unicode(s, ‘utf-8’)

メールで使うISO-2022-JP(JIS)に変換する場合、機種依存文字がエラーとなる場合があります。そのためにreplaceかignoreを使うとよいです。

replace
return s.encode(‘ISO-2022-JP’, ‘replace’)

replaceを指定すると変換に失敗した場合、encodeの場合は「?」に、decodeの場合は「REPLACEMENT CHARACTER(u”\uFFFD”)に置き換えられます。

ignore
return s.encode(‘ISO-2022-JP’, ‘ignore’)

ignoreを指定すると変換出来ない文字列が無視されます。

2009年12月23日水曜日

Pythonのデフォルトエンコーディング

Pythonのデフォルトエンコーディングは2.xではASCIIです。日本語を扱う場合は以下の設定をしておきます。

C:\Python25\Lib\site-packages\sitecustomize.py

import sys
sys.setdefaultencoding(‘utf-8’)

デフォルトエンコーディングは以下のように確認できます。

>>> import sys
>>> sys.getdefaultencoding()
’utf-8’

リスト内包表記

for文でlistを生成する場合に、リスト内包表記が使えます。例えば、

li = []
for i in [1, 2, 3, 4]:
    j = i ** i # iのi乗
    li.append(j)

普通は上のように書くところを、

li = [i ** i for i in [1, 2, 3, 4]]

と書くことが出来ます。さらに

li = []
for i in [1, 2, 3, 4]:
    if not i % 2 # 偶数
        j = i ** i
        li.append(j)

のようにif文がある場合には、

li = [i ** i for i in [1, 2, 3, 4] if not i % 2]

と書くことが出来ます。

例外

例外処理

try:
    raise ValueError(‘error’)
except ValueError, e:
    print e
except IndexError, e:
    print e
except:
    print ‘error’
finally
    print ‘final’

アンパック代入

Pythonではアンパック代入という方法があります。複数の変数の代入をまとめて行う方法です。

a = 1 # 普通の代入
a, b = 1, 2 # アンパック代入

CITY_ID = [('Tokyo', '1'), ('Yokohama', '2')]
for city, city_id in CITY_ID:
  print city
  print city_id

リスト、タプル、辞書

Pythonのデータ構造にはリスト、タプル、辞書があります。

リスト・・複数個のデータを順番を持ったデータとして格納できる。

CITY = [u’東京’, u’横浜’]

タプル・・・リストに似ているが、要素の変更が出来ない、イミュータブル(不変)。タプルの要素を変更する場合は新しいタプルを生成する。タプルはリストと違いdictのKeyになることができる。

CITY = (u’東京’, u’横浜’)

辞書(dict)・・KeyとValueを一対にして格納し、Keyを使ってValueを取り出す。dict型は順番を持てないのでforループで参照すると順番は任意になる。

CITY_NO = {u’東京’:‘1’, u’横浜’:’2’}

2009年11月15日日曜日

if __name__ = = “__main__”:

Pythonでよく見る if __name__ == “__main__”:。

Pythonのコードをスクリプトとして実行されると__name__が”__main__”となり、他のスクリプトからimportされた場合は、import名となる。つまり、スクリプトファイルとして実行された時の動作を記述しておくもの。

2009年11月13日金曜日

Pythonのモジュール、パッケージ、インポート

モジュールとは.pyのテキストファイルそのものです(sysなど予め用意されているモジュールのことを標準モジュールと言う)。パッケージは、モジュールをフォルダ毎にまとめたものです。フォルダをパッケージとして認識させるには、__init__.pyという名前の空ファイルをフォルダに配置します。

[Folder]aaapkg → パッケージ

    __init__.py

    aaamod.py → モジュール

    [Folder]bbbpkg

        __init__.py

        bbbmod.py

モジュールやパッケージを他のモジュールから使う場合にはインポートが必要です。インポートの方法はいくつかあります。

importを使う場合

    import aaamod

    import bbbpkg.bbbmod

        bbbpkg.bbbmod.foo() → importを使う場合、呼び出しは「パッケージ」.「モジュール」.「関数」となる

fromを使う場合

    from aaamod import foo

    from bbbpkg.bbbmod import bar

        bar() → 呼び出しは関数などの要素名のみで使用できる

    from bbbpkg import bbbmod → パッケージに含まれるモジュールをインポート

        bbbmod.bar()

    from bbbpkg.bbbmod import * → モジュールに含まれるすべての要素をインポート

        bar()

なお、インポートするには、モジュールが検索パスに含まれている必要があります。検索パスは以下のように調べられます。カレントディレクトリも検索パスに含まれます。また、sys.path.append(c:\hoge)などのように、Pythonシェルが終了するまで一時的にパスを追加することもできます。

import sys

sys.path

2009年11月12日木曜日

Python2と3の違い

Python2.xと3.0は互換性が少なく、2.xのコードが動かない場合があります。

  • 演算子「/」の演算結果が2.xだと整数だが、3.0だと浮動小数点となる。「//」(商の切り捨て)はどちらも整数。
  • Print文の書式。2.xだと Print aa, bb, cc だが、3.0だとPrint(aa, bb, cc)とかっこが必要。
  • 辞書のkeysメソッドの戻りが、2.xだとリストだが、3.0はlist関数を使う必要がある。list(a.keys())。
  • 2.xのデフォルトエンコーディングはASCIIだが、3.0はunicode(2.xのstr型がなくなった)。
  • 3.0ではbasestring型が廃止されている。
  • 3.0ではバイト型が導入されている。
    • Unicode型:2.x→「u”aa”」 3.0→「”aa”」
    • バイト列:2.x→「str型 “aa”」 3.0→「バイト型 b"aa"」

Pythonのインストール

Windowsの場合

Windows installerがあるので、ダブルクリック→次へ→次へとインストールします。あと、以下の環境変数で以下のC:\Python25とC:\Python25\Scriptsにパスを通しておいた方がよいです。

Pythonのサードパーティモジュールをインストールするために、easy_installをインストールします。PEAK(PYTHON ENTERPRISE APPLICATION KIT)からez_setup.pyをダウンロードします。ダウンロードしたez_setup.pyを実行(ダブルクリックでもOK)するとインストールされます。Vistaの場合UACが邪魔をするかもしれないのでご注意を!成功するとC:\Python25\Scripts\easy_install.exeがあるはずです。

コマンドプロンプトでpythonと入力し、Pythonが起動すればOKです。

最後に日本語が扱えるように設定ファイルを作成しておきます。

    1. IDLEを起動し、[File]-[New Window]で新しいウィンドウを表示
    2. 以下を入力
      Import sys
      sys.setdefaultencoding('utf-8')
    3. [File]-[Save As]で C:\Python25\Lib\site-packeagesにsitecustomize.pyの名称で保存。
    4. IDLEを再起動し、以下を入力して設定が反映されたかを確認。結果に‘utf-8’とでればOK
      import sys
      sys.getdefaultencoding()

 

Macの場合

OS X Leopardの場合、最初からPython2.5.1がインストールされています。それ以降のPythonをインストールする場合には、Mac Installer Disk Imageをダウンロードし、パッケージがマウントされたらMacPython.mpkgをダブルクリック。後は続けるでインストールが完了します。

インストール後の確認は、ターミナルを起動し、/usr/local/bin/pythonと入力してインストールしたバージョンが表示されたらOKです。

Pythonの歴史と普及率

気分転換にPythonの勉強を始めました。Pythonを始めました。Pythonについて初めて聞いたのはずいぶん昔5~6で、CMSを探していたときに見つけたzopeに使われているということで知りました。が、その時はxoopsを使ったため結局Pythonは使わず仕舞い。最近改めてPythonのソースコードをみると、その美しさに惹かれました。正確に言うとDjangoに惹かれたのが先ですが。

Pythonは1991年に、Guido van Rossum(グイド・ヴァン・ロッサム)さんによりリリースされました。現在はGuidoさんを含むPythonコミュニティにより開発がおこなわれています。

PythonはGuidoさんが開発に加わっていた、オランダの国立情報工学 数学研究所(CWI)で開発されたABCというプログラミング言語を参考にして、Guidoさんが自ら携わるプロジェクトのために開発されました。1984年にPython1.0がリリースされ、2008年12月にはPython3.0がリリースされています。

日本語の対応状況は、Python2.3以前ではShift-JISを扱うために別途コーデックが必要でしたが、Python2.5以降で標準で含まれているため、Shift-JISやUTF-8で日本語が扱えます。

Pythonの普及率は、TIOBE Programming Community Index for November 2009では7位、How popular are various programming languages?では2009年3月で1位です。