装饰器初始

主要内容:

  1,函数名的运用,第一类对象

  2,闭包

  3,装饰器初始

 

一,函数名的运用.

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

1.函数名的内存地址

def func():
    print('呵呵呵')
print(func)
# 结果:
# <function func at 0x0000026B135B1F28>

 2,函数名可以赋值得=给其他变量

def func():
    print('hehe')
print(func)
a = func # 把函数当成一个变量赋值给另一个变量
a()  # 函数调用 func()

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

def func1():
    print('呵呵')

def func2():
    print('hehe')

def func3():
    print('haha')

def func4():
    print('哈哈')

lst = [func1, func2, func3, func4]
for i in lst:
    i()

 4,函数名可以当作函数的参数

def func():
    print('吃了吗')
    
def func2(fn):
    print('我是func2')
    fn()  # 执行传递过来的fn
    print('我是func2')
    
func2(func)  # 把函数func当成参数传递给func2的参数fn

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

   可以使用__closure__来检测函数是否是闭包,使用函数名.__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():
    def func2():
        def func3():
            print('嘿嘿')
        return func3
    return func2 

func1()()()

   由于我们可以引出闭包的好处.由于我们在外界可以访问内部函数.那这个时候内部函数访问的时间和时机就不一定了,因为再外部,我可以选择在任意的时间去访问内部函数.这个时候,想一想.我们之前说过,如果一个函数执行完毕,则这个函数中的变量以及局部命名空间中的内容都将会被销毁.在闭包中.如果变量被销毁了.那内部函数将不能正常执行.所以,python规定.古国你在内部函数中访问了外层函数中的变量.那么这个变量将不会消亡.将会常驻再内存中.也就是说,使用闭包.可以保证外层函数中的变量再内存中常驻.这样做有什么好处呢.看着一段爬虫代码

from urllib.request import urlopen

def but():
    content = urlopen('http://www.xiaohua100.cn/index/html').read()
    def get_content():
        return content
    return get_content

fn = but()  # 这个时候就开始加载校花100的内容了
# 后面需要用到这里面的内容既不需要再执行非常消耗时间的网络连接
content = fn()
print(content)

content2 = fn()
print(content2)

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

三,装饰器初始

软件设计的原则,开闭原则,又称为开放封闭原则.

直接怼最终装饰器代码:

def wrapper(func):
    def inner(*args, **kwargs):
        '''在执行目标函数之前要执行的内容'''
        ret = func(*args, **kwargs)
        '''在执行目标函数之后要执行的内容'''
        return ret
    return inner

# @wrapper 相当于 target_func = wrapper(target_func) 语法糖
@wrapper
def target_func():
    print('我是目标函数')
    
# 调用目标函数
target_func()

 

posted @ 2018-06-14 18:55  猴里吧唧  阅读(106)  评论(0)    收藏  举报