一、什么是装饰器

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

二、装饰器遵循的原则

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. 【Java_Spring】RestTemplate发HTTP请求详解

    Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解) Spring RestTemplate提交时设置http header请求头 Spring之RestTempla ...

  2. ubuntu16.04安装mongodb,创建数据库管理员,上传文件到服务器上

    1.导入软件源得公钥 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 2.为mongodb创建软件 ...

  3. vtigercrm安装

    vtigercrm是一个用户关系管理系统. 本以为安装只用半个小时就可以完成,结果花了两天时间.. 后来因为不想其他的因素影响,重新装了个纯净的系统.(系统为ubuntu16,安装过程略) 在系统基础 ...

  4. LeetCode之螺旋矩阵

    问题 螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ ...

  5. 【MySQL】mac环境下使用navicat premium连接mysql乱码问题

    ---恢复内容开始--- 最重要的两点:使用navicat premium创建mysql连接和在mysql连接里面创建数据库时,需要注意. 1.创建连接时,Encoding不需要手动选择,保持Auto ...

  6. MySQL中文转换成拼音的函数

    CREATE DEFINER=`root`@`localhost` FUNCTION `fristPinyin`(`P_NAME` VARCHAR(255) CHARSET utf8) RETURNS ...

  7. 1、python-初探

    语言包括编译型语言和解释型语言编译型:全部翻译,再执行:c.c++解释型:边执行边翻译:python.php.java.c#.perl.ruby.javascript 一.系统位数32位系统内存的最大 ...

  8. LeetCode(219) Contains Duplicate II

    题目 Given an array of integers and an integer k, find out whether there are two distinct indices i an ...

  9. Aizu - 1386 Starting a Scenic Railroad Service (思维乱搞)

    给你n个区间,求: 1:最多有多少区间与同一个区间相交. 2:相交部分的最大区间数目. Sample Input 1 4 1 3 1 3 3 6 3 6 Sample Output 1 2 2 Sam ...

  10. Windows中redis的下载及安装、设置

    本文是转载自:https://www.cnblogs.com/wxjnew/p/9160855.html 除了原文的东西还有自己遇到的一些问题,这里记录一下. 一.下载: 下载地址: https:// ...