Python

バグ

よく使う書き方

ループ

ループを回す : xrange を使って。

>>> for i in xrange(3):
...     print i
...     
0
1
2

型キャスト

s = "1.23"
float(s)
 
s = "2"
int(s)

逆はフォーマット演算子でできる。

"%.1f" % 1.234

改めて文法の基本

「Python チュートリアル」初版 p.33 あたり

シーケンス ('y', 'ye', 'yes') これはタプル

obj.methodname() : メソッド呼び出し

メソッドの仮引数 (a, *b, **c)
  • b: 可変個数の引数をタプルで受け取る
  • c: ディクショナリを受け取る
* 演算子 : リストやタプルからアンパックする
** 演算子 : ディクショナリからキーワード引数にアンパックする
  • 関数(メソッド):括弧が必要
  • 文:括弧が不要

docstring http://www.python.jp/doc/contrib/peps/pep-0257.txt

ラムダ式:無名関数の生成

return lambda x : x + n

文字コードを変換して logfile に書き込みを行う関数のオブジェクト print_log を作る:

logfile = open(outwavfile + '.log', 'w')
print_log = lambda s : logfile.write(s.decode('shift_jis').encode('utf-8'))
#
print_log('text: ' + s)

データ構造

p.41 あたり

リスト

リスト: [ xxxxxxxxxx ]

  • append extend insert remove pop index count sort reverse
  • スタックとして使うには append / pop
  • キューとして使うには append / pop(0)
  • len(オブジェクト) は要素数を取得。文字列の場合は文字数を取得。

シーケンスに関数を適用する

  • filter(関数, シーケンス)
  • map(関数, シーケンス)
  • reduce(関数, シーケンス)

リスト内包

[式 for x in vec]

vec = [1,2,3] として 式 = 3*x とすると [3,6,9] が得られる

>>> vec = [1,2,3]
>>> v2 = x * 2 for x in vec
SyntaxError: invalid syntax
>>> v2 = [x * 2 for x in vec]
>>> v2
[2, 4, 6]

del文 : リストのインデックス指定された要素を削除する

del a[0]

配列は足し算できる:

>>> b = [1,2,3]
>>> c = [4,5,6]
>>> d = b + c
>>> d
[1, 2, 3, 4, 5, 6]

ソートには sort() メソッドが使える:

>>> d += b
>>> d
[1, 2, 3, 4, 5, 6, 1, 2, 3]
>>> d.sort()
>>> d
[1, 1, 2, 2, 3, 3, 4, 5, 6]
>>> d.sort(reverse=True)
>>> d
[6, 5, 4, 3, 3, 2, 2, 1, 1]

参考 http://mglab.blogspot.com/2008/06/python-sortsorted_3738.html

タプル

タプルとは:カンマで区切られた値。イミュータブルなオブジェクト。

カッコはタプルの生成を意味するわけではないらしい。

t = 1, 2, 3 # パッキング

要素数0のタプル : t = ()
要素数1のタプル : t = (1,)

x,y,z = 1,2,3 
# タプル・パッキングされた右辺を、シーケンス・アンパッキングして左辺へ
  • シーケンスデータ型 : インデックス参照やスライス演算ができる
    • 文字列
    • リスト
    • タプル

集合

集合(set) : 重複しない順不同の要素

存在判定(membership testing) ⇒ in 演算子

s = set([ xx, xx, xx ]) で生成する

'xx' in s : True or False

ディクショナリ

ディクショナリ(ハッシュ):キーの唯一性

空のディクショナリ : {}

生成 d = { xx:xx, yy:yy }

keys() メソッド:すべてのキーのリスト

存在判定

  • メソッド has_key()
  • in 演算子

コンストラクタ

dict() コンストラクタ ← キーワード引数からも生成可
[(k1,v1), (k2,v2), .... ] リストから生成

ループをまわす

for k,v in xxx.iteritems():
  print k,v

シーケンスのループのための関数

enumerate()
zip()
reversed()
sorted()

条件

a > 1 and a < 3 #=> 1 < a < 3
比較の連鎖
a = s1 or s2 or s3 #=> 空でない最初の値
シーケンス要素の比較

条件による値の振り分け

>>> print "hoge" if True else "fuga"
hoge
>>> print "hoge" if False else "fuga"
fuga

モジュール

p.55

import 文

import モジュール名 #=> モジュール名.関数()

# グローバル変数 __name__ にモジュール名が入る

モジュールのインポートとは実行である

モジュールはプライベートなシンボル表を持つ

一つ上のディレクトリにある scripts を path に加えるおまじない:

sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../scripts")

from 文

インポートする側のシンボル表に直接取り込むのがfrom文

from モジュール名 import 関数
from モジュール名 import * # _で始まる名前は取り込まない

from future で将来バージョンの機能を有効にする:

from __future__ import print_function
print('hoge')

path

sys.path ← PYTHONPATH 環境変数

dir関数

http://www.python.jp/doc/2.5/tut/node8.html

「組込み関数 dir() は、あるモジュールがどんな名前を定義しているか調べるために使われます」

