lambdas在Python中非常有用的示例

时间:2011-12-08 17:11:57

标签: python functional-programming lambda

我在lambda中遇到了Python个表达式。我已经看到很多简单的例子(包括SE上的例子),其中lambda表达式产生的函数类似于任何东西的加法器,但我还看不到它们的实际用途,例如一些例子,在没有lambdas的情况下编写相同的代码安静会很痛苦。

您是否可以在文本处理中显示使用lambda表达式的内容,并且很难避免使用lambda表达式?但是实用的东西(不是数学游戏)。

7 个答案:

答案 0 :(得分:5)

在这种情况下,将所有lambda表达式写成单独的函数会很痛苦。

这段代码简单地做了什么?将自定义excel表转换为自定义数据库表的insert语句。 excel表字段和数据库字段之间存在映射,并且excel表字段和要在excel表值上应用的函数之间存在映射,然后才能将其插入到db中。你真的不想为每个领域定义一个单独的函数。

map_func = { 'ID' : lambda x : 'mig_farm_seq.nextval',
             'ENTERPRISE_NAME' : wrap_str,
             'TAX_NUMBER' : wrap_str,
             'FAMILY_NAME' : lambda x : wrap_str(x.split()[0]),
             'GIVEN_NAME' : lambda x : wrap_str(x.split()[1]),
             'ENTERPRISE_REGISTRATION_NUMBER' : wrap_str,
             'PREMISE_NAME' : wrap_str,
             'HOUSE_ID' : wrap_str,
             'POSTAL_CODE' : wrap_str,
             'PHONE_NUMBER_1' : lambda x : wrap_str(get_phone_number(x, True)),
             'PHONE_NUMBER_2' : lambda x : wrap_str(get_phone_number(x, False)),
             'FAX_NUMBER' : lambda x : wrap_str(x.replace(' ', '')),
             'BANK_IDENTIFIER' : lambda x : wrap_str(x.replace(' ', '').replace('-', '')[:3]),
             'BANK_ACCOUNT_NUMBER' : lambda x : wrap_str(x.replace(' ', '').replace('-', '')),
             'NUMBER_OF_EMPLOYEES' : wrap_null,
             'SETTLEMENT_NUMBER' : wrap_null,
             'REGISTRATION_NUMBER' : lambda x : insert_reg_number % x,
             'GENDER' : wrap_str,
             'ACTIVITY' : lambda x : '0',
             'REG_HOLDER_ACTIVITY' : lambda x : '0',
             'PROCESSED_BY_JOB' : lambda x : '0'
         }

来源:http://pastebin.com/MxEPBMaZ

答案 1 :(得分:4)

我经常使用它的一个地方:keysort函数的sorted函数:

>>> person = lambda name, age: { "name": name, "age": age }
>>> people = [ person("Joe", 61), person("Jane", 52) ]
>>> people.sort(key=lambda person: person["age"])

这将根据年龄对人员列表进行排序。

我使用lambdas的另一个地方是re.sub

>>> re.sub("0x([0-9a-f]+)", lambda match: "0x" + match.group(1).upper(), "0xfa")
'0xFA'

答案 2 :(得分:2)

我建议您访问Python安装的lib目录并查看lambda的grep,而不是在这里建议任何内容。你会得到足够的例子来满足你的胃口。

答案 3 :(得分:1)

由于您已询问过文字处理问题,请查看this示例(与this one类似)。

闭包几乎总是比对象更容易处理(因为隐式地捕获了环境),但对于那些用OOP来思考的人来说并不那么明显。我建议尝试学习至少一种不错的函数式语言(python中的lambdas太有限),这样你就会明白如何在像Python这样的语言中有效地应用这些技术。

答案 4 :(得分:0)

当你需要一个简短的函数来比较两个项目或执行其他一些操作时它们很有用,这将作为参数传递,并且函数不需要有一个名称,因为它只用作一个参数。

当函数(写为lambda)比通常用来命名它的def行以及最后使用的return时,它们很有用。

当你想部分应用一个函数时,它们很有用 - 你有一个你需要传递到其他地方的函数,并且希望在没有实际调用它的情况下提供传递函数的部分或全部参数。 Lamdda允许您执行此操作,而无需为您需要的每个变体定义和命名单独的函数。

答案 5 :(得分:0)

我的所有Django项目都包含2个字符串(settings.py):

DIRNAME = os.path.dirname(__file__)
_rel = lambda x: os.path.join(DIRNAME, x)

答案 6 :(得分:0)

其中一个实际有用的案例:

假设您正在使用PyQt,它允许您将信号连接到其他插槽(方法)。有时候,我需要只是执行某个动作,而不是编写一个函数,所以我需要的只是一次性函数。

obj.signal.connect(lambda: doFoo(bar))

当然,这与:

形成鲜明对比
def doBoo():
    return doFoo(bar)
obj.signal.connect(doBoo)

..前一种方式更清洁。