Python走一步看一步——filter&lambda
python中filter和lambda用法
第一次用不太会用,就当自己mark一下吧。果然比起敲代码读代码。。。更想去拯救艾欧泽亚。。。或者去德玛西亚当召唤师。。。切入正题吧!
filter
filter(function, iterable)我觉得第一个参数是过滤函数,第二个是要过滤序列参数。举一个小栗子:
def is_odd(n):
return n % 2 == 1
tmplist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
newlist = list(tmplist)
print(newlist)
输出结果:[1, 3, 5, 7, 9]
这是网上最普遍简单易懂的栗子啦,希望不会算是侵权。。。。但是本豆芽觉得前面的过滤函数还要定义有些啰嗦,有没有啥解决的方法呢?事实上是有的,就用到了lambda。
lambda
个人的理解,lambda就像是小型的匿名def,大家通过这两个代码片段体会一下:
withopen('data/logistic_regression.txt', 'r') as f:
data_list = [i.split('\n')[0].split(',') for i in f.readlines()]
data = [(float(i[0]), float(i[1]), float(i[2])) for i in data_list]
x0_max = max([i[0] for i in data])
x1_max = max([i[1] for i in data])
data = [(i[0]/x0_max, i[1]/x1_max, i[2]) for i in data]
x0 = list(filter(lambda x: x[-1] == 0.0, data))
身为豆芽的我第一眼看过去那是一眼蒙蔽额。。实际上他是想把data最后一列为0的过滤出来。如果部分代码这么改我可能就懂了。。
def divide(n):
return n[-1] == 0.0
x0 = list(filter(divide, data))
当然lambda和def肯定是有区别的啦。
- lambda可以定义一个匿名函数,而def定义的函数必须有一个名字。这应该是lambda与def两者最大的区别。
- lambda是一个表达式,而不是一个语句(lambda is an expression, not a statement.) 因此,lambda能够出现在Python语法不允许def出现的地方——例如,在一个列表常量中或者函数调用的参数中。
- lambda的主体是一个单个的表达式,而不是一个代码块。(lambda’s body is a single expression, not a block of statements.),lambda里面的语句相当于def中return中的代码一样。只能是简单的表达式,所以说lambda的能力小于def,在lambda中只能使用简单的语法,不能使用if else while return等语句。
所以lambda的设计理念为:lambda是一个为编写简单的函数而设计的,而def用来处理更大的任务。(lambda is designed for coding simple functions, and def handles larger tasks.)
就到这里啦。。拯救我的艾欧泽亚去啦~