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基础之函数的闭包与装饰器的介绍的更多相关文章

  1. 13、python中的函数(闭包与装饰器)

    一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函 ...

  2. python基础(三)闭包与装饰器

    闭包(closure): 内嵌函数通过调用外部嵌套函数作用域内的变量,则这个内嵌函数就是闭包. 闭包必须满足三个条件: 必须有一个内嵌函数 内嵌函数必须引用外部嵌套函数中的变量 外部函数的返回值必须是 ...

  3. 一文搞懂Python函数(匿名函数、嵌套函数、闭包、装饰器)!

    Python函数定义.匿名函数.嵌套函数.闭包.装饰器 目录 Python函数定义.匿名函数.嵌套函数.闭包.装饰器 函数核心理解 1. 函数定义 2. 嵌套函数 2.1 作用 2.2 函数变量作用域 ...

  4. day20_函数的闭包 与 装饰器

    #!/usr/bin/env python # -*- coding:utf-8 -*- # # 一些文章 # https://www.cnblogs.com/Vae1242/p/6944338.ht ...

  5. Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析

    Python使用property函数和使用@property装饰器都能定义属性的get.set及delete的访问方法,他们的相同点主要如下三点: 1.定义这些方法后,代码中对相关属性的访问实际上都会 ...

  6. Python之路【第五篇】: 函数、闭包、装饰器、迭代器、生成器

    目录 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之可迭代对象 函数之迭代器 函数之生成器 面向过程的程序设计思想 一.函数进阶之函数对象 1. 函数对象 秉承着 ...

  7. 第十七篇 Python函数之闭包与装饰器

    一. 装饰器 装饰器:可以拆解来看,器本质就是函数,装饰就是修饰的意思,所以装饰器的功能就是为其他函数添加附加功能. 装饰器的两个原则: 1. 不修改被修饰函数的源代码 2. 不修改被修饰函数的调用方 ...

  8. Python的高级特性7:闭包和装饰器

    本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...

  9. python基础之:九步认识装饰器

    step1. 先看个代码吧: def f(): ') f=lambda a:a +100 #覆盖上面的函数f print(f) #函数名指函数所在内存中的位置,入带后面括号表示执行函数 print(f ...

随机推荐

  1. DMS是临时解决方案?

    DMS是临时解决方案? Who Says DMS Is an Interim Solution? 现在是认真对待DMS驱动程序监控系统的时候了. 特斯拉(Tesla)在台湾高速公路上撞上翻倒卡车的镜头 ...

  2. H5根据浏览器内核判断并区分微信、QQ和QQ浏览器

    项目中碰到这样一个需求点,在h5页面区分当前所处客户端环境是QQ客户端.微信客户端还是QQ浏览器客户端,并做不同的逻辑处理 首先可以通过 window.navigator.userAgent 获取到当 ...

  3. UiPath 中 List 集合的实例化与使用

    >>>跳过BB,空降正文<<< 目录 前言 正文 1. 创建 List 变量 2. 实例化 List 变量 3. 集合的使用 后记 前言 大家好呀,我是 白墨,一个 ...

  4. P1024 [NOIP2001 提高组] 一元三次方程求解

    题目描述 有形如:a x^3 + b x^2 + c x + d = 0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在 -100至 ...

  5. UF_OBJ 对象操作

    Open C uc5027uc5028uc5029uc502auc502euc502muc502nuc502ruc5203uf5025uf5026UF_OBJ_ask_cre_mod_versions ...

  6. 02:database 配置(可能出现严格模式配置问题)

    DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'day42', 'USER': 'root', 'P ...

  7. 用Python爬取分析【某东618】畅销商品销量数据,带你看看大家都喜欢买什么!

    618购物节,辰哥准备分析一波购物节大家都喜欢买什么?本文以某东为例,Python爬取618活动的畅销商品数据,并进行数据清洗,最后以可视化的方式从不同角度去了解畅销商品中,名列前茅的商品是哪些?销售 ...

  8. Spring Cloud 和 Dubbo,到底用哪个好?

    Spring Cloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大 dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决 sp ...

  9. 我的物联网大学【第二章】:Luat的出世

    壹 启动火种 有一位软件行业的大神,名字叫做许小刚. 小刚是一位憨厚的年轻的码农,嵌入式.后端.前端,无所不能,是一个很牛的物联网全栈工程师,也是一家物联网软件公司的创始人兼CEO. 有次跟我.老陆. ...

  10. Linux网络基础TCP/IP

    1.osi:七层 上三层,主要是用户层面;下四层是实际进行数据传输物理层: 设备之间比特流的传输,物理接口,电气特性等 端口号的作用 通过IP找到服务器,通过端口号找到具体哪个服务.网页服务的端口号是 ...