博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python装饰器,闭包函数
阅读量:4883 次
发布时间:2019-06-11

本文共 2161 字,大约阅读时间需要 7 分钟。

  1. 闭包函数:在函数A内部定义另外一个函数B,之后B作为A的返回值直接被返回。此时函数B称为A的闭包函数。在闭包函数B中如果使用A函数中定义的变量,此时A函数中被定义的变量会被临时存储,直到B函数调用结束时该变量才会被系统收回,从而实现A中变量延迟释放
例如
def put(num):     print(num)     def wrapper():         nonlocal  num         num +=20         print(num)     return wrapper fun = put(0) fun()

此函数运行过程为:先依次从上往下运行,直到fun = put(0)语句,该语句为调用函数put,则执行函数put,输出结果为0,fun = wrapper,返回一个函数给fun,然而没有调用。当继续执行程序fun()时,程序运行的为wrapper函数,因为上面已经的num已经有值(nonlocal为不是本地变量的意思),所以函数会输出20

  1. global:声明的变量属于全局变量,此时在使用该变量时,计算机直接到函数的最外层寻找该变量是否存在
  2. nonlocal:声明变量属于非本地变量,此时计算机不会在当前变量使用的函数中寻找该变量,而是到该函数的外层寻找离该函数比较近的对应变量进行声明
  3. 装饰器:通过@语法直接使用定义好的函数修饰之前已经存在的函数,从而实现对原函数功能的扩充

优点:不需要修改原代码,即可实现对原函数功能的扩充;利于后期代码的维护

**(装饰器本质上是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器也是一个函数对象。他经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用)

import time import functools def log_time(fun):     @functools.wraps(fun)     def jj(*args1,**kb):         print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))         return fun(*args1,**kb)     return jj @log_time # now = log_time(now) def now(*a):     print(a) now(19,20) #定义一个自带参数的装饰器 def  log(txt):     def de(fun):         @functools.wraps(fun)         def wrapper(*m,**km):             print(txt,end = '')             print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))             return fun(*m,**km)         return wrapper     return de @log('对应时间是:')#等价于max_num = log('对应时间是:')fun(max_num) def max_num(num1,num2):     print(max(num1,num2)) max_num(2,43)
  1. 获取绝对值:print(abs(-4))

列表遍历:

def callBack(num):     num **= 2     return num list1 = [x for x in range(10)] result = map(callBack,list1) print(list(result))#map(fun,list):map用来对列表list的遍历操作,每一次遍历都会自动调用fun函数完成对本次遍历所得到的元素的计算,当遍历结束后返回一个map对象

6.列表过滤:

list2 = [1,3,4,54,5,4,3,35,"sdf","dsf"] li = filter(lambda  x:isinstance(x,int),list2) print(list(li))#列表过滤:filter(fun,list)用来遍历列表list,按照给定的过滤条件,完成对满足条件的数据保存,不满足条件的进行过滤(删除)的操作。其中fun是回调函数,充当过滤的条件

7.#偏函数

import functools int2 = functools.partial(int,base = 2)#将指定的函数和函数中默认值的参数进行绑定,生成一个新的函数,比如吧int函数和int的默认参数base绑定生成一个新函数int2,int2此时进行数据转换时按二进制进行转换 result = int2("10101000010100") print(result)

转载于:https://www.cnblogs.com/rose1jj/p/9374810.html

你可能感兴趣的文章
Hbase记录-zookeeper部署
查看>>
Python pexpect出现错误‘module have no attribute "spawn" 解决办法
查看>>
vs2008 C# 怎么调试C++ dll[转]
查看>>
PHP的魔术方法
查看>>
警惕麦咖啡的"缓冲区溢出保护"引起的ASP.NET 中 System.OutOfMemoryException 的错误...
查看>>
optimizer_dynamic_sampling
查看>>
HTML(WEB)开发day05
查看>>
序列合并求前K小项 POJ2442
查看>>
unity点选构建Mesh并保存OBJ
查看>>
python kmeans实战 - 单机一层聚类(小玩具哦),下次再弄个分布式多次聚类
查看>>
Java主要有那几种文件类型?各自的作用是什么?
查看>>
我的第一个python web开发框架(29)——定制ORM(五)
查看>>
2017.11.18 手把手教你学51单片机-点亮LED
查看>>
xml的创建与解析
查看>>
grep不区分大小写查找字符串方法
查看>>
linux系统灵活运用灯[android课程3]
查看>>
Android 通用Dialog中设置RecyclerView
查看>>
利用 Android Studio 和 Gradle 打包多版本APK
查看>>
Android 自定义标题栏
查看>>
Android 如何把一个 RelativeLayout或ImageView背景设为透明
查看>>