所谓迭代就是下一次从上一次的状态哪儿开始,既保留函数的运行状态。

在函数内部使用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("产品经理")