zoukankan      html  css  js  c++  java
  • python 11days

    python 11days

    一:函数名的应用(第一对象)

    1,直接打印函数名得到的是函数的内存地址 <function func1 at 0x0000000002876B70>

    print(func1)

    def func1():
        print(666)
    
    结果:   空
    函数名的应用

     2,函数名可以赋值运算

    def func1():
        print(666)
    f1 = func1
    f1()
    结果: 666
    函数名可以赋值运

     3,函数名可以作为函数的参数

    1 def func1():
    2     print(666)
    3 def func2(x):
    4     x()
    5     print(555)
    6 func2(func1)
    7 
    8 结果:666 
    9          555
    View Code

    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]()
    结果:  666
           222
           111
           777
           666
    View Code

    5,函数名可以当做函数的返回值

    def func1():
        print(666)
    def func2(x):  # x = func1
        print(222)
        return x
    ret = func2(func1)
    ret()
    
    结果:  222
           666
    View Code

    二:闭包

    内层函数对外层函数非全局变量的引用就叫闭包

    判断是不是闭包 函数名.__closure__

    返回的None则不是闭包,返回的是cell.... 则是闭包

    闭包有什么用?

    当执行一个函数时,如果解释器判断此函数内部闭包存在,这样

    Python就一个机制,闭包的所在的临时名称空间不会随着函数的执行完毕而消失。

    def func1():
        name = '老男孩'
        def inner():
            print(name)
        inner()
        print(inner.__closure__)  # <cell at 0x000000000282A768: str object at 0x0000000002856E10>
    func1()
    
    结果:老男孩
         (<cell at 0x000002DF3B996498: str object at 0x000002DF3B972630>,)       (cecc)是闭包
    View Code
    def func1():
        global name
        name = '老男孩'
    
        def inner():
            print(name)
    
        inner()
        print(inner.__closure__)  # None
    func1()
    
    结果:    老男孩
             None
    View Code
    def func1(x):
        def inner():
            print(x)
        inner()
        print(inner.__closure__)
    
    name = '老男孩'
    func1(name)
    
    结果:   老男孩
            (<cell at 0x0000011E14226498: str object at 0x0000011E14202630>,)   闭包
    View Code
    def func():
        def func1():
            name ="老男孩"
        def func2():
            nonlocal name
            name = "alex"
        def func3():
            global name
            name = "太白"
        name = "日天"
    
        func1()
        print(name)  # 1 日天
        func2()
        print(name)  # 2,alex
        func3()
        print(name)  # 3,alex
    func()
    print(name)  # 4,太白
    
    结果:   日天
            alex
            alex
            太白
    View Code

     三:装饰器

    1,这个版本不太好

    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()
      
    结果:  洗洗更健康...
           此函数的执行时间0.30033349990844727
    View Code

    2,改变了我原来执行函数的执行方式,不好

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

    3,虽然执行函数的方式已经无限接近于原方式,但是更麻烦了,增加了两步代码,还是需要改进。

    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)
    
    结果:
          洗洗更健康...
          此函数的执行时间0.30034470558166504
    View Code

    4,初级装饰器

    def login():
        time.sleep(0.3)
        print('洗洗更健康...')
    # 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
    
    login = timmer(login)  # inner 此login是新变量
    login()  # inner()
    
    name = 'alex'
    name = '老男孩'
    
    结果:    洗洗更健康...
             此函数的执行时间0.30029988288879395
    View Code

    5,简单版装饰器:语法糖

    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()
    
    结果:    洗洗更健康...
             此函数的执行时间0.3002970218658447
             洗洗更健康...
             此函数的执行时间0.30034828186035156
    View Code

    6,被装饰器的函数带参数的装饰器

    def timmer(f):  # f = login函数名
        def inner(*args,**kwargs):  # args (2, 3)
            start_time = time.time()
            f(*args,**kwargs)  # login() *(2, 3) 2,3
            end_time = time.time()
            print('此函数的执行时间%s' % (end_time - start_time))
        return inner
    
    @timmer  # login = timmer(login)  # inner 此login是新变量
    def login(a,b):
        print(a,b)
        time.sleep(0.3)
        print('洗洗更健康...')
    
    login(2,3)  # inner(2,3)
    
    @timmer  # register = timmer(register)
    def register(a):
        time.sleep(0.2)
        print('洗洗更健康22...')
    
    register(1)  # inner(1)
    
    结果:   2 3
           洗洗更健康...
           此函数的执行时间0.30082106590270996
           洗洗更健康22...
           此函数的执行时间0.20047879219055176
    View Code

    7,举个列子:

    def func1(x):
        x = 0
        print(x)
    func1(0)
    
    结果:  0
    View Code

    8,函数带返回值的装饰器(万能装饰器)

    def timmer(f):  # f = login函数名
        def inner(*args,**kwargs):  # args (2, 3)
            start_time = time.time()
            ret = f(*args,**kwargs)  # login() *(2, 3) 2,3
            end_time = time.time()
            print('此函数的执行时间%s' % (end_time - start_time))
            return ret
        return inner
    
    @timmer  # login = timmer(login)  # inner 此login是新变量
    def login(a,b):
        print(a,b)
        time.sleep(0.3)
        print('洗洗更健康...')
        return 666
    
    print(login(2,3))  # inner(2,3)
    
    结果:  
           2 3
          洗洗更健康...
          此函数的执行时间0.30029869079589844
          666
    View Code

    知识点击:

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

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

     

  • 相关阅读:
    Xcode8 1 创建coreData的ManagedObject后,报错 linker command failed with exit code 1
    在IOS中根据圆心坐标、半径和角度计算圆弧上的点坐标
    NodeJS学习目录
    nodeJS之URL
    nodeJS之域名DNS
    初识nodeJS
    使用nodeJS实现前端项目自动化之项目构建和文件合并
    nodeJS之fs文件系统
    nodeJS之二进制buffer对象
    nodeJS之进程process对象
  • 原文地址:https://www.cnblogs.com/juxiansheng/p/9025333.html
Copyright © 2011-2022 走看看