python全栈开发11 基础学习之第十一天(装饰器初始)

基础学习之第十一天(装饰器初始)

 

主要内容:
  1.函数名的运用,第一类对象

  2.闭包

  3.装饰器的初始

一.函数名的运用

函数名是一个变量,但是一个特殊的变量,与括号配合可以执行函数的变量

  1.函数的内存地址

def fun():
    print('呵呵')
print(fun) # 返回这个函数的内存地址

  2.函数名可以赋值给其他的变量

def fun():
    print('呵呵')
print(fun)
a = fun
a()

  3.函数名可以当作容器类元素

复制代码
def func1():
    print('呵呵')
def func2():
    print('哈哈')
def func3():
    print('拉拉')
def func4():
    print('可可')
def func5():
    print('哦哦')
lst = [func1,func2,func3,func4,func5]
for i in lst:
    i()
复制代码

  4.函数名可当做函数的参数

复制代码
def func():
    print('吃了么')
def func2(fn):
    print('我是func2')
    fn()
    print('我是func2')
func2(func)
复制代码

  5.函数名可以作为函数的返回值

复制代码
def func_1():
    print('这里是函数1')
    def func_2():
        print('这是函数2')
    print('这是函数1')
    return func_2
fn = func_1()
fn()
复制代码

二.闭包

  什么是闭包?闭包就好是内层函数,对外层函数(非全局)的变量的引用,叫闭包

def func1():
    name = 'alex'
    def func2():
        print(name)
    func2()
func1()

  我们可以用_closure_来检测函数是否是闭包,如果是闭包就返回:cell,不是闭包就返回None

复制代码
def func1():
    name = 'alex'
    def func2():
        print(name)
    func2()
    print(func2.__closure__)
func1()
复制代码

  如何在函数外边调用内部函数

复制代码
def outer():
    name= "alex"
    def inner():
        print(name)
    return inner
fn = outer()
fn() # 访问内部函数
复制代码

  多层嵌套如何办

复制代码
def func1():
    name = 'alex'
    def func2():
        def func3():
            def func4():
                print(name)
            return func4
        return func3
    return func2
func1()()()()
复制代码

  闭包的作用就是一个变量能够常驻内存,供后面的程序使用

三.装饰器初始

  软件设计的原则:开闭原则,又被称为开放封闭原则,你的代码对功能的扩展是开放的,你的程序对修改源代码是封闭的,这样的软件设计思路可以更好的维护和开发

  开放:对功能扩展开放

  封闭:对修改代码封闭

复制代码
def create_people():
    print('女娲很厉害,还会捏人呢')
def warter(fn):
    def inner():
        print('先取水')
        fn()
        print('最后在上烤炉')
    return inner
create_people= warter(create_people)
create_people() # 这个create_people其实相当于inner
复制代码

  我们使用warter函数把create_people给包装一下,在不修改create_people的前提下,完成了对create_people的函数的功能添加

  语法糖:@装饰器

  1.最基本的

复制代码
def wen_jin(fn):
    def inner():
        print('执行函数之前')
        fn()
        print('执行之后')
    return inner
@wen_jin # 这个就相当于yue = wen_jin(yue) #也就是个inner
def yue():
    print('大家好')
yue()
复制代码

  2.中级

复制代码
# 最基本的参数传递
def wen_jin(fn):
    def inner(name):
        print('函数执行之前')
        fn(name)
        print('函数执行之后')
    return inner
@wen_jin
def yue(name):
    print('呵呵了',name)
yue('熬啊')
复制代码

  3.最终(也是最基本的装饰器格式)

复制代码
# 带参数了,还需要返回值
def wrapper(func):
    def inner(*args,**kwargs):#聚参
        print('函数之前要执行的内容')
        ret = func(*args,*kwargs) # 解参
        print('函数之后要执行的内容')
        return ret    #返回这个函数的返回值
    return inner
@wrapper
def target_func(a,b,c,d):
    print('函数执行中%s'%a,b,c,d)
    return

target_func(1,3,6,2)
复制代码

