Python3 学习笔记-迭代器、生成器、装饰器

迭代器

Python 迭代器对象在遵守迭代器协议时,需要支持如下两个方法。
iter(),返回迭代器对象自身。 这用在for 和 in语句中。
next(), 返回迭代器的下一个值。如果没有下一个值可以返回,那么应该抛出StopIteration异常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

class Counter(object):
def __init__(self,low,high):
self.current = low
self.high = high
def __iter__(self):
return self
def __next__(self):
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)

print('--------------')

d = Counter(5,8)
print(next(d))
print(next(d))
print(next(d))
print(next(d))

生成器

生成器是更简单创建迭代器的方法,通过在函数中使用yield关键字完成

1
2
3
4
5
6
7
def my_generator():
yield "a"
yield "b"
yield "c"

for item in my_generator():
print(item)

另外一个例子

1
2
3
4
5
6
7
def counter_generator(low,high):
while low <= high:
yield low
low += 1

for i in counter_generator(5,10):
print(i)
  1. 在While循环中,每当执行到yield语句时,返回值low的值,并且生成器状态转为挂起。在下一次调用生成器时,生成器从之前挂起的地方回复执行,然后变量low的值继续执行。
  2. 生成器对象,本身存在iternext两个方法
  3. 生成器进行惰性求值,使用生成器时处理大数据的好方法。不需要再内存中加载所有数据,一次只传递一部分数据。
  4. 生成器是不可以重复使用的,一定不能重复循环的

闭包

闭包是由另外一个函数返回的函数。

1
2
3
4
5
6
7
def add_num(num):
def adder(number):
return num+number
return adder

fun = add_num(10)
print(fun(4))

装饰器

用来给一些对象动态的添加一些新的行为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def my_decorator(func):
def wrapper(*args,**kwargs):
print("before ....")
result = func(*args,**kwargs)
print(result)
print("after ....")
return result
return wrapper


@my_decorator
def add(a,b):
return a+b


add(1,3)