函数编程——匿名函数与lambda(一)

python允许用lambda关键字创造匿名函数。

匿名函数是因为不需要以标准的方式来声明,比如说,使用def语句。

但是,作为函数,它们也能有参数。

一个完整的lambda“语句”代表了一个表达式,这个表达式的定义体必须和声明放在同一行。

参数时可选的,如果使用参数的话,参数通常也是表达式的一部分。

核心知识点:

用合适的表达式调用一个lambda生成一个可以像其他函数一样使用的函数对象

它们可以被传给其他函数,用额外的引用别名化,作为容器对象以及可调用的对象被调用。(如果需要,可以带参数)

当被调用的时候,如果给定相同的参数的话,这些对象会生成一个和相同表达式等阶的结果。

它们和那些等价表达式计算值相同的函数是不能区分的。

可以来看个简单的例子:

>>> def true():   
...     return True
...

>>> lambda:True
<function <lambda> at 0x000002B6A99BBF28>
>>> TRUE = lambda:True

#上面都是创建两个总是返回True的函数
>>> true()
True

>>> TRUE() 
True
#可以发现结果完全是相同的

上面的例子说明,使用匿名函数完全是行得通的。

我们还可以将lambda表达式赋值给一个如列表和元祖的数据结构,同时默认以及可变的参数也是允许的。

>>> def kebi(x,y=2):  #我可以设置默认值
...     return x+y
...

>>> a = lambda x,y =2:x+y  #我也可以设置默认值

#上面两个函数功能一样

>>> def maoxian(*z):return z   #参数收集返回元祖
...
>>>
>>> b = lambda *z:z    #收集我也可以

#上面两个函数功能也一样

#光说不练可不行
>>> a(3)   #有默认值
5
>>> a(4,5)
9
>>> kebi(3)
5
>>> kebi(4,5)
9

>>> maoxian(1,2,'z','iu13')  #函数定义的只有一个参数,却可以收集多个到一个元祖里面
(1, 2, 'z', 'iu13')
>>> b(1,2,'z','iu13')
(1, 2, 'z', 'iu13')

 

最后再来阐述一个问题,为什么要给函数赋值一个变量?

>>> a = lambda x,y =2:x+y

之前在使用传统函数的总是不明白为啥要赋值?

我们可以把每个函数看作是一个对象,漂浮在内存中。

我们虽然创建了一个函数,但没有地方保存它,也没有调用它。

这个函数在创建的时候引用计数被设置为True,但是如果,没有引用,计数又会回到零,这样就会被垃圾回收。

为了保存对象,可以把它赋值到一个变量上,以后也就可以随时调用,也不会自动被删除了。

 

posted @ 2017-11-04 21:41  明王不动心  阅读(230)  评论(0编辑  收藏  举报