zoukankan      html  css  js  c++  java
  • 生成器

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

    在函数内部使用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("产品经理")
  • 相关阅读:
    单行道
    学习C++50条忠告
    ROI
    OpenCV(图像处理)—访问像素的三种方法
    毕业课题项目——基于单目摄像头的距离测量
    API
    MFC
    STL
    debug、release
    Android中退出程序的提示框
  • 原文地址:https://www.cnblogs.com/zypfzw/p/9101304.html
Copyright © 2011-2022 走看看