码迷,mamicode.com
首页 > 其他好文 > 详细

闭包函数、装饰器

时间:2019-07-11 18:51:16      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:cal   外部   star   ret   request   就是   out   bsp   执行   

一、补充知识点

1、可调用的callable(可以加括号执行某个特定功能):函数名,类名

2、import this:查看Python之禅

二、闭包函数

1、定义

  闭:定义在函数内部的函数

  包:内部函数引用了外部函数作用域的名字

2、形式

def outter(x,y):
    def inner():
        代码1
        代码2
        return inner

res = outter(1, 2)
res()

3、作用

  给函数体传参有两种方式,第一种是直接给函数体传参,第二种就是用闭包函数,它是利用外部函数给内部函数传参,这样在调用内部函数的时候,就可以不写参数。

4、举例

import requests  # requests是python实现的简单易用的HTTP库
def outter(url):
    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()

三、装饰器

1、定义

  器:就是一个工具

  装饰:给被装饰对象添加新的功能

2、开放封闭原则

  开放:对扩展开放

  封闭:对修改封闭

3、装饰器必须遵守的两个原则

  ①、不改变被装饰对象源代码

  ②、不改变被装饰对象(可调用对象)调用方式

4、装饰器简单版

"""
统计index函数执行的时间
"""
import time  # 导入时间模块
def index():
    time.sleep(1)
#让程序暂停1秒,测量程序运行时间时,如果时间过短,测量时间会是0,加上延时后就可以测量
    print(‘澳门最大线上赌场开业啦 性感tank在线发牌!‘)

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

5、装饰器升级版

解决了函数参数的问题,无参函数和有参函数都可以直接调用,可以接收任意数量的参数

 

import time
def index():
    time.sleep(1)
    print(‘from index‘)
    return index
res = index()  # from index

def login(name):
    time.sleep(1)
    print(name)
    return login
res1 = login(‘egon‘)  # egon

def outter(func):
    def get_time(*args, **kwargs):
# 可以传入任意参数,放入元组和字典中
        start = time.time()
        res = func(*args, **kwargs)
# 将元组和字典打散,将参数原封不动的传给func函数
        end = time.time()
        print(end-start)
        return res
    return get_time

index = outter(index)  
login = outter(login)
index()
# from index
# 1.0002615451812744
# 此时的index()已经多了计时功能
login(‘egon‘)
# egon
# 1.0002918243408203
# 此时的login()已经多了计时功能
print(res)
# <function index at 0x00DFA660>
print(res1)
# <function login at 0x028435D0>
print(index)
# <function outter.<locals>.get_time at 0x028436F0>
print(login)
# <function outter.<locals>.get_time at 0x02843660>

6、装饰器语法糖

 

闭包函数、装饰器

标签:cal   外部   star   ret   request   就是   out   bsp   执行   

原文地址:https://www.cnblogs.com/DcentMan/p/11171851.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!