python lambda的用法

欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/45269343


lambda函数也叫匿名函数,函数没有具体的名称。先来看一个最简单例子:


def f(x):
	return x * 2
	
g = lambda x : x * 2

看一下 f 和 g的写法有什么不同,f是定义了一个函数,传进去一个参数x,然后x*2,g是定义了一个lambda,后面跟着一个x(这个就是参数),然后跟着一个 : x * 2 (这就是执行的操作),所以以上的 f = g。它们是完全一样的东西,你可以这么写:f(10),或者这么写: g(10)。

但是lambda存在的意义是什么吗?其实很简单,简单来说, lambda 表达式通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用。

比如,在Python中有着几个内置函数,像 map,filter,reduce,我假设你了解它们的用法。

出个简单的不能再简单的编程题:打印100以内的为3的倍数的数。

你可能会这么写:

def func():
	result = []
	for i in xrange(100):
		if i % 3 == 0:
			result.append(i)
	return result

或者你比较了解Python的特性,可以用filter过滤:

def func(x):
	return x%3 == 0

filter(func,[i for i in xrange(100)])

无论怎样,我们都需要定义一个函数,或求值,或过滤,能不能不用这么麻烦,这么简单的编程题,每次要定义一个函数,很麻烦,lambda该上场了,

filter(lambda x:x%3==0,[i for i in xrange(100)])

就这么一句,搞定。注意看这个lambda,跟上面的那个func,做的是完全一样的操作,只不过是不用去显示的定义它。


基础的讲完了,下面看看项目中我们怎么用lambda的吧:

我们需要去查找某个玩家的数据(find_user_info),在这里面可能需要做很复杂的操作,比如查询数据库(query_database),然后对结果进行逻辑操作(deal_data):

def deal_data(result,fid):  # 这是我们主要逻辑处理的地方,可能增加它的属性,减少它的属性,或者删除它。
	...

def query_database(uid):
	result = ...
	return result

def find_user_info(uid):
	result = query_database(uid)
	deal_data(result,uid)

一般来说,find_user_info和query_database是通用接口,我们不太去改动它,我们要做的就是对不同的操作改动deal_data。比如,我要改它的名字,或者,我要给它加100金币,怎么处理呢,参数不够,那好,在find_user_info()里面加个类型,在deal_data里面加各种条件判断,跳转到各个具体的处理函数,一看就不是好的代码。

我们可以用lambda做更通用的处理:

def modify_name(result,fid):
	...
	
def add_gold(result,fid):
	...
	
def query_database(uid):
	result = ...
	return result

def find_user_info(uid,callback):
	result = query_database(uid)
	callback(result)
	
find_user_info(uid,lambda result:deal_data(result,fid))

修改find_user_info的参数,加个call_back,然后我们调用的时候这个call_back就是一个lambda,我们要改名,deal_data替换成modify_name,我们要加金币,那就改成add_gold,只要参数符合要求就可以了,既可以富修改find_user_info,又可以分离我们的不同的处理逻辑。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。