DIG:Decorator(装饰器)、Iterator(迭代器)、Generator(生成器)
老师说这是真正掌握python的关键,所以有必要清楚的整理一下笔记。
#迭代器是个Object,写迭代器时,写的是Class
内建函数:iter()
函数作用:把“可迭代对象”(Iterable)装换成“迭代器”(Iterator)
注:python中的容器都是可迭代的(可以通过遍历迭代每一个元素):
string = "this is a string."
list = ['item 1', 'item 2', 3, 5]
set = (1, 2, 3, 4, 5)
for c in string:
print(c, end=', ')
print()
for L in list:
print(L, end=', ')
print()
for s in set:
print(s, end=', ')
print()
转换为迭代器:
i = iter('Python')
s = iter((1, 2, 3, 4))
L = iter(['item 1', 'item 2', 3, 5])
使用next()函数:
i = iter("Python")
next(i)
next(i)
next(i)
next(i)
next(i)
next(i)
#next(i) 前面已经到 'n' 了,再调用就会有 StopIteration 错误提示。
自己写一个迭代器(计数的例子):
class Counter(object):
def __init__(self,start, stop):
self.current = start
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.current > self.stop
raise StopIteration
else:
c = self.current
self.current += 1
return c
以上代码中,重点在于两个函数的存在,__iter__(self)
和 __next__(self),
这两句是约定俗成的写法,写上它们,Counter
这个类就被会被识别为 Iterator 类型。而后再有 __next__(self)
的话,它就是个完整的迭代器了。
生成器表达式:
生成器表达式必须在括号内使用,even
就是用生成器创造的迭代器(Iterator),若是用了方括号,那就是用生成器创造的列表(List)—— 当然用花括号 {}
生成的就是集合(Set)
even = (e for e in range(10) if not e % 2) #generator=生成器
# odd = (o for o in range(10) if o % 2)
print(even)
for e in even:
print(e)
知识点:"yield"语句和return语句最大的不同在于“yield”之后的语句依然会被执行——而return后面的语句会直接被忽略。
示例(计数例子):
def counter(start, stop):
while start <= stop:
yield start
start += 1
for i in counter(101, 105):
print(i)
操作符:@
代码示例:
def a_decorator(func):
def wrapper():
print('We can do sth. before calling a_func...')
func()
print('... and we can do sth. after it was called...')
return wrapper
@a_decorator
def a_func():
print("Hi, I'm a_func!")
a_func()
函数本身也是对象(即,Python 定义的某个 Class 的一个 Instance)。
Decorator 最常用的场景是什么呢?最常用的场景就是用来改变其它函数的行为。