Day 19 函数之闭包、装饰器
一、什么是装饰器
器即函数
装饰即修饰,意指为其他函数添加新功能
装饰器定义:本质就是函数,功能是为其他函数添加新功能
二、装饰器遵循的原则
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 函数之闭包、装饰器的更多相关文章
- python 函数名 、闭包 装饰器 day13
1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print ...
- python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)
一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...
- 函数基础(三) 装饰器\闭包 day 12
目录 昨日回顾 可变长参数 * ** 函数对象 函数嵌套 名称空间和作用域 今日内容 闭包函数 装饰器 语法糖 装饰器模板 迭代器 昨日回顾 可变长参数 * *形参:接受多余的位置实参 *实参(可迭代 ...
- python 闭包@装饰器
1.装饰器 装饰器(Decorator)相对简单,咱们先介绍它:“装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数”,听起来有点绕,没关系,直 ...
- 第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON
关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的 ...
- 闭包&装饰器详解
闭包 先不着急看闭包的定义,让我们从一段示例代码开始.如果将上一个示例稍微修改下: >>> def outer(): ... x = 1 ... def inner(): ... p ...
- Python函数篇:装饰器
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理. ...
- 【Python】 闭包&装饰器
python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...
- Python闭包装饰器笔记
Python三大器有迭代器,生成器,装饰器,这三个中使用最多,最重要的就是装饰器.本篇将重要从函数嵌套开始讲起,从而引入闭包,装饰器的各种用法等. python中的一切都是一个对象(函数也是) 1.首 ...
随机推荐
- k8s资源指标API及metrics-server资源监控
简述: 在k8s早期版本中,对资源的监控使用的是heapster的资源监控工具. 但是从 Kubernetes 1.8 开始,Kubernetes 通过 Metrics API 获取资源使用指标,例如 ...
- C++:100阶乘数组输出
#include <iostream> using namespace std; int main(){ int i =1; int a[2048]={0}; while(i !=101) ...
- ipvsadm分发MySQL读请求
在MySQL的部署场景中,经常使用HAproxy和ipvs来作为读请求转发的网关.ipvs的好处在于本身不需要daemon的方式来运行,而是直接作为kernel的服务来提供:当ipvs和应用程序服务器 ...
- 谷歌放弃“不作恶” Alphabet要“遵守法律互相尊重”
对于一些谷歌粉而言,谷歌那条“不作恶(Don’t be evil)”的行为准则是他们引以为傲的精神信仰.这一准则于1999年被首次确认,谷歌在2004年申请上市时也提到了这一点.不过现在这一点要改变了 ...
- pyecharts用法,本人亲测,陆续更新
主题 除了默认的白色底色和dark之外,还支持安装扩展包 pip install echarts-themes-pypkg echarts-themes-pypkg 提供了 vintage, maca ...
- hdu-1231 连续最大子序列(动态规划)
Time limit1000 ms Memory limit32768 kB 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj ...
- C3P0连接问题
C3P0 连接时的相关问题: 我的环境是在IDEA中使用C3P0中进行的: 使用C3P0主要用到的jar包都是最新和Mysql8.0兼容的包 在连接的时候遇到: 先是在连接的时候出现数据库连接的时候的 ...
- 算法学习记录-查找——二叉排序树(Binary Sort Tree)
二叉排序树 也称为 二叉查找数. 它具有以下性质: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值. 它的左.右子树也分别 ...
- CSS效果小结
效果属性 1.box-shadow(盒子阴影) 示例 加上 box-shadow 内阴影 复杂例子 阴影的形状跟原来的形状是一样的 结果: box-shadow 作用:1.营造层次感(立体感)2.充当 ...
- BZOJ 3351: [ioi2009]Regions
对于一个询问(x,y)对y出现次数分类,若<=lim,在儿子处统计答案,若>lim则y的种类肯定<lim,在祖先处统计(仿佛要去重?但是没去重也过了,那个时限仿佛怎么做都能过) #i ...