我最近收到了stackoverflow研究员关于上一个问题的答复,并且我尝试进行更多询问以了解该功能,但是以某种方式没有任何反应,因此我想在这里提出。
我想知道在lambda中使用的k和v代表什么?我以为它就是这样的……
k = dictionary ?
v = string ? # Did I understand it correctly?
dictionary = {"test":"1", "card":"2"}
string = "There istest at the cardboards"
from functools import reduce
res = reduce(lambda k, v: k.replace(v, dictionary[v]), dictionary, string)
由于我们使用了lambda,因此它将循环这两个变量中的每个元素。但是为什么要k.replace?那不是字典吗?应该v.replace吗?此方法以某种方式起作用。我希望有人可以向我解释这是如何工作的,请尽可能提供更多详细信息。谢谢!
答案 0 :(得分:1)
reduce
等同于重复调用一个函数。
在这种情况下,该函数是lambda,但lambda只是一个匿名函数:
def f(k, v):
return k.replace(v, dictionary[v])
reduce
本身的定义是(几乎-这里的None
默认值不太正确,也不是len
测试):
def reduce(func, seq, initial=None):
if initial is not None:
ret = initial
for i in seq:
ret = func(ret, i)
return ret
# initial not supplied, so sequence must be non-empty
if len(seq) == 0:
raise TypeError("reduce() of empty sequence with no initial value")
first = True
for i in seq:
if first:
ret = i
first = False
else:
ret = func(ret, i)
return ret
所以,问问自己,在lambda函数上调用 this 会做什么。
for i in dictionary
循环将遍历字典中的每个键。它将把该键以及存储的ret
(或第一次调用的initial
参数)传递给您的函数。因此,您将获得每个键以及最初为"There istest at the cardboards"
的字符串值,作为您的v
(字典中的键,在i
的扩展中称为reduce
)和{ {1}}(长字符串,在k
的扩展中称为ret
)自变量。
请注意,reduce
是全文字符串,而不是用作字典中键的字符串,而k
是作为字典中键的单词。我在这里使用变量名v
和k
只是因为您也这样做了。如评论中所述,在扩展的v
或原始text
函数中,word
和def f(...)
可能是更好的变量名。
尝试相同的代码,不同的是:
lambda
您将其编写为:
def f(k, v):
return k.replace(v, dictionary[v])
以def f(text, word):
print("f(text={!r}, word={!r})".format(text, word))
replacement = dictionary[word]
print(" I will now replace {!r} with {!r}".format(word, replacement))
result = text.replace(word, replacement)
print(" I got: {!r}".format(result))
return result
和functools.reduce
作为其他两个参数,在函数f
上运行dictionary
函数,并观察输出。