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. MinkowskiEngine Miscellaneous Classes杂类

    Miscellaneous Classes杂类 内核生成器 class MinkowskiEngine.KernelGenerator(kernel_size = -1,stride = 1,dila ...

  2. CUDA统一内存分析

    CUDA统一内存分析 PascalMIG 如 NVIDIA Titan X 和 NVIDIA Tesla P100 是第一个包含页 GPUs 定额引擎的 GPUs ,它是统一内存页错误处理和 MIG ...

  3. Spring Cloud Alibaba(14)---SpringCloudAlibaba整合Sleuth

    SpringCloudAlibaba整合Sleuth 上一篇有写过Sleuth概述,Spring Cloud Alibaba(13)---Sleuth概述 这篇我们开始通过示例来演示链路追踪. 一.环 ...

  4. 即时性能分析工具 Pyroscope

    当网站上线后,流量增加或短暂功能故障,都会造成使用者体验相当不好,而这时该怎么快速找到性能的瓶颈呢?通常 CPU 达到 100% 时,有时候也很难复制及找出关键问题点. 本篇文章,我们会介绍一套工具叫 ...

  5. ubuntu初识

    简单的Linux系统理解 Ubuntu ctrl+alt 可以令虚拟机释放鼠标,回到主系统中. 如果ubuntu有问题,如何重装? -------直接删除目录.虚拟机内的操作不会影响到宿主机. 1.挂 ...

  6. WPF中选择文件和选择文件夹的方法

    最近从winform转WPF,遇到了各种各样的问题.然而网上的关于WPF的资料少之又少,甚至连基本的文件选择操作,百度搜索的首页都没有一个比较好的方法.所以,踩了几个坑之后,我把我得到的方法分享给大家 ...

  7. Spring Boot下的一种导出Excel文件的代码框架

    1.前言 ​ 在Spring Boot项目中,将数据导出成Excel格式文件是常见的功能.与Excel文件导入类似,此处也用代码框架式的方式实现Excel文件导出,使得代码具有可重用性,并保持导出数据 ...

  8. 简易版JDBC连接池

    JDBC连接池mini版的实现 首先是工具类 DbUtil 主要参数就是Driver.User.PWD等啦,主要用于建立连接 URL需要注意的是SSL和serverTimezone参数,和mysql驱 ...

  9. 根据所处位置提取单元格内容的函数(left、right、mid)和查找字符串位于单元格内容第几位的函数(find)

    1.从左到右提取:left(value,num_chars) 注释:value为操纵单元格,num_chars表示截取的字符的数量 2.从右往左提取:right(value,num_chars) 注释 ...

  10. Swagger/OpenAPI By Swashbuckle在NetCore 3.1中较NetCore 2.2使用的注意事项及入门

    方案选择 使用Web API时,了解其各种方法对开发人员来说可能是一项挑战. Swagger也称为OpenAPI(Open Application Programming Interface,开放应用 ...