day11-闭包函数和装饰器

目录:

闭包函数

装饰器

 

什么是闭包函数?

闭,封闭,把一个函数封闭在另一个函数里面起来,就是定义在函数内部的函数

包,将它整体打包,同时引用外部函数作用域的名字,方便接下里使用

x = 56


def outer():
    y = 78

    def inner():
        print(x, y)

    return inner

# 只要是调用了外部函数y的名称空间就被称之为闭包函数,如果他同时还调用了全局x名称空间,不受影响,但如果只是调用全局x,就不能称之为闭包

 

 

def outter():
    x=2345

    def inner():
        print(x)

    return inner
res = outter()  # res 就是inner函数的地址

函数在定义阶段名字的查找顺序就已经固定死了,不会因为函数调用位置的变化而改变!!!

 

给函数体传值有两种方式(******):

1. 直接传参

def f(password)
    print(password)

 

import requests

# 第一个直接给函数传参
url1 = 'http://www.xiaohuar.com'

def my_get(url):
    response = requests.get(url)
    if response.status_code == 200:
        print(len(response.text))

my_get(url1)
my_get('http://www.xiaohuar.com')

 

二、闭包

 

装饰器函数,闭包

def outter(name):
    name = 'Ryan'
        def inner():
            print(name)
        return inner

 

 

def outer(func):  # 定义一个外部函数
    def inner(*args, **kwargs):  # 定义一个内部函数(装饰好的函数)
        print('执行被装饰函数之前 你可以做的操作')  # 装饰
        res = func(*args, **kwargs)  # 需要被装饰的函数(需要传参)
        print('执行被装饰函数之后 你可以做的操作')  # 装饰
        return res  # 返回原函数的地址,方便以后调用

    return inner  # 返回被装饰好的函数的地址,方便以后调用

小爬虫

#爬虫的本质就是爬取页面的html代码,从中获取到你想要的数据(url链接地址),有了链接之后,
你就可以顺着这个链接将所有的页面资源全部爬取下来,requests模块

def outter(url):
    # url = 'https://www.jd.com'
    def my_get():
        response = requests.get(url)
        if response.status_code == 200:
            print(len(response.text))
    return my_get
my_jd = outter('https://www.jd.com')
my_jd()
my_jd()
my_baidu = outter('https://www.baidu.com')
my_baidu()
my_baidu()

 

装饰器:

什么装饰器?

#就像我们装修房子一样,我们不会去改变房子内部结构,而是在房子表面进行一个修饰美化,让我们住的更舒服
#装饰器的作用就是帮助我们在不改变原函数的源代码和调用方式的基础上,引入新的功能。

#可调用:callable,可以加括号执行的
#开放封闭原则:对扩展开放 对修改封闭
#必须满足的两个条件:
 1.不改变源代码
 2.不改变原来的使用方式

 

 

为什么要用?

正常IT公司会有大量的被定义的函数,如果我们要改动函数的源代码,可能会导致函数的连锁出错,最终使得整个程序崩溃,同时就算有的源代码能改动,但是大量的工作量以及功能需求的不确定,使得工作效率异常低下。

怎么使用?

先看一个标准的无参数的装饰器模版

def outer(func):  # 定义一个外部函数
    def inner(*args, **kwargs):  # 定义一个内部函数(装饰好的函数)
        print('执行被装饰函数之前 你可以做的操作')  # 装饰
        res = func(*args, **kwargs)  # 需要被装饰的函数(需要传参)
        print('执行被装饰函数之后 你可以做的操作')  # 装饰
        return res  # 返回原函数的地址,方便以后调用

    return inner  # 返回被装饰好的函数的地址,方便以后调用

1.无参装饰器

 

 

最中间的func()就是原函数的一个主体,我们ba而不带()

三个难点:

#1.关于函数“变量”(或“变量”函数)的理解
#2.关于高阶函数的理解
#3.关于嵌套函数的理解

 

重要作用:

#1.不能修改被装饰的函数的源代码
#2.不能修改被装饰的函数的调用方式
#3.满足1、2的情况下给程序增添功能

 

posted @ 2019-07-12 16:32  辕子  阅读(162)  评论(0编辑  收藏  举报