python的闭包、装饰器和lambda等(笔记)

参考:

http://blog.csdn.net/marty_fu/article/details/7679297(闭包,推荐看这个)
https://foofish.net/python-decorator.html(装饰器,推荐)
http://www.cnblogs.com/tqsummer/archive/2010/12/27/1917927.html(yield)
http://www.cnblogs.com/longdouhzt/archive/2012/05/19/2508844.html(特殊语法,lambda、map等)

1.闭包:

python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)

例子:

In [3]: def f1(x):
   ...:     def f2(y):
   ...:         return x + y
   ...:     return f2
   ...: 

In [4]: func=f1(6)

In [5]: func(9)
Out[5]: 15

在f1内定义了f2,但f2函数引用了f1中的变量x,f1返回了f2的函数名,当对func进行赋值的时候,同时也对x赋值了,func函数调用的是f2的函数,而却能记住x的值

2.装饰器:

装饰器跟闭包的语法类似,差别在于,它必须传递一个函数,而后又在内部函数中对这个函数进行引用(因为装饰器存在的意义就是增强传递过来的函数的功能)

例子:

In [9]: def f1(func):

...: def wrapper():
...: print "now,begin your show: "
...: func()
...: print "the show is over."
...: return wrapper
...:

In [10]: @f1
    ...: def f2():
    ...:     print "haha,i am no 1"
    ...:     

In [11]: f2()
now,begin your show:
haha,i am no 1
the show  is over.

在这里@f1的效果相当于 f2=f1(f2) ,如果这么做的话,f2要先定义

3.yield

yield用来模拟生成器的工作过程,它会在条件内生成值,遇到下一个yield就停止等待值被取走然后再生成下个值,直到条件不满足(这个我不确定,大概是这个过程,等我查资料再确定)

例子:

In [39]: def g(n):
...:     i=0
...:     while i < n :
...:         yield i
...:         i+=1
...:         

In [40]: t=g(3)

In [41]: type(t)
Out[41]: generator

In [42]: t.next()
Out[42]: 0

In [43]: t.next()
Out[43]: 1

In [44]: t.next()
Out[44]: 2

In [45]: t.next()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-45-3660e2a3d509> in <module>()
----> 1 t.next()

StopIteration: 

以下都摘抄自:http://www.cnblogs.com/longdouhzt/archive/2012/05/19/2508844.html

lambda表达式返回一个函数对象
例子:

func = lambda x,y:x+y
func相当于下面这个函数
def func(x,y):
        return x+y

注意def是语句而lambda是表达式
下面这种情况下就只能用lambda而不能用def

[(lambda x:x*x)(x) for x in range(1,11)]

map,reduce,filter中的function都可以用lambda表达式来生成!

map(function,sequence)

把sequence中的值当参数逐个传给function,返回一个包含函数执行结果的list。
如果function有两个参数,即map(function,sequence1,sequence2)。

例子:

求11,22,33,44

    map(lambda x:x*x,range(1,5))

返回值是[1,4,9,16]

reduce(function,sequence)
function接收的参数个数只能为2
先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给
function,然后只返回一个结果。

例子:
求1到10的累加

reduce(lambda x,y:x+y,range(1,11))

返回值是55。

filter(function,sequence)
function的返回值只能是True或False
把sequence中的值逐个当参数传给function,如果function(x)的返回值是True,就把x加到filter的返回值里面。一般来说filter的返回值是list,特殊情况如sequence是string或tuple,则返回值按照sequence的类型。

原文地址:http://blog.51cto.com/linzb/2089324

时间: 2024-11-06 16:49:37

python的闭包、装饰器和lambda等(笔记)的相关文章

【Python基础】高阶函数+函数嵌套+闭包 ==装饰器

高阶函数+函数嵌套+闭包 == 装饰器 一 什么是装饰器 二 装饰器需要遵循的原则 三 实现装饰器知识储备 四 高阶函数 五 函数嵌套 六 闭包 七 无参装饰器 八 装饰器应用示例 九 超时装饰器 参考: https://www.cnblogs.com/linhaifeng/articles/6140395.html https://www.cnblogs.com/haiyan123/p/8387769.html 原文地址:https://www.cnblogs.com/XJT2018/p/11

python高级之装饰器

python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之一的函数就是高阶函数: 接受一个或多个函数作为输入参数 输出一个函数 首先理解一个概念:函数名其实也是一个变量,一个函数其实就是一个对象,函数名就是对这个对象的引用.所以函数名也就和一个普通变量一样可以被当做函数的变量进行传递,当然也能够把函数名当做一个变量进行返回. 举个栗子: 1 def foo

Python深入05 装饰器

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果.相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用. 装饰器最早在Python 2.5中出现,它最初被用于加工函数和方法这样

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

Python进阶(六)----装饰器

Python进阶(六)----装饰器 一丶开放封闭原则 开放原则: ? 增加一些额外的新功能 封闭原则: ? 不改变源码.以及调用方式 二丶初识装饰器 装饰器: ? 也可称装饰器函数,诠释开放封闭原则,装饰器的本质是闭包 ###普通版装饰器 import time def timmer(x): # x 接收的原函数的内存地址 def inner(): start_time=time.time() x() # 执行 原函数 print(f'执行效率{time.time()-start_time}'

Python函数与装饰器入门一

语句简写 三元运算(三目运算) 解决if,else条件的简写. v = A if 条件 else B # 如果条件为真,就把A赋值给V,否则赋值B lambda表达式 简单函数的简写 def func(a1,a2): return a1+a2 #这种简单返回数值的函数形式,可以简化为: func = lambda a1,a2:a1+a2 #这种简便写法叫做lambda表达式,和上面的形式没有区别 两者可以相互结合,实现简写 func = lambda a1,a2: a1 if a1>0 else

如何理解python中的装饰器, 这篇文章就够了!

1. python中的函数 理解裝飾器之前先要理解閉包, python中閉包的出現是因爲函數在python中也是一個對象, 也可以被引用, 然後調用, 比如 def log(): print('我是一些log信息') if __name__ == '__main__': print(type(log)) log_func = log log_func() 執行結果如下 <class 'function'> 我是一些log信息 可以看到log函數是一個對象, 可以被賦值給log_func, lo

1.16 Python基础知识 - 装饰器

Python中的装饰器就是函数,作用就是包装其他函数,为他们起到修饰作用.在不修改源代码的情况下,为这些函数额外添加一些功能,像日志记录,性能测试等.一个函数可以使用多个装饰器,产生的结果与装饰器的位置顺序有关. 装饰器基本形式: @装饰器1 def 函数1: 函数体 相当于:==> 函数1 = 装饰器1(函数1) 装饰器特点: 1.不修改源代码的调用方式 2.不修改源代码内容 3.装饰器有高阶函数与递归函数相融合的特点 多个装饰器修饰,示例: @foo @spam def bar():pass

ZMAN的学习笔记之Python篇:装饰器

年前工作事务比较繁琐,我只能用零碎的时间继续学习Python,决定开一个系列的博文,作为自己深入学习Python的记录吧.名字也取好了,就叫<ZMAN的学习笔记之Python篇>~开篇是关于装饰器的,春节假期码的字哈哈~就让我们开始吧! 本文的例子都是自己想的,如果不是很合适,请大家提出宝贵意见哈~谢谢啦! 一.为什么要用“装饰器” 比如我们写了如下一段代码: # 打印0~99 def func(): for i in range(100): print(i) 我们想要监测执行这个函数花费了多