一、什么是装饰器

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

二、装饰器遵循的原则

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. Python爬虫系列-Selenium详解

    自动化测试工具,支持多种浏览器.爬虫中主要用来解决JavaScript渲染的问题. 用法讲解 模拟百度搜索网站过程: from selenium import webdriver from selen ...

  2. 通过composer安装阿里大于接口扩展

    # 安装laravel阿里大鱼服务 composer require iscms/alisms-for-laravel laravel配置 # 注册服务 # 在config\app.php文件中找到P ...

  3. Python基础——类

    创建类 class people: '帮助信息:dsafdaf' #所有实例都会共享的 number=100 #构造函数,初始化的方法,当创建一个类的时候,首先会调用它 def __init__(se ...

  4. Power Calculus UVA - 1374 迭代加深搜索

    迭代加深搜索经典题目,好久不做迭代加深搜索题目,拿来复习了,我们直接对当前深度进行搜索,注意剪枝,还有数组要适当开大,因为2^maxd可能很大 题目:题目链接 AC代码: #include <i ...

  5. Solution: 最近公共祖先·一 [hiho一下 第十三周]

    题目1 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中 ...

  6. nmap命令扫描存活主机

    1.ping扫描:扫描192.168.0.0/24网段上有哪些主机是存活的:   [root@laolinux ~]# nmap -sP 192.168.0.0/24 Starting Nmap 4. ...

  7. STM8 EEPROM心得

    对于STM8来说,其内部的EEPROM确实是个不错的东西,而且STM8S103/105价格已经非常便宜了,当然也可以用STM8S003/005代替,而且价格更便宜,大概在,1.2/2.0元左右,比10 ...

  8. <原创> 通过PEB获得进程路径 (附完整工程)

    完整工程:http://files.cnblogs.com/files/Gotogoo/%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86%E5%99%A8%28x86%26%2 ...

  9. 大数据学习——SparkStreaming整合Kafka完成网站点击流实时统计

    1.安装并配置zk 2.安装并配置Kafka 3.启动zk 4.启动Kafka 5.创建topic [root@mini3 kafka]# bin/kafka-console-producer. -- ...

  10. c++ 字符处理

    C++字符处理首选使用 string ,理由是string类型有很多简单易用的函数,不像char, char[], char* 等这些字符这么复杂. 如何用printf函数输出百分号? 打两个%%.. ...