函数编程——匿名函数与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,但是如果,没有引用,计数又会回到零,这样就会被垃圾回收。
为了保存对象,可以把它赋值到一个变量上,以后也就可以随时调用,也不会自动被删除了。