匿名函数以及应用、三元表达式
匿名函数
没有名字的函数,与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非将其赋值给一个名称。匿名函数不管多复杂.只能写一行.且逻辑结束后直接返回数据。
定义:
格式:
lambda 形参1,形参2...:返回值
参数可以有多个,返回值通常是表达式。
实例:
lambda x,y:x + y
# 相当于:
def func(x,y):
return x + y
调用:
方式1:
给函数关联一个名称,但这就失去了lambda仅用一次的特性。
f = lambda x,y:x + y
print(f(10,20))
30
方式2:
加括号调用。
print((lambda x,y:x + y)(10,20))
通常匿名函数用于和其他函数配合使用。
lambda与内置函数结合
min、max、sorted这些都有一个key形参,lambda能够与这些函数配合起到强大的作用。
min
(iterable, [, key, default])*
*min
(arg1, arg2, args[, key])
如果只提供了一个位置参数,它必须是 iterable,返回可迭代对象中最小的元素;如果提供了两个及以上的位置参数,则返回最小的位置参数。
有两个可选只能用关键字的实参。default 实参是当可迭代对象为空时返回的值。如果可迭代对象为空,并且没有给 default ,则会触发 ValueError
。
key 实参指定排序的参照值。key可以是函数名,也可以是lambda匿名函数。
min会每次迭代一个值传入key指定的函数中,根据得到的返回值作为比较依据来比大小。
例如:
print(min[1,2,3]) # 返回此序列的最小值。
res = min([1,2,-3],key=abs) # 按照绝对值的大小,返回此序列最小值.
d = {'k1':3,'k2':2,'k3':1}
print(min(d)) # 默认情况下,直接以迭代出的键进行比对.
k1
# 可以通过结合lambda,改变比对依据.
res = min(d,lambda x:d[x])
k3
*max
(iterable, [, key, default])
求最大值,与min用法相同。
*sorted
(iterable, , key=None, reverse=False)
根据 iterable 中的项返回一个新的已排序列表。key:为排序规则(排序函数),在sorted内部会将可迭代对象中的每一个元素传递给这个函数的参数.根据函数运算的结果进行排序。reverse :是否是倒叙,True 倒叙 False 正序。
info = [{'id':1,'name':'sushi','age':18},
{'id':2,'name':'wangwei','age':17},
{'id':3,'name':'libai','age':16},]
# 与lambda配合,使排序参照依据为age
print(sorted(info,key=lambda d:d['age']))
[{'id': 3, 'name': 'libai', 'age': 16}, {'id': 2, 'name': 'wangwei', 'age': 17}, {'id': 1, 'name': 'sushi', 'age': 18}]
lambda还可以与Python中保留的函数式编程特性map,filter,reduce结合。
map
(function, iterable, ...)
映射函数。将可迭代对象中的每个元素进行映射,分别去执行function。返回的是迭代器
info = [{'id':1,'name':'sushi','age':18},
{'id':2,'name':'wangwei','age':17},
{'id':3,'name':'libai','age':16},]
res = map(lambda d:d['name']+'haha',info)
print(list(res))
['sushihaha', 'wangweihaha', 'libaihaha']
filter
(function, iterable)
过滤。在filter中会自动的把iterable中的元素传递给function,然后根据function返回的True或者False来判断是否保留此项数据。
info = [{'id':1,'name':'sushi','age':18},
{'id':2,'name':'wangwei','age':17},
{'id':3,'name':'libai','age':16},]
res = filter(lambda d:d['age'] > 16,info)
print(list(res))
[{'id': 1, 'name': 'sushi', 'age': 18}, {'id': 2, 'name': 'wangwei', 'age': 17}]
functools.``reduce
(function, iterable[, initializer])
将两个参数的 function 从左至右积累地应用到 iterable 的条目,以便将该可迭代对象缩减为单一的值。
reduce的作用是先把列表中的前俩个元素取出计算出一个值然后临时保存着,接下来用这个临时保存的值和列表中第三个元素进行计算,求出一个新的值将最开始临时保存的值覆盖掉,然后在用这个新的临时值和列表中第四个元素计算,依次类推。
# 在Python2.x版本中recude是直接 import就可以的, Python3.x版本中需要从functools这个包中导入
from functools import reduce
ret = reduce(lambda x,y:x+y,[3,4,5,6,7])
print(ret)
25
# 如果是字符串则是拼接效果.
ret = reduce(lambda x,y:x+y,['a','bc','d'])
print(ret)
abcd
三元表达式
三元表达式是python提供的一种简化代码的方案,能将一个if、else语句简化成一行,并且不会丧失可读性,语法如下:
ret = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
针对下述场景:
# 常规写法。
def my_max(x,y):
if x > y:
return x
else:
return y
# 三元表达式
def my_max(x,y):
return x if x > y else y
# 可以赋值
res = 10 if 10 > 3 else 3