這部分主要說明Python3的迭代器、生成器、裝飾器等相關知識。
1. 迭代器
Python 迭代器(Iterators)對象在遵守迭代器協(xié)議時需要支持如下兩種方法。
__iter__(),返回迭代器對象自身。這用在 for 和 in 語句中。
__next__(),返回迭代器的下一個值。如果沒有下一個值可以返回,那么應該拋出 StopIteration 異常。
class Counter(object):
def __init__(self, low, high):
self.current = low
self.high = high
def __iter__(self):
return self
def __next__(self):
#返回下一個值直到當前值大于 high
if self.current > self.high:
raise StopIteration
else:
self.current += 1
return self.current - 1
>>> c = Counter(5,10)
>>> for i in c:
... print(i, end=' ')
...
5 6 7 8 9 10
2. 生成器
生成器是更簡單的創(chuàng)建迭代器的方法,通過在函數(shù)中使用 yield 關鍵字來完成。
>>> def my_generator():
... yield 'a'
... yield 'b'
... yield 'c'
>>> for char in my_generator():
... print(char)
a
b
c
>>> def counter_generator(low, high):
... while low <= high:
... yield low
... low += 1
...
>>> for i in counter_generator(5,10):
... print(i, end=' ')
...
5 6 7 8 9 10
當調用生成器函數(shù)時它返回一個生成器對象。如果把這個對象傳入 dir() 函數(shù),會在返回的結果中找到 __iter__ 和 __next__ 等多個方法名。
任何一個生成數(shù)據(jù)的含有 __iter__ 方法的類都可以用作對象生成器。
- 生成器表達式
生成器表達式是列表推導式和生成器的一個高性能,內(nèi)存使用效率高的推廣。
生成器表達式的語法要求其總是直接在在一對括號內(nèi),并且不能在兩邊有逗號。
>>> sum(x*x for x in range(1,10))
285
>>> g = (x*x for x in range(1,10))
>>> g
<generator object <genexpr> at 0x7fc559516b90>
3. 裝飾器
裝飾器(Decorators)用來給一些對象動態(tài)的添加一些新的行為。
>>> def my_decorator(func):
... def wrapper(*args, **kwargs):
... print("Before call")
... result = func(*args, **kwargs)
... print("After call")
... return result
... return wrapper
...
>>> @my_decorator
... def add(a, b):
... #我們的求和函數(shù)
... return a + b
...
>>> add(1, 3)
Before call
After call
4
- 閉包
閉包(Closures)是由另外一個函數(shù)返回的函數(shù)。使用閉包可以去除重復代碼。
>>> def add_number(num):
... def adder(number):
... #adder 是一個閉包
... return num + number
... return adder
...
>>> a_10 = add_number(10)
>>> a_10(21)
31
>>> a_10(34)
44