我很难理解将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
函数如何解释这个值。
答案 0 :(得分:4)
如果 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'
>>>