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.首 ...
随机推荐
- 根据参数优化nginx的服务性能
一.优化nginx服务的worker进程数 在高并发.高访问量的Web服务场景,需要事先启动好更多的nginx进程,以保证快速响应并处理大量并发用户的请求. 1).优化nginx进程对应的配置 优化n ...
- v2ex站长专访 - 100offer专访Livid:不仅仅是V站站长
转载自: https://www.douban.com/group/topic/121611313/ 前几天上网时偶然发现v2ex站长的blog(https://livid.v2ex.com/),了解 ...
- 如何用纯 CSS 创作一副国际象棋
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/WyXrjz 可交互视频 ...
- PHP 日常开发过程中的bug集合(持续更新中。。。)
PHP 日常开发过程中的bug集合(持续更新中...) 在日常php开发过程中,会遇到一些意想不到的bug,所以想着把这些bug记录下来,以免再犯! 1.字符串 '0.00'.'0.0'.'0' 是 ...
- python-for循环与while循环
while 循环 格式: while 条件 为 True: 代码块 while True: rayn_age = 18 age = input('请输入你的年龄:') age = int(age) i ...
- Python9-进程-day36
import osfrom multiprocessing import Processimport timedef func(args,args2): print(args,args2) time. ...
- JAVA基础篇—异常
五种常见异常 1.NullPointerException 空指针 2.ClassNotFoundException 指定类不存在 3.ArithmeticException运算异常 4.ArrayI ...
- Git for Windows 工具的使用(二)
Git分支 当一个人开发功能A而另一个人开发功能B,之后代码进行整合的时候,使代码既有功能A也有功能B.在Git中,Git给了我们分支的概念. 分支可以使用我们快速的开发协作,并且快速的合并. 分支 ...
- jenkins匿名用户登录 - 安全设置
最近自己安装配置jenkins,但是跑任务时,发现是匿名账户登录,且提示: 后来发现搭建好jenkins之后,默认就是匿名用户登录的,可以在安装设置菜单里进行账户管理. 1.登录Jenkins服务器, ...
- Java技术——Java泛型详解
.为什么需要泛型 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52230032 泛型在Java中有很重要的地位,网上很多文章罗列各种 ...