主要内容:
  1.函数名的运用,第一类对象

  2.闭包

  3.装饰器的初始

一.函数名的运用

函数名是一个变量,但是一个特殊的变量,与括号配合可以执行函数的变量

  1.函数的内存地址

def fun():
    print('呵呵')
print(fun) # 返回这个函数的内存地址

  2.函数名可以赋值给其他的变量

def fun():
    print('呵呵')
print(fun)
a = fun
a()

  3.函数名可以当作容器类元素

复制代码
def func1():
    print('呵呵')
def func2():
    print('哈哈')
def func3():
    print('拉拉')
def func4():
    print('可可')
def func5():
    print('哦哦')
lst = [func1,func2,func3,func4,func5]
for i in lst:
    i()
复制代码

  4.函数名可当做函数的参数

复制代码
def func():
    print('吃了么')
def func2(fn):
    print('我是func2')
    fn()
    print('我是func2')
func2(func)
复制代码

  5.函数名可以作为函数的返回值

复制代码
def func_1():
    print('这里是函数1')
    def func_2():
        print('这是函数2')
    print('这是函数1')
    return func_2
fn = func_1()
fn()
复制代码

二.闭包

  什么是闭包?闭包就好是内层函数,对外层函数(非全局)的变量的引用,叫闭包

def func1():
    name = 'alex'
    def func2():
        print(name)
    func2()
func1()

  我们可以用_closure_来检测函数是否是闭包,如果是闭包就返回:cell,不是闭包就返回None

复制代码
def func1():
    name = 'alex'
    def func2():
        print(name)
    func2()
    print(func2.__closure__)
func1()
复制代码

  如何在函数外边调用内部函数

复制代码
def outer():
    name= "alex"
    def inner():
        print(name)
    return inner
fn = outer()
fn() # 访问内部函数
复制代码

  多层嵌套如何办

复制代码
def func1():
    name = 'alex'
    def func2():
        def func3():
            def func4():
                print(name)
            return func4
        return func3
    return func2
func1()()()()
复制代码

  闭包的作用就是一个变量能够常驻内存,供后面的程序使用

三.装饰器初始

  软件设计的原则:开闭原则,又被称为开放封闭原则,你的代码对功能的扩展是开放的,你的程序对修改源代码是封闭的,这样的软件设计思路可以更好的维护和开发

  开放:对功能扩展开放

  封闭:对修改代码封闭

复制代码
def create_people():
    print('女娲很厉害,还会捏人呢')
def warter(fn):
    def inner():
        print('先取水')
        fn()
        print('最后在上烤炉')
    return inner
create_people= warter(create_people)
create_people() # 这个create_people其实相当于inner
复制代码

  我们使用warter函数把create_people给包装一下,在不修改create_people的前提下,完成了对create_people的函数的功能添加

  语法糖:@装饰器

  1.最基本的

复制代码
def wen_jin(fn):
    def inner():
        print('执行函数之前')
        fn()
        print('执行之后')
    return inner
@wen_jin # 这个就相当于yue = wen_jin(yue) #也就是个inner
def yue():
    print('大家好')
yue()
复制代码

  2.中级

复制代码
# 最基本的参数传递
def wen_jin(fn):
    def inner(name):
        print('函数执行之前')
        fn(name)
        print('函数执行之后')
    return inner
@wen_jin
def yue(name):
    print('呵呵了',name)
yue('熬啊')
复制代码

  3.最终(也是最基本的装饰器格式)

复制代码
# 带参数了,还需要返回值
def wrapper(func):
    def inner(*args,**kwargs):#聚参
        print('函数之前要执行的内容')
        ret = func(*args,*kwargs) # 解参
        print('函数之后要执行的内容')
        return ret    #返回这个函数的返回值
    return inner
@wrapper
def target_func(a,b,c,d):
    print('函数执行中%s'%a,b,c,d)
    return

target_func(1,3,6,2)
复制代码

猜你喜欢

转载自www.cnblogs.com/123zzy/p/9185138.html
今日推荐