首页 > 其他 > 详细

闭包函数、装饰器

时间:2019-07-13 17:13:04      阅读:90      评论:0      收藏:0      [点我收藏+]

一:闭包函数:

定义:


#完整的闭包函数结构,嵌套调用
def
func(): name = eva def inner(): print(name) return inner f = func() f()

 

   内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
#函数内部定义的函数称为内部函数  

给函数体传值的方式 传参
 def index(x,y):
     print(x,y)
 给函数体传值的第二种方法 闭包
 def outter(x,y): # 动态的绑定关系
    # x=1
    # y=2
     def my_max():
        if x>y:
            return x
         else:
             return y
     return my_max
 res1=outter(12,30)  #res就是my_maxd函数的内存地址
 print(res1())

 

 爬虫:动态的修改网址 url(攻防的策略)

import requests
def my_get=(url):
    requests=requests.get(https//www.baidu.com)
    if requests.status_code==200:
        print(len(requests.text))
res=my_get(https//www.baidu.com) #修改地址即可
res1=my_get(https//www.baidu.com)
res2=my_get(https//www.baidu.com)
res3=my_get(https//www.baidu.com)
res()

 二、装饰器:

  装饰器的本质:一个闭包函数(可调用的对象)

  装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展(不修改被装饰对象的源代码和调用方式)

def timer(func):
    def inner(a):
        start = time.time()
        func(a)
        print(time.time() - start)
    return inner

@timer   
def func1(a):
    print(a)

func1(1)

1、装饰器的主要功能:

在不改变函数调用方式的基础上在函数的前、后添加功能。

import time
print(time.time())
# 1562992535.343285  时间戳,当前的时间距离1970-1-1 00:00:00  Unix诞生的元年
    time.sleep(3) # 让程序暂停3秒

2、装饰器的固定格式:  

def timer(func):
    def inner(*args,**kwargs):
        ‘‘‘执行函数之前要做的‘‘‘
        re = func(*args,**kwargs)
        ‘‘‘执行函数之后要做的‘‘‘
        return re
    return inner

3、简单的装饰器:

"""
1.统计index函数执行的时间
"""
import time
def index():
    time.sleep(3)
    print(澳门最大线上赌场开业啦!)

def outter(func):  # func = 最原始的index函数的内存地址
    def get_time():
        start = time.time()
        func()  # func = index函数的内存地址() 直接调用
        end = time.time()
        print(index run time:%s%(end-start))
    return get_time
index = outter(index)  # outter(最原始的index函数内存地址)
# index指向get_time函数的内存地址
index()


装饰器的流程图:统计index的执行时间

技术分享图片

技术分享图片

index和函数名 index没有任何关系 只是命名重复而已,加括号的就认为是函数的调用,优先级最高的

 

 

4、装饰器语法糖:

 
  装饰器在装饰的时候  顺序从下往上
  装饰器在执行的时候  顺序从上往下

技术分享图片

#  以此类推@outter2调用func1赋值给新的变量func2.......

 

多个装饰器装饰同一个函数

有些时候,我们也会用到多个装饰器装饰同一个函数的情况。

@outter  # index = outter(index)  outter(最原始的index的函数的内存地址)
def index():
    time.sleep(3)
    print(澳门最大线上赌场开业啦!)
    return index
# res1 = index()
@outter  # login = outter(login)
def login(name):
    time.sleep(1)
    print(%s is sb%name)
    return login
# res = login(‘egon‘)
@outter  # home = outter(home)
def home(*args,**kwargs):
    time.sleep(1)
    return home
login = outter(login)  # outter(最原始的login函数的内存地址)
index = outter(index)
home = outter(home)
"""
语法糖在书写的时候应该与被装饰对象紧紧挨着 
两者之间不要有空格
"""

 

 

 5、装饰器的固定格式:

def outter(func):
    def inner(*args,**kwargs):
        print(执行被装饰函数之前 你可以做的操作)
        res = func(*args,**kwargs)
        print(执行被装饰函数之后 你可以做的操作)
        return res
    return inner

 

闭包函数、装饰器

原文:https://www.cnblogs.com/Gaimo/p/11179815.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!