>>> import re
>>> dir(re)
['DEBUG', 'DOTALL', 'I', 'IGNORECASE', 'L', 'LOCALE', 'M', 'MULTILINE', 'S', 'Scanner', 'T', 'TEMPLATE', 'U', 'UNICODE', 'VERBOSE', 'X', '_MAXCACHE', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__version__', '_alphanum', '_cache', '_cache_repl', '_compile', '_compile_repl', '_expand', '_pattern_type', '_pickle', '_subx', 'compile', 'copy_reg', 'error', 'escape', 'findall', 'finditer', 'match', 'purge', 'search', 'split', 'sre_compile', 'sre_parse', 'sub', 'subn', 'sys', 'template']                                        

コンパイル

  • pyc : プラットフォーム非依存
  • pyo : -O オプションつき実行(assert を除く)

ビルトイン関数 dir(モジュール)

パッケージ __init__.py

クラス

「全てのクラスメンバ (データメンバも含む) は public (公開されたデータ) 」
「メンバ関数はすべて 仮想関数 (virtual) 」

「属性=ドットに続く名前すべて」「属性は読取り専用にも、書き込み専用にもできる」

「クラス定義から普通に (定義の終端に到達して) 抜けると、 クラスオブジェクト (class object)  が生成されます。
クラスオブジェクトは、基本的にはクラス定義で作成された名前空間の内容をくるむラッパ (wrapper) です。
生成されたクラスオブジェクトは復帰したローカルスコープにクラス定義のヘッダで指定した名前で結び付けられます。」

x = MyClass() # クラスの新しいインスタンス (instance) を生成し、そのオブジェクトをローカル変数 x へ代入

クラスのインスタンスを生成すると、新しく生成されたクラスインスタンスに対して自動的に __init__() を呼び出す。

「インスタンスオブジェクトが理解できる唯一の操作は、属性の参照です。
有効な属性の名前には二種類(データ属性およびメソッド)あります。 」

「クラス・オブジェクトでは2種類の演算: 属性参照とインスタンス生成をサポートしています」
「メソッドについて特別なこととして、オブジェクトが関数の第 1 引数として渡される」

「__spam (先頭に二個以上の下線文字、末尾に高々一個の下線文字) という形式の識別子は _classname__spam へと置換される」

構造体

slots を使うと ruby の struct のようなことができる。

とはいってもイコール演算でプロパティの値を比較してくれるわけではない。。

>>> class Hoge(object):
...   __slots__ = ('a', 'b')
...
>>> o = Hoge()
>>> o.a = True
>>> o.b = False
>>> p = Hoge()
>>> p.a = True
>>> p.b = False
>>> o == p
False
>>> o == o
True

namedtuple はイコール演算子で比較できるが、プロパティの値を更新できない。

>>> from collections import namedtuple
>>> Foo = namedtuple('Foo', 'a b')
>>> o2 = Foo(True, False)
>>> p2 = Foo(True, False)
>>> o2 == p2
True
>>> q2 = Foo(True, True)
>>> o2 == q2
False
>>> o2.a
True
>>> o2.b
False
>>> o2.b = True
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

外部プログラムとのインタフェース

シェルスクリプト的に使う

os.system() が使える。

from os import *
system("platex nishimoto.tex")

Logger

ruby の Logger クラス http://www.ruby-lang.org/ja/man/html/logger.html のようなことをするには?

logging.Logger でログファイルを簡単に扱える。

http://pythonjp.sourceforge.jp/dev/library/logging.html

ファイル操作

glob や shutil が使える。

ruby の FileUtils.mkdir_p のようなものを探したら見つけた

http://stackoverflow.com/questions/600268/mkdir-p-functionality-in-python

import os
import errno
def mkdir_p(path):
	try:
		os.makedirs(path)
	except OSError as exc:
		if exc.errno == errno.EEXIST:
			pass
		else: raise exc
  • os.path.exists() で調べて os.mkdir() する方がお行儀がよい。。

ディレクトリのファイルを別のディレクトリに移す。

import glob
import shutil
shutil.rmtree('logs')
mkdir_p('logs')
for f in glob.glob("out\\*.logs"):
	shutil.move(f, "logs")

PATH文字列

  • os.pathsep は PATH 環境変数のセパレータ
    • Windows では ;
  • os.sep はファイルパス文字列のセパレータ
    • Windows では \

find 的な操作

since 2011-11-10

カレントディレクトリの下を探して、ファイル名の末尾が ~1~ ~2~ などであるものを見つけて、(os.remove の行が有効の場合)削除する。

import os, re
for root, dirs, files in os.walk('.'):
    for f in files:
        if re.match(".+~\d~", f):
            s = root + os.sep + f
            print s
            # os.remove(s)

ファイル入出力

文字コード変換をするファイルコピー

since 2011-12-20

def convert_file(src_file, src_enc, dest_file, dest_enc):
	with open(src_file) as sf:
		with open(dest_file, "w") as df:
			while 1:
				s = sf.readline()
				if not s:
					break
				df.write(s.decode(src_enc).encode(dest_enc))

オブジェクトの永続化

pickleを使う http://python.g.hatena.ne.jp/muscovyduck/20080820/p1


Pythonチュートリアル 第2版
Guido van Rossum
オライリージャパン
売り上げランキング: 89762
おすすめ度の平均: 3.0
3 気軽に読めるのは良いが、説明不足感はある


エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス
売り上げランキング: 10775
おすすめ度の平均: 5.0
5 Pythonハッカーになるために必要な事を網羅的に紹介した本


Pythonプロフェッショナルプログラミング
ビープラウド
秀和システム
売り上げランキング: 13666

python.txt · 最終更新: 2013/03/26 16:29 by Takuya Nishimoto
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0