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. C#后台定义一个DataTable并手动写入静态数据(测试数据)

    //创建一个DataTable,并为之添加数据(自定义DataTable) DataTable dtz = new DataTable(); //添加Table中的列 DataColumn dc1 = ...

  2. Spring Cache缓存技术,Cacheable、CachePut、CacheEvict、Caching、CacheConfig注解的使用

    前置知识: 在Spring Cache缓存中有两大组件CacheManager和Cache.在整个缓存中可以有多个CacheManager,他们负责管理他们里边的Cache.一个CacheManage ...

  3. springmvc自定义的拦截器以及拦截器的配置

    一.自定义拦截器 Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口. 二.HandlerIn ...

  4. Atcoder rc122-c Calculator 斐波那契

    传送门 题解 先说结论: 任意正整数可以拆分成若干个斐波那契数 斐波那契数列: 1 1 2 3 5 8 13 21 34 例 17 = 13 + 3 + 1 看上去是对的,怎么证明呢? 首先假如每一个 ...

  5. Python中xml.etree.ElementTree读写xml文件实例

    import osimport xml.etree.ElementTree as ET'''Python 标准库中,提供了6种可以用于处理XML的包,本文举实例说明第6种1.xml.dom2.xml. ...

  6. Swapon交换空间: 缓解真实物理内存的压力

    交换空间: 缓解真实物理内存的压力 交换空间: 缓解真实物理内存的压力 由硬盘的空间来组成 – 交换分区:以空闲分区充当的交换空间 1.格式化交换分区 [root@server0 /]# mkswap ...

  7. 【VBA】显示所有隐藏的名称管理器中的名称

    Excel提示这个 代码: Sub DisplayNames() Dim Na As Name For Each Na In ThisWorkbook.Names Na.Visible = True ...

  8. Pytest学习笔记2-setup和teardown

    前言 我们在做自动化的时候,常常有这样的需求: 执行每一条用例时,都重新启动一次浏览器 每一条用例执行结束时,都清除测试数据 在unittest中,我们可以使用 setUp() 和 tearDown( ...

  9. 树莓派FRP内网穿透及自启动

    内网穿透的步骤和文件存档 实验室在远方部署了电脑主机来采集数据和图片,每次去调试会很麻烦,因而使用FRP内网穿透使得我们可以在实验室访问主机. 主要功能 实现远程可访问和开机自启FRP程序服务 安装和 ...

  10. Visual Studio 2019 v16.10 和 v16.11 Preview 1 现已推出!

    Visual Studio 2019 v16.10有什么新功能? 我们很高兴地宣布Visual Studio 2019 v16.10 GA 和 v16.11 preview 1发布.此版本使我们的主题 ...