这部分主要说明Python3的迭代器、生成器、装饰器等相关知识。
1. 迭代器
Python 迭代器(Iterators)对象在遵守迭代器协议时需要支持如下两种方法。
__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. 生成器
生成器是更简单的创建迭代器的方法,通过在函数中使用 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
当调用生成器函数时它返回一个生成器对象。如果把这个对象传入 dir() 函数,会在返回的结果中找到 __iter__
和 __next__
等多个方法名。
任何一个生成数据的含有 __iter__
方法的类都可以用作对象生成器。
- 生成器表达式
生成器表达式是列表推导式和生成器的一个高性能,内存使用效率高的推广。
生成器表达式的语法要求其总是直接在在一对括号内,并且不能在两边有逗号。
>>> 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)用来给一些对象动态的添加一些新的行为。
>>> 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):
... #我们的求和函数
... return a + b
...
>>> add(1, 3)
Before call
After call
4
- 闭包
闭包(Closures)是由另外一个函数返回的函数。使用闭包可以去除重复代码。
>>> 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