一、什么是装饰器

器即函数
装饰即修饰,意指为其他函数添加新功能
装饰器定义:本质就是函数,功能是为其他函数添加新功能

二、装饰器遵循的原则

1.不修改被装饰函数的源代码(开放封闭原则)
2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式

三、高阶函数

高阶函数总结
1.函数接收的参数是一个函数名
  作用:在不修改函数源代码的前提下,为函数添加新功能,
  不足:会改变函数的调用方式
2.函数的返回值是一个函数名
  作用:不修改函数的调用方式
  不足:不能添加新功能

其、程序:

work:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "DaChao"
# Date: 2017/6/14 import time
import random #一:编写函数,(函数执行的时间是随机的) # def work1_ti_work():
# '''
# 函数执行的时间是随机的
# :return:
# '''
# time.sleep(random.randrange(1,6))
# print("Welcome to my world!") #二:编写装饰器,为函数加上统计时间的功能 # def count_time(func):
# '''
# 装饰器功能,增加计算运行时间功能!
# :param func:
# :return:
# '''
# def wrapper():
# start_time = time.time()
# func()
# end_time = time.time()
# print("Run time is %s" %(end_time-start_time))
# return wrapper
#
# @count_time
# def work2_ti_work():
# '''
# 函数执行时间是随机的。
# :return:
# '''
# time.sleep(random.randrange(3,6))
# print("Welcome to my world!")
#
# work2_ti_work() #三:编写装饰器,为函数加上认证的功能 # def check(func):
# '''
# 修饰器:增加认证功能!
# :return:
# '''
# def wrapper(*args,**kwargs):
# usrname = input("Please input your name: ").strip()
# echo = input("Please input your echo: ").strip()
# if usrname == "dachao" and echo == "123":
# print("Login successful!")
# func(*args,**kwargs)
# else:
# print("Login error!")
# return wrapper
#
# @check
# def work3_ti_work(usr):
# '''
# 函数执行时间是随机的。
# :return:
# '''
# time.sleep(random.randrange(3,6))
# print("%s,welcome to my world!" %(usr))
#
# work3_ti_work("dachao") # 附:双修饰器增加功能:用户验证和登录时间统计 # def count_time(func):
# '''
# 装饰器功能,增加计算运行时间功能!
# :param func:
# :return:
# '''
# def wrapper(*args,**kwargs):
# start_time = time.time()
# func(*args,**kwargs)
# end_time = time.time()
# print("Run time is %s" %(end_time-start_time))
# return wrapper
#
# def check(func):
# '''
# 修饰器:增加认证功能!
# :return:
# '''
# def wrapper(*args,**kwargs):
# usrname = input("Please input your name: ").strip()
# echo = input("Please input your echo: ").strip()
# if usrname == "dachao" and echo == "123":
# print("Login successful!")
# func(*args,**kwargs)
# else:
# print("Login error!")
# return wrapper
#
# @count_time #work3_ti_work = count_time(check(work3))
# @check #work3_ti_work = check(work3)
# def work3_ti_work(usr):
# '''
# 函数执行时间是随机的。
# :return:
# '''
# time.sleep(random.randrange(3,6))
# print("%s,welcome to my world!" %(usr))
#
# work3_ti_work("dachao") #四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),
# 要求登录成功一次,后续的函数都无需再输入用户名和密码
# 注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式 # a = eval('{"name":"egon","password":"123"}')
#
# tag = True
#
# def count(func):
# def wrapper():
# global tag
# while tag:
# username = input("Please input your name: ").strip()
# echo = input("Please input your echo: ").strip()
# if username == a["name"] and echo == a["password"]:
# tag = False
# func()
# else:
# print("Please input again!")
# func()
# return wrapper
#
# @count
# def work_1():
# print("111111111111111")
# @count
# def work_2():
# print("222222222222222")
# @count
# def work_3():
# print("333333333333333")
#
# work_1()
# work_2()
# work_3() #五:编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果 # from urllib.request import urlopen
#
# def get_url(url):
# '''
# 从用户传入的地址,返回内容
# :return:
# '''
# res = urlopen(url).read()
# return res #六:为题目五编写装饰器,实现缓存网页内容的功能:
# 具体:实现下载的页面存放于文件中,
# 如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,
# 否则,就去下载,然后存到文件中 from urllib.request import urlopen def url_cache(func):
def wrapper(*args,**kwargs):
print("") #测试
f = open("cache1.txt","r")
if(f.read() == ""):
print("") #测试
f.close() #一定记得要关闭文件
f = open("cache1.txt", "wb")
f.write(func(*args,**kwargs))
f.close()
else:
print("") #测试
return wrapper @url_cache
def get_url(url):
'''
从用户传入的地址,返回内容
:return:
'''
res = urlopen(url).read()
return res get_url('http://www.baidu.com') #七:还记得我们用函数对象的概念,制作一个函数字典的操作吗,
# 来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作 # import sys
#
# func_dic = dict({})
#
# def deco(func):
# def inner():
# func_dic[func.__name__] = getattr(sys.modules[__name__],func.__name__)
# func()
# return inner
# @deco
# def my_append():
# print("My_appeng is running!")
# @deco
# def my_sss():
# print("My_sss is running!")
#
# my_append()
# my_sss()
# print(func_dic)
# func_dic["my_append"]()

