python全栈__函数名的应用、闭包、装饰器

0、动态传参内容补充: 

  0、1 单纯运行如下函数不会报错。 

def func1(*args,**kwargs):
    pass
func1()

 

  0、2 *的魔性用法

  * 在函数定义的时候,代表聚合。

  *在函数的执行的时候,代表打散。

def func1(*args,**kwargs):
    print(args)  #(1, 2, 3)
func1(*[1,2,3])

 

  *在函数的执行的时候,代表打散。

def func1(*args,**kwargs):
    print(*args)    # print(*(1,2,3))
func1(*[1,2,3])

 

def func1(*args,**kwargs):
    print(kwargs)  # {'name':'alex'}
func1(*[1,2,3], **{'name':'alex'})

 

   print()函数无法接收动态参数,所以当print(**kwargs)时就会报错。

def func1( **kwargs):
    print(**kwargs)
func1(**{'name':'alex'})

 

  

def func1():          1
    print(666)         6


def func2():          2
    func1()           5
    print(333)         7

    def inner():       8
        print(222)      10
    inner()          9


print(111)          3
func2()            4
print(555)          11

  

  0、3 取值顺序:

     局部名称空间(函数执行时) -----> 全局名称空间(程序运行时) -----> 内置名称空间

  0、4 加载顺序:

    内置名称空间 -----> 全局名称空间(程序运行时) -----> 局部名称空间(函数执行时)

  0、5 执行顺序:

    当代码运行时,从上至下依次执行。

name = '老男孩'


def func1():
    global name
    name = 'alex'


func1()
print(name)

 

  0、6global:

    1、声明一个全局变量;

    2、更改一个全局变量。

  0、7nonlocal:

    1、不能改变一个全局变量;

    2、在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

def add_b():
    b = 42
    
    def do_global():

        b = 10        
        print(b)                    #  b = 10

        def dd_nonlocal():

            nonlocal b             
            b = b + 20              
            print(b)                # b = 30
        dd_nonlocal()
        print(b)                    # b = 30
    do_global()
    print(b)                        # b = 42
    
    
add_b()

 

  

1、函数名的应用

  第一类对象。

   1、直接打印函数名得到的是函数的内存地址。

def func1():
    print(666)
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()

 

def func1():
    print(666)


def func2():
    print(222)


def func3():
    print(111)


def func4():
    print(777)


dic1 = {
    1: func1,
    2: func2,
    3: func3,
    4: func4,
}
dic1[1]()

 

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

def func1():
    print(666)


def func2(x):
    print(222)
    return x


ret = func2(func1)
ret()

 

2、闭包

   1、内层函数对外层函数的非全局引用就叫闭包。

  2、判断是不是闭包,函数名:__closure__ 

   返回的None则就不是闭包;返回的是cell......这就是闭包。 

def func1():
    name = '老男孩'

    def inner():
        print(name)
    inner()
    print(inner.__closure__)


func1()

 

  

  global声明了一个全局变量,此时name为全局变量,所以就不时闭包。

def func1():
    global name     # 声明全局变量name
    name = '老男孩'

    def inner():
        print(name)

    inner()
    print(inner.__closure__)
    

func1()

 

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    # 声明一个全局变量
        name = "太白"
    name = "日天"

    func1()
    print(name)
    func2()
    print(name)
    func3()
    print(name)


func()
print(name)

 

  3、闭包的作用:

    当执行一个函数时,如果解释器判断此函数内部闭包存在,这样Python就存在一个机制,闭包所在的临时名称空间不会随着函数的执行完毕而消失。

from urllib.request import urlopen


def index():
    url = "https://user.qzone.qq.com/569894146/infocenter"

    def get():
        return urlopen(url).read()
    return get


kongjian = index()
content = kongjian()

print(content)
闭包爬虫应用结果

3、装饰器

  3、1 第一版本,测试函数low

import time


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()

 

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

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


def register():
    time.sleep(0.4)
    print('洗洗更健康22222...')


def timmer(f):
    start_time = time.time()
    f()
    end_time = time.time()
    print('此函数的执行时间%s' % (end_time - start_time))


timmer(login)
timmer(register)

 

  3、3 初级装饰器

初级装饰器

  3、4 简单版装饰器 语法糖

简单版装饰器 语法糖

  3、5 被装饰的函数带参数的装饰器

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

  3、6函数带返回值的装饰器(万能装饰器)

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

  3、7 装饰器模板

装饰器模板

  3、8 装饰器的作用:

    在不改变原函数的基础场,为原函数增加一些功能,log、登录注册等。

猜你喜欢

转载自www.cnblogs.com/ZN-225/p/9587924.html