1、Python的装饰器
简单的说,Python的装饰器就是用于拓展原来函数功能的一种函数,可以在不用更改原函数的代码前提下给函数增加新的功能。
import time
def deco01(func):
def wrapper(*args, **kwargs):
print("this is deco01")
startTime = time.time()
func(*args, **kwargs)
endTime = time.time()
msecs = (endTime - startTime)*1000
print("time is %d ms" %msecs)
print("deco01 end here")
return wrapper
def deco02(func):
def wrapper(*args, **kwargs):
print("this is deco02")
func(*args, **kwargs)
print("deco02 end here")
return wrapper
@deco01
@deco02
def func(a,b):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b))
if __name__ == '__main__':
f = func
f(3,4)
#func()
'''
this is deco01
this is deco02
hello,here is a func for add :
result is 7
deco02 end here
time is 1003 ms
deco01 end here
'''
2、迭代器
容器是一种把多个元素组织在一起的数据结构,容器中的元素可以迭代获取。
凡是可以返回一个迭代器的对象都可以称之为可迭代对象。
迭代器是一个带状态的对象,能在调用next() 的时候返回容器中的下一个值,任何实现了__iter__和__next__()的方法的对象都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下一个值。
>>> from itertools import count
>>> counter = count(start=13)
>>> next(counter)
13
>>> next(counter)
14
class Fib:
def __init__(self):
self.prev = 0
self.curr = 1
def __iter__(self):
return self
def __next__(self):
value = self.curr
self.curr += self.prev
self.prev = value
return value
>>> f = Fib()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
3、生成器
生成器是一种特殊的迭代器,可以用更少的中间变量写流失代码。生成器的返回值不是通过return
而是用yield
。
包含yield语句的函数都被称为生成器。这可不仅仅是名称上的差别,生成器的行为与普通函数截然不同。差别在于,生成器不是使用return返回一个值,而是可以生成多个值,每次一个。每次使用yield生成一个值后,函数都将冻结,即在此停止执行,等待被重新唤醒。被重新唤醒后,函数将从停止的地方开始继续执行。
def something():
result = []
for ... in ...:
result.append(x)
return result
可以用生成器函数来代替:
def iter_something():
for ... in ...:
yield x
生成器表达式:
生成器表达式是列表推倒式的生成器版本,看起来像列表推导式,但是它返回的是一个生成器对象而不是列表对象。不同于列表推导,这里使用的是圆括号。
生成器是包含关键字yield的函数,但被调用时不会执行函数体内的代码,而是返回一个迭代器。
换而言之,生成器由两个单独的部分组成:生成器的函数和生成器的迭代器。生成器的函数是由def语句定义的,其中包含yield。生成器的迭代器是这个函数返回的结果。用不太准确的话说,这两个实体通常被视为一个,通称为生成器。
>>> a = (x*x for x in range(10))
>>> a
<generator object <genexpr> at 0x401f08>
>>> sum(a)
285