所谓迭代就是下一次从上一次的状态哪儿开始,既保留函数的运行状态。
在函数内部使用yield关键字就是函数生成器,每次函数执行都是从上次函数的状态开始。
以上为函数的运行结果,每执行一次next函数,函数就会停留在yield处。
使用生成器可以节省内存空间,还可以提高效率。
生成器总结
生成器只能遍历一次。
python中不支持自增以及自减操作
生成器不做任何操作,只是创建一个对象。生成器只能遍历一次。
装饰器:本质就是函数,功能是为其他函数添加附加功能。
原则:不修改被修饰函数的源代码
不修改被修饰函数的调用方式
装饰器的知识储备:
装饰器=高阶函数+函数嵌套+闭包
高阶函数的定义:
1.函数接受的参数是一个函数名
2.函数的返回值是一个函数名
3.满足上述条件中的一个,则该函数为高阶函数。
import time def foo(): time.sleep(3) print("来自foo") #不修改foo的源代码 #不修改foo的调用方式 def timer(fun): s_time=time.time() fun() st_time=time.time() print("函数运行时间%s"%(st_time-s_time)) return fun foo=timer(foo) foo()
函数嵌套:
函数里面包含函数。
def father(name): def son(): name="zhang" print("来自爸爸%s"%name) son() father("linhaifeng")
嵌套的函数只能在函数里面运行,不能在别的地方执行。如上面的son()函数在外面不能运行。
上面函数就是闭包。一定要记得函数即变量。
函数的嵌套作用域很重要,都是先从自己哪儿找,没有就向外找。
函数闭包装饰器实现:
import time def timer(fun): def wrapper(): print(fun) s=time.time() fun() st=time.time() print("函数运行的时间是%s"%(st-s)) return wrapper() @timer #@timer就相当与test=timer(test) def test(): time.sleep(3) print("test函数运行完毕") test()
函数闭包加上返回值
import time def timer(fun): def wrapper(): print(fun) s=time.time() res=fun() print(res) st=time.time() print("函数运行的时间是%s"%(st-s)) return res return wrapper() @timer #@timer就相当与test=timer(test) def test(): time.sleep(3) print("test函数运行完毕") return "这是test函数的返回值" test()
函数闭包补充:解压序列
python中交换两个变量的值有着很简单的方法,如下代码就可以实现,但在别的语言中,需要一个
中间变量进行交换。
f1=1 f2=2 f1,f2=f2,f1 print(f1) print(f2)
l=[1,2,3,4,5,6,7,98,9] a,*_,b=l print(a) print(b)
#取出序列中最前和最后的数字1和9
def au(fun): def wrapper(*args,**kwargs): username=input("用户名".strip()) pwd=input("密码").strip() if username=="sb" and pwd=="123": res=fun(*args,**kwargs) return res else: print("用户名或密码错误") return wrapper() @au def index(name): print("欢迎%s来到京东主页"%name) @au def home(name): print("欢迎%s回家"%name) @au def shopping(name): print("%s的购物车里面有[%s,%s,%s]"%(name,"奶茶","妹妹","娃娃" )) index("张亚萍") home("产品经理") shopping("产品经理")