zoukankan      html  css  js  c++  java
  • python---函数的应用,闭包,装饰器

    # 加载顺序:
    # 内置名称空间 ---> 全局名称空间(程序运行时)---> 局部名称空间(函数执行时)
    # 取值顺序:
    # 局部名称空间(函数执行时)---> 全局名称空间(程序运行时)---> 内置名称空间
    # LEGB
    # 执行顺序:
    # 当代码运行时,从上至下依次执行。
    # 函数的嵌套。
    # global
    # 1,声明一个全局变量。
    # 2,更改一个全局变量。
    # nonlocal
    # 1,不能改变一个全局变量。

    # def funcl(*args , **kwargs):
    # pass
    # funcl()

    # *的魔性用法 #运用场景:累加
    # def funcl (*args,**kwargs):
    # for i in args:
    # print(i)
    # print(args)
    # print(*args)
    # print(kwargs)
    # print(**kwargs)
    # funcl(*[1,2,3], **{'name':'alex'})
    #
    # def funcl():
    # print(666)
    # def func2():
    # funcl()
    # print(333)
    # def inner():
    # print(222)
    # inner()
    # print(111)
    # func2()
    # print(555)
    # 111 666 333 222 555

    # 局部名称空间(函数执行时)---> 全局名称空间(程序运行时)---> 内置名称空间
    # nam='老男孩'
    # def funcl():
    # global name
    # name='alex'
    # funcl()
    # print(name)


    # nam='老男孩'
    # def funcl():
    # global name
    # name='alex'
    # def funcl3():
    # print(name)
    # funcl3()
    # funcl()
    # print(name)

    # def add_b():
    # b=42
    # def do_global():
    # b=10
    # print(b)
    # def dd_nonlocal():
    # nonlocal b
    # b=b+20
    # print(b)
    # dd_nonlocal()
    # print(b)
    # do_global()
    # print(b)
    # add_b()

    #函数名的应用:
    # 1,直接打印函数名得到的是函数的内存地址 <function func1 at 0x0000000002876B70>
    # print(func1)

    #2,函数名可以赋值运算。
    # def func1():
    # print(666)
    # f1 = func1
    # f1()
    # 3, 函数名可以作为函数的参数。

    # def func1():
    # print(666)
    #
    # def func2(x):
    # x()
    # print(555)
    # func2(func1)

    # 4,函数名可以作为容器类数据类型的元素。

    # def func1():
    # print(666)
    #
    # def func2():
    # print(222)
    #
    # def func3():
    # print(111)
    #
    # def func4():
    # print(777)
    # l1 = [func1, func2, func3, func4]
    # for i in l1:
    # i()
    # dic1 = {
    # 1:func1,
    # 2:func2,
    # 3:func3,
    # 4:func4,
    # }
    # dic1[1]()


    # #函数名可以当做函数的返回值
    #
    #
    # def func1():
    # print(666)
    #
    #
    # def func2(x): # x = func1
    # print(222)
    # return x
    # ret = func2(func1)
    # ret()

    #函数闭包

    # 内层函数对外层函数非全局变量的引用就叫闭包
    #判断是不是闭包 函数名.__closure__
    # 返回的None则不是闭包,返回的是cell.... 则是闭包
    # 闭包有什么用?
    #当执行一个函数时,如果解释器判断此函数内部闭包存在,这样
    #Python就一个机制,闭包的所在的临时名称空间不会随着函数的执行完毕而消失。
    # def funcl():
    # name='老男孩'
    # def inner():
    # print(name)
    # inner()
    # print(inner.__closure__) #检测函数是不是闭包(<cell at 0x00000000006F5D68: str object at 0x0000000000E108A0>,)
    # funcl()
    #
    # def funcl():
    # global name
    # name='老男孩'
    # def inner():
    # print(name)
    # inner()
    # print(inner.__closure__)# None 不是闭包
    # funcl()
    #
    # def func1(x):
    # def inner():
    # print(x)
    # inner()
    # print(inner.__closure__)
    #
    # name = '老男孩'
    # func1(name)

    # def func():
    # def func1():
    # name='老男孩'
    # def func2():
    # nonlocal name
    # name='alex'
    # def func3():
    # global name #global name 发给改变的只是全局的变量,函数内部的不受它的影响
    # name='太白'
    # name='日天'
    # func1()
    # print(name)
    # func2()
    # print(name)
    # func3()
    # print(name)
    # func()
    # print(name)
    #
    # from urllib.request import urlopen
    # def index():
    # url='http://www.xiaohua100.cn/index.html'
    # def get():
    # return urlopen(url).read()
    # return get
    # xiaohua = index()
    # content = xiaohua()
    #
    # print(content)
    #
    #
    # def f1():
    # a=0
    # def f2():
    # nonlocal a
    # a += 1
    # return a
    # return f2
    #
    # b=f1()
    # print(b())
    # print(b())
    # print(b())

    #装饰器


    import time
    # '''第一版本,测试函数low'''
    # def login():
    # time.sleep(0.3)
    # print('洗洗更健康')
    # def timmer():
    # start_time=time.time()
    # login()
    # end_time=time.time()
    # print('次函数的执行时间%s' % (end_time-start_time))
    # timmer()


    # def login():
    # time.sleep(0.3)
    # print('洗洗更健康...')
    # login()
    # def register():
    # time.sleep(0.4)
    # print('洗洗更健康222222....')
    # register()
    # def timmer(f):
    # start_time=time.time()
    # f()
    # end_time=time.time()
    # print('此函数的执行时间%s' % (end_time-start_time))
    # timmer(login)
    # timmer(register)

    # # 虽然执行函数的方式已经无限接近于原方式,但是更麻烦了,增加了两步代码。改
    # # def login():
    # # time.sleep(0.3)
    # # print('洗洗更健康...')$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    # # login()
    # #
    # # def timmer(f):
    # # start_time = time.time()
    # # f()
    # # end_time = time.time()
    # # print('此函数的执行时间%s' % (end_time - start_time))
    # #
    # # f1 = login # 将login函数名给了f1
    # # login = timmer # 将timmer函数名给了login
    # login(f1) # timmer(login)$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


    # def login():
    # time.sleep(0.3)
    # print('洗洗更健康...')
    # login()

    # def timmer(f):
    # start_time = time.time()
    # f()
    # end_time = time.time()
    # print('此函数的执行时间%s' % (end_time - start_time))
    #
    # f1 = login # 将login函数名给了f1
    # login = timmer # 将timmer函数名给了login
    # login(f1) # timmer(login)

    #初级装饰器
    # def login():
    # time.sleep(0.3)
    # print('洗洗更健康...')
    # # login()
    # def timmer(f):
    # def inner():
    # start_time=time.time()
    # f()
    # end_time=time.time()
    # print('此函数的执行时间%s' % (end_time-start_time))
    # return inner
    # login=timmer(login)
    # login()

    # 简单版装饰器 语法糖
    # def timmer(f):
    # def inner():
    # start_time=time.time()
    # f()
    # end_time=time.time()
    # print('此函数的执行时间%s' % (end_time-start_time))
    # return inner
    # @timmer
    # def login():
    # time.sleep(0.3)
    # print('洗洗更健康...')
    # login()
    # @timmer
    # def register():
    # time.sleep(0.2)
    # print('洗洗更健康22...')
    # login()


    # def timmer(f): # f = login函数名
    # def inner():
    # start_time = time.time()
    # f() # login()
    # end_time = time.time()
    # print('此函数的执行时间%s' % (end_time - start_time))
    # return inner
    #
    # @timmer # login = timmer(login) # inner 此login是新变量
    # def login():
    # time.sleep(0.3)
    # print('洗洗更健康...')
    # login()
    #
    # @timmer # register = timmer(register)
    # def register():
    # time.sleep(0.2)
    # print('洗洗更健康22...')
    #
    # login() # inner()

    #被装饰的函数带参数的装饰器
    #
    # def timmer(f):
    # def inner(*args,**kwargs):
    # start_time=time.time()
    # f(*args,**kwargs)
    # end_time=time.time()
    # print('此函数的执行时间%s' % (end_time-start_time))
    # return inner
    # @timmer
    # def login(a,b):
    # print(a,b)
    # time.sleep(0.3)
    # print('洗洗更健康...')
    # login(2,3)
    # @timmer
    # def register(a):
    # time.sleep(0.2)
    # print('洗洗更健康22...')
    # register(1)
    # def funcl(x):
    # x=0
    # print(x)
    # funcl(0)

    #函数带返回值的装饰器(万能装饰器)
    def timmer(f):
    def inner(*args,**kwargs):
    start_time=time.time()
    ret=f(*args,**kwargs)
    end_time=time.time()
    print('此函数的执行时间%s' % (end_time-start_time))
    return ret
    return inner
    @timmer
    def login(a,b):
    print(a,b)
    time.sleep(0.3)
    print('洗洗更健康...')
    return 666
    print(login(2,3))

    # def wrapper(f):
    # def inner(*args,**kwargs):
    # '''执行被装饰函数之前的操作'''
    # ret = f(*args,**kwargs)
    # """执行被装饰函数之后的操作"""
    # return ret
    # return inner

    #装饰器功能:在不改变原函数的基础上,为原函数增加一些额外的功能,log,登录注册,等等.








  • 相关阅读:
    四叉树编码存储的实现
    窗体之间传递值的几种方法
    常见的六种排序算法实现
    OracleHelper类
    c#动态加载dll文件
    STL学习系列九:Map和multimap容器
    STL学习系列八:Set和multiset容器
    STL学习系列七:优先级队列priority_queue容器
    STL学习系列六:List容器
    STL学习系列五:Queue容器
  • 原文地址:https://www.cnblogs.com/weilaixiaochaoren/p/9028390.html
Copyright © 2011-2022 走看看