函数是第一类对象

函数能够被当做对象传递,函数可以被赋值

装饰器和闭包的基础概念

装饰器是一种设计模式能实现代码重用,经常用于查日志,性能测试,事务处理等,抽离函数大量不必的功能。 装饰器:
1、装饰器本身是一个函数,用于装饰其它函数:
2、功能:增强被装饰函数的功能。

装饰器需要遵循的原则

1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数添加新功能后,不修改被装饰函数的调用方式

装饰器 = 高阶函数+函数嵌套+闭包

高阶函数

1.函数接受的参数是一个函数名 2.函数的返回值是一个函数名 3.只有上述条件满足一个就是高阶函数

def foo():
print('高阶函数实例,被调用的函数') def func(foo):
print('调用上面的函数')
foo() func(foo)

把函数名当做参数传给高阶函数,高阶函数直接返回函数名

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()

高阶函数总结 1.函数接收的参数是一个函数名
作用:在不修改函数源代码的前提下,为函数添加新功能
不足:会改变函数的调用方式

2.函数的返回值是一个函数名
作用:不修改函数的调用方式
不足:不能添加新功能

嵌套函数

def father(name):
print('from father %s'%name)
def son():
print('from son')
def grandson():
print('from grandson')
grandson()
son()
father('逗逼')

闭包函数:函数在嵌套环境中,如果在内层函数里,对外层函数作用域中的变量进行引用,在外层函数返回后内层函数依然可以使用外层函数中的变量,这种变量就构成了内层函数可以使用的环境。所以闭包对隐藏状态,以及在函数对象和作用域中随意切换,一个函数可以发挥N种功用

