Python装饰器迭代器生成器
Python中的装饰器本质是是一个函数,它可以装饰其他函数为其他函数添加附加功能。使用装饰器的原则是不能修改被装饰函数的源代码,不能修改被装饰函数的调用方式。
一个装饰器它是由高阶函数加上嵌套函数组成的。 高阶函数+嵌套函数=装饰器。
高阶函数的定义是把一个函数名当做一个实参传给另一个函数。高阶函数可以再不修改源代码的情况下为其添加功能。返回值中包含函数名是可以不修改函数的调用方式
嵌套函数是在一个函数中用def定义一个函数。
def deco(func):
star_time = time.time()
func()
stop_time = time.time()
print('the func run time is %s'%(stop_time-star_time))
这是一个高阶函数
def timer(func): #timer(test) func = timer
def deco(*args,**kwargs):
star_time = time.time()
func(*args,**kwargs) #run test
stop_time =time.time()
print('the func run time is %s'%(stop_time-star_time))
return deco()
这就是一个装饰器
@timer #test = timer(test)
def test():
time.sleep(3)
@timer
def test1(name,age)
print('test1',name,age)
test1('zhang',23)
print('in the test')
test()
当调用一个传参数的装饰器时:
def auth(authtype):
def out_wrapper(func):
def wrapper(*args,**kwargs):
if authtype = 'local'
username = input('username')
password = input('password')
if user ==username and passw == password:
print('success')
else:
exit('invadile')
else:
print('其他')
reture wrapper
return out_wrapper
@auth(authtupe == 'local')
def test():
pirnt('local')
@auth(authtype = 'ldal')
def test():
print('in the bbs')
-------------生成器------
生成器就是一种迭代器,拥有next方法并且与迭代器完全相同,也可以用于python中for循环中。
def get_0_1_2():
yield 0
yield 1
yield 2
定义一个函数get_0_1_2但是这个函数内部使用关键字yield,是这个函数变成一个生成器。get_0_1_2 打印返回是一个内存地址。
生成器调用只能使用next方法进行,当遇见yield时暂停执行,并将yield的参数作为此次next方法的返回值。
之后每次在调用生成器的next的方法,生成器从上次暂停的位置恢复生成器,到再遇见yield时停止,并返回yield的参数。
如果当next方法调用时生成器函数结束,这次next方法会抛出StopIteration异常。
------迭代器------
可直接作用于for循环的数据类型:一类是集合数据类型,list,tuple,dict,set,str等;
一类是generator,包括生成器和带yield的generator function
可以用for循环的对象叫迭代对象 iterable
可以用next()函数调用并不断返回下一个值的对象称为迭代器对象 iterator
iter()可将迭代对象变成迭代器对像
可以用isinstance()判断一个对象是不是iterable对象。(在头文件导入from collections import Iterable)