Python基础之函数的闭包与装饰器的介绍
1、闭包的概念:
如果在一个函数中,定义了另外一个函数,并且那个函数使用了外面函数的变量,并且外面那个函数返回了里面这个函数的引用,那么称为里面的这个函数为闭包。
2、话不多说,以demo示例:
def Gen(x):
def fun(y):
return x+y
return fun
G = Gen(5) == 等同于 Gen(x)(y)
print(G(5))
其中 fun函数就是闭包的意思
3、闭包实现简单的计算器实战
闭包操作简单计算器
def calculator(option):
operator = None
if option == 1:
def add(x,y):
return x+y
operator = add
elif option == 2:
def minus(x,y):
return x-y
operator = minus
elif option == 3:
def multiply(x,y):
return x*y
operator = multiply
elif option == 4:
def divide(x,y):
return x/y
operator = divide
else:
print('输入有误!')
return operator
cal = calculator(3)
ret = cal(2,2)
print(ret)
4、nonlocal关键字概念
如果想要在闭包中修改外面函数的变量,这时候应该使用nonlocal关键字,来把这个变量标识为外面函数的变量:
def greet(name):
def say_hello():
nonlocal name
name += 'hello'
print('hello my name is %s' % name)
return say_hello
greet('Auawei')()
5、装饰器概念:
# 装饰器利用了函数也可以作为参数传递和闭包的特性,可以让我们的函数在执行之前或者执行之后方便的添加一些代码。
# 这样就可以做很多事情了,比如@classmethod装饰器可以将一个普通的方法设置为类方法,@staticmethod装饰器可以将一个普通的方法设置为静态方法等。
# 所以明白了装饰器的原理以后,我们就可以自定义装饰器,从而实现我们自己的需求
is_user = {
'username':True
}
def case():
def login_pw(func):
def wapper():
if is_user['username'] == True:
func()
else:
print('跳转到登录界面')
return wapper
@login_pw
def edit_user():
print('编辑用户成功')
@login_pw
def add_attr():
print('新增属性成功')
# edit_user() ==login_pw(edit_user)()
edit_user()
add_attr()
case()
其中在edit_user函数上加上@login_pw表示函数装饰器,edit_user() 等同于 login_pw(func)()
实际上就是 login_pw(edit_user)在运行wapper函数,判断成功后再次运行edit_user()函数。
# 被装饰的函数带有参数该如何解决
is_user = {
'username':True
}
def case():
def login_pw(func):
# *args 位置参数 **kwargs 关键字参数 两者组合再一起是万能参数
def wapper(*args,**kwargs):
if is_user['username'] == True:
func(*args,**kwargs)
else:
print('跳转到登录界面')
return wapper
@login_pw
def edit_user(username):
print('编辑用户成功:%s'%username)
@login_pw
def add_attr(title,context):
print('新增属性成功,标题: %s,内容: %s'%(title,context))
# edit_user() ==login_pw(edit_user)()
edit_user('Teacher')
add_attr('博客园','更新博客')
case()
# 带参数的装饰器:
# 装饰器也可以传递参数。
def login_required(site='front'):
def outter_wapper(func):
def innter_wapper(*args,**kwargs):
if site == 'front':
if is_user['username'] == True:
print('进入前台界面')
func(*args,**kwargs)
else:
print('返回登录前台首页')
else:
if is_user['username'] == True:
print('进入后台界面')
func(*args,**kwargs)
else:
print('返回登录后台首页')
return innter_wapper
return outter_wapper
@login_required()
def edit_user(username):
print('编辑用户成功:%s' % username)
@login_required("flase")
def add_attr(title,context):
print('新增属性成功,标题: %s,内容: %s'%(title,context))
edit_user('KTModel1111')
add_attr('Title','Teather')
# wraps装饰器:
from functools import wraps
def login_required(func):
@wraps(func)
def wrapper1(*args,**kwargs):
if is_user['username'] == True:
func(*args,**kwargs)
else:
print('跳转到登录页面')
return wrapper1
@login_required
def edit_user1(username):
print('用户名修改成功:%s'%username)
edit_user1('Key')
print(edit_user1.__name__)
# 实战:实现一个可以计算一个函数用时多久的装饰器
from time import time
from functools import wraps
def cal(func):
@wraps(func)
def wrapper(*args,**kwargs):
start = time()
func(*args,**kwargs)
end = time()
ctime = end - start
print('函数计算时间间隔为%f'%ctime)
return wrapper
@cal
def Add(x,y):
print(x*y)
Add(6,4)
Python基础之函数的闭包与装饰器的介绍的更多相关文章
- 13、python中的函数(闭包与装饰器)
一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函 ...
- python基础(三)闭包与装饰器
闭包(closure): 内嵌函数通过调用外部嵌套函数作用域内的变量,则这个内嵌函数就是闭包. 闭包必须满足三个条件: 必须有一个内嵌函数 内嵌函数必须引用外部嵌套函数中的变量 外部函数的返回值必须是 ...
- 一文搞懂Python函数(匿名函数、嵌套函数、闭包、装饰器)!
Python函数定义.匿名函数.嵌套函数.闭包.装饰器 目录 Python函数定义.匿名函数.嵌套函数.闭包.装饰器 函数核心理解 1. 函数定义 2. 嵌套函数 2.1 作用 2.2 函数变量作用域 ...
- day20_函数的闭包 与 装饰器
#!/usr/bin/env python # -*- coding:utf-8 -*- # # 一些文章 # https://www.cnblogs.com/Vae1242/p/6944338.ht ...
- Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析
Python使用property函数和使用@property装饰器都能定义属性的get.set及delete的访问方法,他们的相同点主要如下三点: 1.定义这些方法后,代码中对相关属性的访问实际上都会 ...
- Python之路【第五篇】: 函数、闭包、装饰器、迭代器、生成器
目录 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之可迭代对象 函数之迭代器 函数之生成器 面向过程的程序设计思想 一.函数进阶之函数对象 1. 函数对象 秉承着 ...
- 第十七篇 Python函数之闭包与装饰器
一. 装饰器 装饰器:可以拆解来看,器本质就是函数,装饰就是修饰的意思,所以装饰器的功能就是为其他函数添加附加功能. 装饰器的两个原则: 1. 不修改被修饰函数的源代码 2. 不修改被修饰函数的调用方 ...
- Python的高级特性7:闭包和装饰器
本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...
- python基础之:九步认识装饰器
step1. 先看个代码吧: def f(): ') f=lambda a:a +100 #覆盖上面的函数f print(f) #函数名指函数所在内存中的位置,入带后面括号表示执行函数 print(f ...
随机推荐
- CVPR2020:端到端学习三维点云的局部多视图描述符
CVPR2020:端到端学习三维点云的局部多视图描述符 End-to-End Learning Local Multi-View Descriptors for 3D Point Clouds 论文地 ...
- Android Gradle插件
目录 什么是Gradle 编写方法 buildSrc 基础概念 Extension 自定义Task Plugin Transformer Gradle用处 好文章 常见问题 Gradle插件练习地址: ...
- 复习Spring第四课---Spring对国际化的支持
其实国际化这东西很少使用,之前也就是粗略的学了下,趁今天有空,拿出来稍微写写.以前学android开发的时候,类似于多语言的版本.差别就是一个是手机打开,一个是浏览器打开,本质是一样的. 在Sprin ...
- Java 提效神器 Stream 的冷门技巧
Stream 使用这个方法创建一个 Stream 对象. new ArrayList<>().stream() Filter 过滤器,里面传递一个函数,这个函数的返回结果如果为 true ...
- python读取csv文件绘制气温图,x轴为日期,并填充颜色
- 一文带你了解.Net信号量
本文主要讲解.Net基于Semaphore带大家了解信号量 信号量举例 大家去银行去银行取钱,互斥锁管理的时一个柜台是否正在处理业务,而信号量管理的是整个柜台是否正在处理业务,每当有一个柜台处理完成之 ...
- 5、mysql_sql语言介绍
5.1.什么是sql: 总结:sql语句是关系型数据库的结构化查询和程序设计语言: 5.2.sql的分类: 1.数据库查询语言(DQL): select user,host,password from ...
- ps 快速去掉不需要的部分
1.打开图片---使用套索工具将不需要的圈起来----右键填充--直接点击确定就可以了
- Murmur3 Hash 128位java和C#方法
java调用com.google.guava 引入依赖 <dependency> <groupId>com.google.guava</groupId> <a ...
- AcWing 237. 程序自动分析
#include<bits/stdc++.h> using namespace std; const int N=1e6+5; int f[N*2],a[N],b[N],c[N],n,t, ...