2006-09-01から1ヶ月間の記事一覧

argfはないけれど

RubyではARGFというものがあるらしいのですが、Pythonにはありません。fileinputを使うと同じようなことができるみたいです。 a.pyは import re import fileinput caption = '' for line in fileinput.input(): line = line.strip() if re.match(">(.*)", li…

argv

sys.argvでコマンドライン引数を参照できます。 import sys for i in sys.argv[0:]: print i print sys.argv print type(sys.argv)実行例は以下のようになります。 > python a.py 12 345 apple orange a.py 12 345 apple orange ['a.py', '12', '345', 'appl…

property

組み込み関数propertyを使ってみます。 class Foo(object): def __init__(self): self.__a = 0 def set_a(self, b): print 'set_a is called.' self.__a = b def get_a(self): print 'get_a is called.' return self.__a a = property(fset=set_a, fget=get_…

関数はfunctionのインスタンス……?

関数にも属性を追加できるみたいです。 def f(): print 'hello' f() # => hello f.a = 'f.a' print f.a # => f.a setattr(f, 'b', 'f.b') print f.b # => f.b import sys setattr(f, 'c', lambda x: sys.stdout.write(x+'\n')) f.c('hello, hello') # => hel…

locals

localsはローカル空間で参照できる変数をkey、その中身をvalとした辞書を得る組み込み関数です。グローバル空間で呼ぶとglobalsと同じ結果になります。 # グローバル空間ではglobalsと同じ print 'globals:', globals() # => globals: {'__builtins__': <module '__builtin__' (built-in)>, '_</module>…

globals

globalsはグローバル空間で参照できる変数をkey、その中身をvalとした辞書を得る組み込み関数です。 print globals() # => {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__': 'a.py', '__doc__': None} # 変数を作ると辞書に追加される a = 12 print </module>…

ループのelse

Pythonではループにもelse節を書くことができます。 n = 0 while 1: print n n += 1 if n > 5: break else: print 'loop is end.' # => 0 # 1 # 2 # 3 # 4 # 5 n = 0 while n <= 5: print n n += 1 else: print 'loop is end.' # => 0 # 1 # 2 # 3 # 4 # 5 #…

引数つきraise

raiseを使うと意図的に、任意の例外を起こすことができます。 try: raise Exception except Exception: print 'error!!' # => error!!例外を起こすときに、引数を渡すことができます。 try: raise Exception, 'error!!' except Exception, e: print e # => e…

filter

filterは第二引数で渡されたシーケンスの中から、第一引数で渡された関数の結果がTrueの要素からなるシーケンスを返す組み込み関数です。 print filter(lambda x: x%2, range(5)) # => [1, 3] print filter(lambda x: int(x)%2, '01234') # => 13 print filt…

reduxe

組み込み関数reduceを使ってみます。 print reduce(lambda x, y: x+y, range(10)) # => 45 print reduce(lambda x, y: x-y, range(10), 100) # => 55 print reduce(lambda x, y: x+' '+y, 'apple juice',) # => a p p l e j u i c e print reduce(lambda x, …

map

組み込み関数mapを使ってみます。 l1 = range(5) l2 = ('apple', 'orange', 'banana', 'pine apple', 'peach') print map(None, 'apple juice') # => ['a', 'p', 'p', 'l', 'e', ' ', 'j', 'u', 'i', 'c', 'e'] print map(str, l1) # => ['0', '1', '2', '3'…

文字列と文字コード

組み込み関数ordを使うと文字コードを得ることができます。 print 'a =>', ord('a') # => a => 97 for i in 'apple': print i, '=>', ord(i) # => a => 97 # p => 112 # p => 112 # l => 108 # e => 101組み込み関数chrを使うと文字コードから文字列に変換す…

zip

組み込み関数zipを使ってみます。 print zip() # => [] print zip(range(5)) # => [(0,), (1,), (2,), (3,), (4,)] print zip(range(5), 'apple') # => [(0, 'a'), (1, 'p'), (2, 'p'), (3, 'l'), (4, 'e')] print zip(range(5), [i**2 for i in range(10)])…

enumerate

組み込み関数enumrateを使ってみます。 e = enumerate(range(5)) print e.next() # => (0, 0) print e.next() # => (1, 1) for i in e: print i # => (2, 2) # (3, 3) # (4, 4)enumerateにシーケンス型やイテレータを渡すと (インデクスの値, インデクスの値…

staticmethod

staticmethodとclassmethodの区別が付いていなかったのですが、staticmethodは暗黙の第一引数(一般的に言うとself)を受け取らないみたいです。 class Foo: name = 'i am Foo.' @classmethod def f(a, b, c): print a, b, c, a.name class Bar(object): name …

set型

setは集合を表す組み込み型です。変更可能なsetと、変更不可能なfrozensetがあります。 参考資料 http://www.python.jp/doc/release/lib/types-set.html 組み込み関数setに引数としてシーケンス型やイテレータを渡すことでsetを生成することができます。froz…

イテレータとジェネレータ

イテレータを作ってみました。 import math class Fib: def __init__(self, m): self.m = m self.n = -1 def __iter__(self): return self def next(self): if self.m == self.n: raise StopIteration else: self.n += 1 return int(((1+math.sqrt(5))**self…

例外処理

例外処理をしてみます。 try: f = file('pythonco.py') except: print 'no such file...' # => no such file...特定の例外だけを捕まえたい場合はexceptの後に例外の種類を書きます。例えばfileを使ってファイルを開こうとして、ファイルが存在しない場合に…

raw_inputとinput

整数を2個入力して、その和を表示します。 x = int(raw_input('x = ')) y = int(raw_input('y = ')) print x, '+', y, '=', x+y実行例は以下のようになります。 x = 1 # <= 1を入力(数字以外を入力するとエラー) y = 12 # <= 12を入力 1 + 12 = 13raw_input…

evalとexec

evalは引数で渡された文字列を評価して、その結果を返します。 print eval('1+1') # => 2 def function(): print 'hello' eval('function()') # => hello a = 'fun' b = 'cti' eval(a + b + 'on' + '()') # => hello a = '’ eval('a = 12') # => 代入は文な…

オブジェクトのid

組み込み関数idを使うとオブジェクトのアドレスを得ることができます。 a = 'a' print id(a) # => -1211207328idはisを使って比較するときに用いられます。 b = 'b' print id(b), a is b # => -1211207264 False変数が同じオブジェクトを指すようにすると b …

duck typing

duck typing、というものがあるらしいです。 class Foo: def hello(self): return 'i am Foo.' class Bar: def hello(self): return 'i am Bar.' class Boo: pass def say(a): print a.hello() l = [Foo(), Bar(), Boo(), Boo()] l[-1].hello = lambda: 'i a…

__new__のオーバーライド

__new__をオーバーライドしてみます。 class Foo: def __new__(cls): print '__new__ is overridden.' def hello(self): print 'hello, i am Foo.' f = Foo() f.hello()実行結果は以下のようになります。 hello, i am Fooあれ……? オーバーライドした__new__…

クラス変数

クラス定義内で定義された変数はクラス変数になるみたいです。挙動を調べてみました。 class Foo: bar = 0 @classmethod def cinc(cls): cls.bar += 1 def inc(self): self.bar += 1 fi1 = Foo() fi2 = Foo() # classmethod呼び出し Foo.cinc() print 'fi1:'…

平方根

math.sqrtで平方根が計算できます。 import math print math.sqrt(2) # => 1.41421356237 print math.sqrt(-1) # => ValueError: math domain errorRuby同様、負数を渡しても虚数にはならず、エラーになります。

有理数

有理数は組み込み型でも、標準モジュールでも提供されていません。しかし、DemoでRat.pyというクラスがある……らしいのですが、ぱいそんこのマシンには入っていませんでした。http://www.python.org/download/ の source tarball を展開したらDemo/classesに…

複素数

Pythonでは複素数は組み込み型です。何もimportすることなく使うことができます。 a = 1 + 2j print a # => (1+2j) a = complex(1, 2) print a # => (1+2j)jをつけた方が虚部になります。complexを使って生成した場合、第一引数が実部、第二引数が虚部になり…

lambdaを使おう

lambdaを使うと無名関数を作ることができます。 print (lambda x: x+1)(12) # => 13lambdaで作った関数を変数に入れておくこともできます。 a = lambda x: x+1 print a(12) # => 13lambdaの中に文を書くことはできません。書けるのは式一つだけです。 lambda…

引数リストのアンパック

引数の数と同じ要素数のシーケンス型変数を渡すと勝手に展開してくれます。 def f(a, b, c): print a, b, c f(*(1, 2, 3)) f(*(3, 4, 5)) f(*'cat') f(*['a', (0, 12, 34), {'foo':'bar', 'apple':'orange'}])実行結果は以下のようになります。 1 2 3 3 4 5 …

任意引数リスト

任意個数の引数をとる関数を書くことができます。 def f(a, b, *c): print a, b, c f(1, 2) f(1, 2, 3) f(1, 2, 3, 4) f(1, 2, 3, 4, 5)実行結果は以下のようになります。 1 2 () 1 2 (3,) 1 2 (3, 4) 1 2 (3, 4, 5)