Python学习心得第四周-04 闭包函数和装饰器

大前提:函数的作用域关系是在函数定义阶段就已经固定死的,与调用位置无关

闭包函数:
1、闭指的是-》定义在函数的内部的函数
2、包-》该内部函数包含对其外层函数作用域名字的引用

闭包函数通常需要结合函数对象的概念,将闭包函数返回到外部使用
def outter():
    x=100
    def inner():
        print(x)

    return inner


f=outter()

# x=200
# f()

def foo():
    x=300
    def bar():
        x=400
        f()
    bar()

foo()
闭包函数的基本形式
def outter(x):
    def inner():
        print(x)
    return inner
import requests#爬虫
安装requests,cmd--在python安装路径下-Scripts
pip install requests

通过参数的形式为函数体传值
def get(url):
    response=requests.get(url)
    print(len(response.text))


x='https://www.baidu.com'
get(x)
get(x)
get(x)

y='https://www.jd.com'
get(y)
get(y)
get(y)


#将值包给函数

def outter(url):
    #url='https://www.jd.com'
    def get():
        response=requests.get(url)
        print(len(response.text))
    return get

jd=outter('https://www.jd.com')
jd()
jd()
jd()

baidu=outter('https://www.baidu.com')
baidu()
baidu()
baidu()



################

def outter():
    x=1
    def foo():
        print(x)
    return foo


f=outter()
print(f)

  

装饰器
1、什么是装饰器
装饰指的是为被装饰对象添加新的功能
器指的的是工具

装饰器本身可以任意可调用的对象,被装饰的对象也可以是任意可调用的对象

目标:
写一个函数用来为另外一个函数添加新功能,需要遵循开放封闭原则(对修改是封闭的,对扩展是开放的)
1、不修改被装饰对象的源代码
2、不修改被装饰对象的调用方式
import time

def index():
    time.sleep(3)
    print('welcome to index page')


def outter(func): #func=最原始index
    def wrapper():
        start_time=time.time()
        func()
        stop_time=time.time()
        print('run time is %s' %(stop_time-start_time))
    return wrapper

index=outter(index) #index=wrapper

index() #wrapper()

 

import time

def index():
    time.sleep(0.5)
    print('welcome to index page')
    return 1234

def home(name):
    time.sleep(1)
    print('welcome %s to home page' %name)


def timmer(func): #func=最原始index
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print('run time is %s' %(stop_time-start_time))
        return res
    return wrapper


# index=timmer(index) #index=wrapper
# home=timmer(home)

# 正常的调用
res=index() #res=wrapper()
print(res)
# home('egon') #wrapper('egon')
装饰器的语法糖:在被装饰对象正上方单独一行写上@装饰器名字
import time

def timmer(func): #func=最原始index
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print('run time is %s' %(stop_time-start_time))
        return res
    return wrapper


@timmer #index=timmer(index)
def index():
    time.sleep(0.5)
    print('welcome to index page')
    return 1234

@timmer #home=timmer(home)
def home(name):
    time.sleep(1)
    print('welcome %s to home page' %name)


# 正常的调用
res=index() #res=wrapper()
print(res)
home('egon') #wrapper('egon')

  

函数对象、函数嵌套、名称空间与作用域、装饰器

链接:http://www.cnblogs.com/linhaifeng/articles/7532497.html


原文地址:https://www.cnblogs.com/zhutiancheng/p/9324144.html