• python装饰器,闭包函数


    1. 闭包函数:在函数A内部定义另外一个函数B,之后B作为A的返回值直接被返回。此时函数B称为A的闭包函数。在闭包函数B中如果使用A函数中定义的变量,此时A函数中被定义的变量会被临时存储,直到B函数调用结束时该变量才会被系统收回,从而实现A中变量延迟释放
    例如
    def put(num):
        print(num)
        def wrapper():
            nonlocal  num
            num +=20
            print(num)
        return wrapper
    fun = put(0)
    fun()

    此函数运行过程为:先依次从上往下运行,直到fun = put(0)语句,该语句为调用函数put,则执行函数put,输出结果为0,fun = wrapper,返回一个函数给fun,然而没有调用。当继续执行程序fun()时,程序运行的为wrapper函数,因为上面已经的num已经有值(nonlocal为不是本地变量的意思),所以函数会输出20

    1. global:声明的变量属于全局变量,此时在使用该变量时,计算机直接到函数的最外层寻找该变量是否存在
    2. nonlocal:声明变量属于非本地变量,此时计算机不会在当前变量使用的函数中寻找该变量,而是到该函数的外层寻找离该函数比较近的对应变量进行声明
    3. 装饰器:通过@语法直接使用定义好的函数修饰之前已经存在的函数,从而实现对原函数功能的扩充

    优点:不需要修改原代码,即可实现对原函数功能的扩充;利于后期代码的维护

    **(装饰器本质上是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器也是一个函数对象。他经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用)

    import time
    import functools
    def log_time(fun):
        @functools.wraps(fun)
        def jj(*args1,**kb):
            print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
            return fun(*args1,**kb)
        return jj
    @log_time # now = log_time(now)
    def now(*a):
        print(a)
    now(19,20)
    #定义一个自带参数的装饰器
    def  log(txt):
        def de(fun):
            @functools.wraps(fun)
            def wrapper(*m,**km):
                print(txt,end = '')
                print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
                return fun(*m,**km)
            return wrapper
        return de
    @log('对应时间是:')#等价于max_num = log('对应时间是:')fun(max_num)
    def max_num(num1,num2):
        print(max(num1,num2))
    max_num(2,43)
    1. 获取绝对值:print(abs(-4))

    列表遍历:

    def callBack(num):
    num **= 2
    return num
    list1 = [x for x in range(10)]
    result = map(callBack,list1)
    print(list(result))#map(fun,list):map用来对列表list的遍历操作,每一次遍历都会自动调用fun函数完成对本次遍历所得到的元素的计算,当遍历结束后返回一个map对象

    6.列表过滤:

    list2 = [1,3,4,54,5,4,3,35,"sdf","dsf"]
    li = filter(lambda x:isinstance(x,int),list2)
    print(list(li))#列表过滤:filter(fun,list)用来遍历列表list,按照给定的过滤条件,完成对满足条件的数据保存,不满足条件的进行过滤(删除)的操作。其中fun是回调函数,充当过滤的条件

    7.#偏函数

    import functools
    int2 = functools.partial(int,base = 2)#将指定的函数和函数中默认值的参数进行绑定,生成一个新的函数,比如吧int函数和int的默认参数base绑定生成一个新函数int2,int2此时进行数据转换时按二进制进行转换

    result = int2("10101000010100")
    print(result)
  • 相关阅读:
    nginx 启动报错 “/var/run/nginx/nginx.pid" failed” 解决方法
    FastDFS+Nginx搭建Java分布式文件系统
    如何优雅使用Sublime Text3(Sublime设置豆沙绿背景色和自定义主题)
    HTTP请求/响应报文结构
    自学编程你得先看看这篇,你能收获很多
    年薪50W京东软件测试工程师的成长路——我们都曾一样迷茫
    学会Python除了不能生孩子,其他的都能做。
    面试题千变万化,为什么总是会问MySQL?
    要做有灵魂的程序员!!
    软件测试基础自学之测试基础理论,先看完这篇你再做测试
  • 原文地址:https://www.cnblogs.com/rose1jj/p/9374810.html
Copyright © 2020-2023  润新知