work

Day 19 函数之闭包、装饰器的更多相关文章

  1. python 函数名 、闭包 装饰器 day13

    1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print ...

  2. python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)

    一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...

  3. 函数基础(三) 装饰器\闭包 day 12

    目录 昨日回顾 可变长参数 * ** 函数对象 函数嵌套 名称空间和作用域 今日内容 闭包函数 装饰器 语法糖 装饰器模板 迭代器 昨日回顾 可变长参数 * *形参:接受多余的位置实参 *实参(可迭代 ...

  4. python 闭包@装饰器

    1.装饰器 装饰器(Decorator)相对简单,咱们先介绍它:“装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数”,听起来有点绕,没关系,直 ...

  5. 第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON

    关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的 ...

  6. 闭包&装饰器详解

    闭包 先不着急看闭包的定义,让我们从一段示例代码开始.如果将上一个示例稍微修改下: >>> def outer(): ... x = 1 ... def inner(): ... p ...

  7. Python函数篇:装饰器

    装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理. ...

  8. 【Python】 闭包&装饰器

    python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...

  9. Python闭包装饰器笔记

    Python三大器有迭代器,生成器,装饰器,这三个中使用最多,最重要的就是装饰器.本篇将重要从函数嵌套开始讲起,从而引入闭包,装饰器的各种用法等. python中的一切都是一个对象(函数也是) 1.首 ...

随机推荐

  1. STL 之 sort 函数使用方法

    关于Sort Sort函数是C++ STL(Standard Template Library / 标准函数库) <algorithm>头文件中的一个排序函数,作用是将一系列数进行排序,因 ...

  2. PAT 乙级 1045

    题目 题目地址:PAT 乙级 1045 题解 本题的解法比较巧妙,刚开始的试着用暴力求解,果不其然时间超限…… 变换思路,既然对于每个元素来说满足的条件是前小后大,那么对数组排序,对应的位置相等的即为 ...

  3. Linux - which xxx - 查找执行的命令所在的路径

    Linux 下,我们常使用 cd ,grep,vi 等命令,有时候我们要查到这些命令所在的位置,如何做呢? Linux 下有2个命令可完成该功能:which ,whereis which 用来查看当 ...

  4. python 数据结构与算法之排序(冒泡,选择,插入)

    目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习 ...

  5. win7 命令提示符怎么以管理员方式打开

    点击屏幕最左下角的"开始"按钮,选择"运行"命令: 在弹出的"运行"对话框中输入"CMD"命令,再单击"确定& ...

  6. HDU 5489 Removed Interval DP 树状数组

    题意: 给一个长度为\(N\)的序列,要删除一段长为\(L\)的连续子序列,问所能得到的最长的\(LIS\)的长度. 分析: 设\(f(i)\)表示以\(a_i\)结尾的\(LIS\)的长度,设\(g ...

  7. CodeForces 567F DP Mausoleum

    本着只贴代码不写分析的题解是在耍流氓的原则,还是决定写点分析. 思路很清晰,参考的官方题解,一下文字仅对题解做一个简要翻译. 题意: 有1~n这n个数,每个数用两次.构成一个长为2n的序列,而且要求序 ...

  8. MySQL主从复制(Master-Slave)

    MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展.多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能. 下图就描述了一个多个数 ...

  9. Jquery+Ajax+asp.net+sqlserver-编写的通用邮件管理(有源码)

    开始 邮件管理通常用在各个内部系统中,为了方便快捷的使用现有的代码开发一个邮件管理系统而诞生的. 准备条件 这是我的设计表结构,大家一看就懂了 --邮件接收表CREATE TABLE [dbo].[T ...

  10. [POJ 1007] DNA Sorting C++解题

        DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 77786   Accepted: 31201 ...