使用Lambda表达式作为函数参数

时间:2018-12-04 23:44:46

标签: python regex lambda

我很难理解将lambda表达式用作函数参数时的工作方式。例如:

libtool:   error: you cannot specify '-o' more than once

将“ hi”和“ ya”替换为“ hello”和“ you”,并返回

import re
rep = {"hi": "hello", "ya": "you"}
text = 'hi how are ya'
keys = re.compile('hi|ya')
text = keys.sub(lambda m: rep[m.group(0)], text)
print(text)

我对为什么这样做很困惑,因为我们没有指定"hello how are you" 取什么值,以及当第一个参数应该是字符串时,m函数如何解释这个值。

2 个答案:

答案 0 :(得分:4)

来自Python documentation

  

如果 repl 是一个函数,则在 pattern 的每一次非重叠出现时都会调用它。该函数采用单个match对象参数,并返回替换字符串。

您可以将lambda视为单行函数,因为它们在功能上是等效的,因此

lambda m: rep[m.group(0)]

成为

def unnamed_function(m):
    return rep[m.group(0)]

m被分配为函数参数。

答案 1 :(得分:0)

除了iBug的好答案,您还要说为什么第一个参数可以与非字符串对象一起使用,timeit和其他东西也是如此。

此外,lambda等同于函数,因此基本上您是在放置函数,即使您手动执行一个函数并将函数名称放入其中,它也将起作用。

注意:有一种非正则表达式的无模块方式可以完成此任务:

' '.join([rep.get(i,i) for i in text.split()])

演示:

>>> rep = {"hi": "hello", "ya": "you"}
>>> text = 'hi how are ya'
>>> ' '.join([rep.get(i,i) for i in text.split()])
'hello how are you'
>>>