Python基础(7)_闭包函数、装饰器
一、闭包函数
闭包函数:1、函数内部定义函数,成为内部函数,
2、改内部函数包含对外部作用域,而不是对全局作用域名字的引用
那么该内部函数成为闭包函数
#最简单的无参闭包函数
def func1()
name='ares'
def func2()
print(name) #有参和返回值的闭包函数
def timmer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return res
return wrapper
二、高阶函数
1)函数接收的参数是一个函数名
2)函数的返回值是一个函数名
3)满足上述条件任意一个,都可称之为高阶函数
#高阶函数应用1:把函数当做参数传给高阶函数
import time
def foo():
print('from the foo') def timmer(func):
start_time=time.time()
func()
stop_time=time.time()
print('函数%s 运行时间是%s' %(func,stop_time-start_time))
timmer(foo)
#总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式 #高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名
import time
def foo():
print('from the foo') def timmer(func):
start_time=time.time()
return func
stop_time=time.time()
print('函数%s 运行时间是%s' %(func,stop_time-start_time))
foo=timmer(foo)
foo()
#总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能
高阶函数总结
1.函数接收的参数是一个函数名
作用:在不修改函数源代码的前提下,为函数添加新功能,
不足:会改变函数的调用方式
2.函数的返回值是一个函数名
作用:不修改函数的调用方式
不足:不能添加新功能
三、函数嵌套
#函数的嵌套定义
def f1():
def f2():
def f3():
print('from f3')
print('from f2')
f3()
print('from f1')
f2()
# print(f1)
f1() '''
from f1
from f2
from f3 '''
四、装饰器
1、定义:
器即函数
装饰即修饰,意指为其他函数添加新功能
装饰器定义:本质就是函数,功能是为其他函数添加新功能
2、装饰器遵循的原则:开放封闭原则(对扩展是开放的,对源码修改是封闭的)
即、1)不修改被装饰函数的源代码
2)为被装饰函数添加新功能后,不修改被装饰函数的调用方式
3、装饰器,装饰器本质可以是任意可调用对象,被装饰的对象也可以是任意可调用对象,
装饰器的功能是:在不修改被装饰对象源代码以及调用方式的前提下为期添加新功能
装饰器=高阶函数+函数嵌套+闭包
基本框架
#这就是一个实现一个装饰器最基本的架子
def timer(func):
def wrapper():
func()
return wrapper
统计一个函数运行时间的装饰器
# import time
# import random
# #装饰器
# def timmer(func):
# # func=index
# def wrapper():
# start_time = time.time()
# func() #index()
# stop_time=time.time()
# print('run time is %s' %(stop_time-start_time))
# return wrapper
# #被装饰函数
# def index():
# time.sleep(random.randrange(,))
# print('welecome to index page')
#
# def home():
# time.sleep(random.randrange(,))
# print('welecome to HOME page')
#
# index=timmer(index) #index=wrapper
# home=timmer(home)
#
# index() #wrapper()
# home()
装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字,#@timer就等同于index=timmer(index)
import time
import random
#装饰器
def timmer(func):
def wrapper():
start_time = time.time()
func()
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return wrapper
#被装饰函数
@timmer #index=timmer(index)
def index():
time.sleep(random.randrange(,))
print('welecome to index page')
# @timmer #home=timmer(home)
# def home():
# time.sleep(random.randrange(,))
# print('welecome to HOME page') index() #wrapper()
# home()
加多个装饰器:
#加多个装饰器
import time
import random
#装饰器
def timmer(func):
def wrapper():
start_time = time.time()
func()
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return wrapper
def auth(func):
def deco():
name=input('name: ')
password=input('password: ')
if name == 'egon' and password == '':
print('login successful')
func() #wrapper()
else:
print('login err')
return deco #被装饰函数 #多个装饰函数,从上往下添加,调用时从下往上
24 @auth #index=auth(wrapper) #index=deco #index=auth(wrapper) #index=deco
25 @timmer #index=timmer(index) #index=wrapper
def index():
# time.sleep(random.randrange(,))
time.sleep()
print('welecome to index page') def home():
time.sleep(random.randrange(,))
print('welecome to HOME page') # index() #deco()
# home()
装饰器修订:
#装饰器修订
import time
import random
#装饰器
def timmer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
res=func(*args,**kwargs) #接收参数
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return res #增加返回值
return wrapper
#被装饰函数 @timmer
def index():
time.sleep(random.randrange(,))
print('welecome to index page')
@timmer
def home(name):
time.sleep(random.randrange(,))
print('welecome to %s HOME page' %name)
return
index() res1=index()
print('index return %s' %res1)
res2=home('egon') #wraper()
print('home return %s' %res2)
Python基础(7)_闭包函数、装饰器的更多相关文章
- 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】
一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...
- Python之面向对象:闭包和装饰器
一.闭包 1. 如果一个函数定义在另一个函数的作用域内,并且引用了外层函数的变量,则该函数称为闭包. def outter(): name='python' def inner(): print na ...
- Python菜鸟之路:Python基础-逼格提升利器:装饰器Decorator
一.装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身 ...
- python基础语法7 闭包函数与装饰器
闭包函数: 1.闭包函数必须在函数内部定义 2.闭包函数可以引用外层函数的名字 闭包函数是 函数嵌套.函数对象.名称空间与作用域 结合体. # 直接传参 def func(x): print(x) f ...
- Python作用域-->闭包函数-->装饰器
1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部 ...
- python 内嵌函数, 闭包, 函数装饰器
一. 函数内嵌 闭包 在python中,函数可以作为返回值, 可以给变量赋值. 在python中, 内置函数必须被显示的调用, 否则不会执行. #!/usr/bin/env python #-*- ...
- Python记录9:函数4:名称空间作用域+闭包函数+装饰器
''' 一: 名称空间namespaces 名称空间就是存放名字与值绑定关系的内存空间 二: 名称空间分为三种 内置名称空间: 1. 特点: 存放是python解释器自 ...
- python闭包函数&装饰器
一.函数引用 函数可以被引用 函数可以被赋值给一个变量 def hogwarts(): print("hogwarts") # hogwarts() # 函数调用 print(ho ...
- Python之命名空间、闭包、装饰器
一.命名空间 1. 命名空间 命名空间是一个字典,key是变量名(包括函数.模块.变量等),value是变量的值. 2. 命名空间的种类和查找顺序 - 局部命名空间:当前函数 - 全局命名空间:当前模 ...
- Python 变量作用域,闭包和装饰器
from dis import dis b = 6 def f1(a): print(a)print(b) b = 9 f1(3) print(dis(f1)) # dis模块可以查看python函数 ...
随机推荐
- WebAssembly,Web的新时代
在浏览器之争中,Chrome凭借JavaScript的卓越性能取得了市场主导地位,然而由于javascript的无类型特性,导致其运行时消耗大量的性能做为代价,这也是JavaScript的瓶颈之一.W ...
- java.lang.IllegalStateException: class utils.filter.ContentFilter is not a javax.servlet.Filter
1.错误描写叙述 2016-01-12 11:27:01.787:WARN:oejuc.AbstractLifeCycle:FAILED ContentFilter: java.lang.Illega ...
- Mysql 5.7 liunx 忘记密码的补救方法
linux下mysql的root密码忘记解决方 1.修改MySQL的登录设置 # vim /etc/my.cnf 在[mysqld]的段中加上一句: skip-grant-tables 例如: [my ...
- python第四周迭代器生成器序列化面向过程递归
第一节装饰器复习和知识储备------------ 第一节装饰器复习和知识储备------------ def wrapper(*args,**kwargs): index(*args,**kwa ...
- php 批量处理post数据
<?php header("Content-Type:text/html;charset=UTF-8"); include('ini.php'); foreach ($_PO ...
- 如何给Eclipse添加一个JDK或JRE
第一: 第二: 第三: 第四:
- Unity3D学习笔记——NGUI之Localization system
Localization system(国际化系统) 实现的就是用户选择不同的语言,切换我们游戏文字的显示. 一:创建一个CVS文件.可以用Google Docs, Excel等软件工具. 我这里用的 ...
- poj 2516(拆点+最小权匹配)
题目链接:http://poj.org/problem?id=2516 思路:考虑某种货物,由于某个订货商可能接受来自不同地区的货物,而某一地区的货物也可能送给不同的订货商,显然不能直接进行匹配,必须 ...
- OpenCV学习笔记十四:opencv_objdetect模块
一,简介: 该库用于目标检测.
- PHPCMS 前台移用地区联动数据
在PHPCMS中,有时候需要建立模型有地区联动,这个联动数据在这前台调用显示呢?今天清源就给大家介绍一下! 地区联动菜单的缓存文件是 caches\caches_linkage\caches_dat ...