一、闭包函数

闭包函数: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)_闭包函数、装饰器的更多相关文章

  1. 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  2. Python之面向对象:闭包和装饰器

    一.闭包 1. 如果一个函数定义在另一个函数的作用域内,并且引用了外层函数的变量,则该函数称为闭包. def outter(): name='python' def inner(): print na ...

  3. Python菜鸟之路:Python基础-逼格提升利器:装饰器Decorator

    一.装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身 ...

  4. python基础语法7 闭包函数与装饰器

    闭包函数: 1.闭包函数必须在函数内部定义 2.闭包函数可以引用外层函数的名字 闭包函数是 函数嵌套.函数对象.名称空间与作用域 结合体. # 直接传参 def func(x): print(x) f ...

  5. Python作用域-->闭包函数-->装饰器

    1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部 ...

  6. python 内嵌函数, 闭包, 函数装饰器

    一.  函数内嵌 闭包 在python中,函数可以作为返回值, 可以给变量赋值. 在python中, 内置函数必须被显示的调用, 否则不会执行. #!/usr/bin/env python #-*- ...

  7. Python记录9:函数4:名称空间作用域+闭包函数+装饰器

    ''' 一: 名称空间namespaces     名称空间就是存放名字与值绑定关系的内存空间 二: 名称空间分为三种     内置名称空间:         1. 特点: 存放是python解释器自 ...

  8. python闭包函数&装饰器

    一.函数引用 函数可以被引用 函数可以被赋值给一个变量 def hogwarts(): print("hogwarts") # hogwarts() # 函数调用 print(ho ...

  9. Python之命名空间、闭包、装饰器

    一.命名空间 1. 命名空间 命名空间是一个字典,key是变量名(包括函数.模块.变量等),value是变量的值. 2. 命名空间的种类和查找顺序 - 局部命名空间:当前函数 - 全局命名空间:当前模 ...

  10. Python 变量作用域,闭包和装饰器

    from dis import dis b = 6 def f1(a): print(a)print(b) b = 9 f1(3) print(dis(f1)) # dis模块可以查看python函数 ...

随机推荐

  1. C++语言基础(17)-运算符重载

    运算符重载的格式为: 返回值类型 operator 运算符名称 (形参表列){ //TODO: } 一.在类里面实例运行符重载 #include <iostream> using name ...

  2. eclipse 建立maven项目 显示红叉的解决方法

    1.建立好之后就会发现项目有红叉. 这时发现查查在main处,打开项目>属性>Java Build Path>source,发现里边有红叉(如下图),这是由于我们的src/main下 ...

  3. strust2 和 hibernate的整合------登录的实现

    初步认识了struts2,并与hibernate进行整合,完成了一个登录的案例,下面贴源码 1.实体类User public class User { private Integer id; priv ...

  4. Java并发编程(九)安全发布

    之前讨论是如何将对象封闭在线程之中,这样可以减少一些并发带来的同步和可见性问题.但是在有些时候,我们希望在多个线程间共享对象,此时必须确保安全地进行共享. [不安全发布的示例] 可见性问题:其他线程看 ...

  5. va_list可变参数

    可变参数函数实现 va_list,va_start,va_arg,va_end va可变参数意思,variable-argument. 1. 头文件及实现 linux中定义在gcc头文件中,stdar ...

  6. 我的 Android 开发实战经验总结

    我的 Android 开发实战经验总结 字数4440 阅读5137 评论43 喜欢250 曾经一直想写一篇总结 Android 开发经验的文章,预计当时的我还达不到某种水平,所以思路跟不上,下笔又捉襟 ...

  7. webpack issues

    webpack-dev-server安装失败 npm ERR! path C:\Users\YYT\Desktop\dot_webpack\node_modules\express\node_modu ...

  8. Android.mk 输出日志 调试

    $(warning "the value of MY_FILES_PATH is $(MY_FILES_PATH)") #jni

  9. djangoproject本地部署

    1. 下载源码:https://codeload.github.com/django/djangoproject.com/zip/master2. 本地解压3. 下载python2.7 install ...

  10. selenium+testng+reportng+ant+jenkins集成日记

    1.新建一个项目 2.编写测试脚本 3.配置ant的build.xml脚本 4.集成到jenkins,并运行 1.新建项目   注意jdk的版本要一致 eclipse  Window --Prefer ...