def f1(x):
def f2(y):
return y ** x
return f2
f1(4) f3=f1(3)
type(f3) f3(4) def startPos(m,n):
def newPos(x,y):
print(''The old position is (%d,%d), and the new position is (%d,%d)"%(m,n,m+x,n+y))
return newPos action = startPos(10,10)
action(1,2)
action(-1,3) #结果
<function f1.<locals>.f2 at 0x02125270>
<class 'function'>
64
The old position is (10,10),and the new position is (11,12)
The old position is (10,10),and the new position is (9,13)

无参装饰器

无参装饰器 = 高级函数 + 函数嵌套 基本框架

#这就是一个实现一个装饰器最基本的架子
def time(func):
def wrapper():
func()
return wrapper 加上参数 def timer(func):
def wrapper(*args,**kwargs):
func(*args,**kwargs)
return wrapper 加上功能 import time
def timer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
func(*args,**kwargs)
stop_time = time.time()
print('函数[%s],运行时间是[%s]'%(func,stop_time-start_time))
return wrapper 加上返回值 import time
def timer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
res = func(*args,**kwargs)
stop_time = time.time()
print('函数[%s],运行时间是[%s]'%(func,stop_time-start_time))
return res
return wrapper 使用装饰器 def cal(arry):
res = 0
for in in array:
res+=i
return res
cal = timer(cal)
cal(range(10) 语法糖@ @timer
def cal()
def cal(array):
res=0
for i in array:
res+=i
return res cal(range(10)) 有参装饰器 user_list=[
{'name':'alex','passwd':''},
{'name':'linhaifeng','passwd':''},
{'name':'wupeiqi','passwd':''},
{'name':'yuanhao','passwd':''},
]
current_user={'username':None,'login':False}
def auth(auth_type='file'):
def auth_deco(func):
def wrapper(*args,**kwargs):
if auth_type == 'file':
if current_user['username'] and current_user['login']:
res = func(*args,**kwargs)
return res
username = input('用户名:').strip()
passwd = input('密码:').strip()
for index,user_dic in enumerate(user_list):
if username == user_dic['name'] and passwd ==username['passwd']:
current_user['username'] =username
current_user['login']=True
res = func(*args,**kwargs)
return res
break
else:
print('用户名或者密码错误,重新登录')
elif auth_type =='ldap':
print('登录成功')
res = func(*args,**kwargs)
return res
return wrapper
return auth_deco
@auth(auth_type='ldap')
def index():
print('欢迎来到主页面')
@auth(auth_type='ldap')
def home():
print('家目录')
def shopping_car():
print('购物车页面')
def order():
print('订单页面')
index()
home()

作用域规则 每次执行执行一个函数时,就会创建新的局部命名空间。该命名空间代表一个局部环境,其中包含函数参数的名称和在函数体内赋值的变量名称。解析这些名称 时,解释器首先搜索局部命名空间、如何没有找到匹配的名称,它就会搜索全局命名空间。函数的全局命名空间始终是定义该函数的模块。如果解释器在全局命名空间中也找不到匹配值,最终会检查内置命名空间。如果仍然找不到,就会引发NameError异常 

python函数下篇装饰器和闭包,外加作用域的更多相关文章

  1. Python函数06/装饰器

    Python函数06/装饰器 目录 Python函数06/装饰器 内容大纲 1.装饰器 1.1 开放封闭原则 1.2 装饰器 2.今日练习 内容大纲 1.装饰器 1.装饰器 1.1 开放封闭原则 扩展 ...

  2. python函数、装饰器、迭代器、生成器

    目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递 ...

  3. python——函数之装饰器

    1 问题 实际生活中,我们很难一次性就把一个函数代码写得完美无缺.当我们需要对以前的函数添加新功能时,我们应该怎么做? 2 问题解决思路 (1)可以直接修改原来的函数,在函数内直接修改.当我们对多个函 ...

  4. Python 函数之装饰器

    1.函数 #### 第一波 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 第二波 #### def foo(): print ...

  5. Python函数的装饰器修复技术(@wraps)

    @wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法: from ...

  6. Python函数的装饰器修复技术(@wraps)

    @wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法 from ...

  7. Python函数加工厂-装饰器

    引言: 函数和装饰器好比程序界的加工厂: 1.函数一般可用来加工一种或者多种数据类型的数据:字符串.数字.列表.字典等 举一个简单例子:已知半径求面积 def s(r): s = 3.14 * r * ...

  8. Python函数的装饰器

    函数的装饰器. 1. 装饰器 开闭原则: 对功能的扩展开放 对代码的修改是封闭 通用装饰器语法: def wrapper(fn): def inner(*args, **kwargs): # 聚合 & ...

  9. python函数与装饰器

    一.名字空间与作用域 1.名字空间 名字空间:赋值语句创建了约束,用来存储约束的dict被称为名字空间      赋值语句的行为:1.分别在堆和栈中创建obj与name                 ...

随机推荐

  1. 1 Spring Cloud Eureka服务治理

    注:此随笔为读书笔记.<Spring Cloud微服务实战> 什么是微服务? 微服务是将一个原本独立的系统拆分成若干个小型服务(一般按照功能模块拆分),这些小型服务都在各自独立的进程中运行 ...

  2. 纯CSS写正方形自适应宽高,且左侧高与正方形高保持一致

    先上图 虽然写法有点暴力,但是效果还是可以的,哈哈哈哈哈html:<div class="box">            <div class="le ...

  3. JVM菜鸟进阶高手之路十一(eden survivor分配问题)

    转载请注明原创出处,谢谢! 问题 这个Xmn设置为1G,,我用jmap -heap 看,这个Eden From To怎么不是一个整8:1:1的关系呢? 我看内存分配还是没变,我Xmn1g,感觉From ...

  4. Servlet 3.0 使用注解配置URl提示404错误

    我的环境是  Eclipse oxygen + Servlet 3.0 因为3.0已经开始使用注解了 之前我都是配置listenner 还有Servlet mapping  在 web.xml 中 就 ...

  5. Chrome控制台选择器简介

    Chrome的控制台是支持用$来获取元素的,这点可能是很多人不知道的.本篇文章将会简单介绍怎样更好的来使用这种快捷方式来获取元素. 判断当前窗口的$是来自谁的 我们知道jQ里面经常使用$来进行元素选择 ...

  6. Java多线程Runnable与Callable区别与拓展

    我们先来分别看一下这两个接口 Runnable: // // Source code recreated from a .class file by IntelliJ IDEA // (powered ...

  7. php多态

    多态性是指相同的操作或函数.过程可作用于多种类型的对象上并获得不同的结果.不同的对象,收到同一消息将可以产生不同的结果,这种现象称为多态性. 多态性允许每个对象以适合自身的方式去响应共同的消息.多态性 ...

  8. 封装好的图片滑动框架(AndroidImageSlider)

    前言 广告轮播条的重要性不言而喻.在很多类型app中出场率都很高. 今天给大家介绍一个轮播图开源项目,这个项目把轮播图需要的ViewPager跟计时器做了封装,使用极其方便,支持gradle在线依赖. ...

  9. Greatest Common Increasing Subsequence hdu1423

    Greatest Common Increasing Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536 ...

  10. Docker 最常用的监控方案 - 每天5分钟玩转 Docker 容器技术(78)

    当 Docker 部署规模逐步变大后,可视化监控容器环境的性能和健康状态将会变得越来越重要. 在本章中,我们将讨论几个目前比较常用的容器监控工具和方案,为大家构建自己的监控系统提供参考. 首先我们会讨 ...