Python3.0イテレータのnext()が__next__に。また、標準関数nextが使える
[PEP 3114] next標準メソッドは、__next__メソッドに改称されました。 (訳注:そのかわりにイテレータオブジェクトの順送りには、next標準関数が使える)
What'sNewInPython3.0 - TSNETWiki on TextWorld
例外処理
- try
- except
- else
- tryステートメントコードが例外を発生させなかった際に実行。
- finally
- 例外発生有無にかかわらず最後に実行される。
>>> def fetch(obj, i): ... try: ... print(obj[i]) ... except IndexError: ... print("IndexError") ... else: ... print("else") ... finally: ... print("finally") ... >>> fetch([1,2,3], 1) 2 else finally >>> fetch([1,2,3], 5) IndexError finally
__getattr__と__setattr__
>>> class wrapper: ... def __init__(self, object): ... self.wrapped = object ... def __getattr__(self, attrname): ... print("Trace", attrname) ... return getattr(self.wrapped, attrname) ... >>> lst = wrapper([1,2,3]) >>> lst.append(4) Trace append >>> lst.wrapped [1, 2, 3, 4]
関数デコレータ
.NETのCustomAttributeに近い印象。
>>> class Tracer: ... def __init__(self, func): ... self.cnt = 0 ... self.func = func ... def __call__(self, *args): ... self.cnt += 1 ... print(self.cnt) ... self.func(*args) ... >>> @Tracer ... def spam(a, b, c): ... print(a, b, c) ... >>> spam(1, 2, 3) 1 1 2 3
Python3のrangeはイテレータを返す
>>> q = (i ** 2 for i in range(100000) if i % 2 == 0) >>> for i in q: ... if i > 10: break ... print(i) ... 0 4
こういうのもすぐに処理が終了する。