为什么Python lambdas有用?

mea*_*ade 903 python lambda closures function

我想弄清楚Python lambdas.lambda是现实生活中应该被遗忘的"有趣"语言项目之一吗?

我确信有一些可能需要它的边缘情况,但考虑到它的模糊性,它在未来版本中重新定义的可能性(我基于它的各种定义的假设)和降低的编码清晰度 - 应该是要避免吗?

这让我想起C类型的溢出(缓冲区溢出) - 指向顶部变量并重载以设置其他字段值.感觉就像是一种技术表演,但维护编码器的噩梦.

Dav*_*d Z 978

你在谈论lambda功能吗?喜欢

lambda x: x**2 + 2*x - 5
Run Code Online (Sandbox Code Playgroud)

那些东西实际上非常有用.Python支持一种称为函数式编程的编程风格,您可以将函数传递给其他函数来执行操作.例:

mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])
Run Code Online (Sandbox Code Playgroud)

设置mult3[3, 6, 9],原始列表中的那些元素是3的倍数.这比较短(并且,可以说,更清晰)

def filterfunc(x):
    return x % 3 == 0
mult3 = filter(filterfunc, [1, 2, 3, 4, 5, 6, 7, 8, 9])
Run Code Online (Sandbox Code Playgroud)

当然,在这种特殊情况下,您可以执行与列表理解相同的操作:

mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]
Run Code Online (Sandbox Code Playgroud)

(或者甚至是range(3,10,3)),但是还有许多其他更复杂的用例,你不能使用列表理解,而lambda函数可能是写出来的最短路径.

我经常使用lambda函数.我花了一段时间才习惯他们,但最终我开始明白他们是语言中非常有价值的一部分.

  • 喜欢这个例子,很容易理解.但对于减少部分.如果我必须实现此功能.我会做'','.join(str(x)for x in [1,2,3,4,5,6,7,8,9])` (22认同)
  • 顺便说一句,如果你在Python3上运行它,你需要在过滤器结果上调用list来查看实际值,你还需要从functools导入reduce (3认同)
  • 我认为关键点是`lambda`函数可以是匿名的(因为它们在你的所有例子中).如果你正在为任何东西分配一个`lambda`函数,那么你做错了,应该使用`def`代替 (3认同)

小智 365

lambda只是一种奇特的说法function.除了它的名字,它没有任何模糊,令人生畏或神秘的东西.当你读了以下行,替换lambdafunction在你的心中:

>>> f = lambda x: x + 1
>>> f(3)
4
Run Code Online (Sandbox Code Playgroud)

它只是定义了一个函数x.其他一些语言,如R明确地说:

> f = function(x) { x + 1 }
> f(3)
4
Run Code Online (Sandbox Code Playgroud)

你看?这是编程中最自然的事情之一.

  • 对于来自非编程背景(即:精确科学)的人来说,这是一个很好的描述,这使得"lambda"的含义非常容易理解.谢谢! (33认同)
  • Raymond Hettinger在他的一次谈话中对这个名字感叹,并说通过命名'make function'而不是'lambda'可以避免所有混乱.:-) (9认同)
  • 在你的脑海中用'function`替换`lambda`并在最后一个表达式之前添加`return` (9认同)
  • @AaronMcMillin你错过了我的观点.仅仅因为你不能用`lambda`表达式定义*every*函数并不意味着`lambda`表达式*的结果不是*函数. (4认同)
  • @AaronMcMillin尝试`type(lambda x:3)`.`lambda`表达式和`def`语句都生成`function`对象; 只有`lambda`表达式的语法才能限制*它可以生成的*实例. (3认同)

Joh*_*uhy 106

两行摘要:

  1. 闭包:非常有用.学习它们,使用它们,爱它们.
  2. Python的lambda关键字:不必要,偶尔有用.如果你发现自己做了任何远程复杂的事情,就把它拿走并定义一个真正的功能.


ega*_*aga 72

lambda是处理高阶函数的一个非常重要的抽象机制的一部分.要正确理解其价值,请观看Abelson和Sussman的高质量课程,并阅读SICP一书

这些是现代软件业务中的相关问题,并且变得越来越流行.

  • 不要混淆`lambda`s和一流的功能.Python有一个非常有限的`lambda`语句,但完全是一流的函数.它唯一的区别是你必须命名你要传递的函数. (3认同)
  • Lambda 表达式在其他语言(如 C#)中也越来越流行。他们哪儿也不去。阅读闭包对于理解 Lambda 是一个有用的练习。闭包使像 jQuery 这样的框架中的许多编码魔法成为可能。 (2认同)

rhe*_*ttg 58

我怀疑lambda会消失.看看Guido的帖子,最后放弃试图删除它.另见冲突概要.

您可以查看这篇文章,了解有关Python功能特性背后交易的更多历史记录:http: //python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

奇怪的是,最初促使引入lambda和其他功能特性的map,filter和reduce函数在很大程度上已经被列表推导和生成器表达式所取代.实际上,reduce函数已从Python 3.0中的内置函数列表中删除.(但是,没有必要发送有关删除lambda,map或filter的投诉:他们会留下来.:-)

我自己的两分钱:就清晰度而言,很少有lambda值得.通常有一个更清晰的解决方案,不包括lambda.

  • 请注意,reduce仍然可以在Python 3.0中导入.如果你真的想要它,你仍然可以拥有它. (2认同)

Bry*_*ley 57

lambdas在GUI编程中非常有用.例如,假设您正在创建一组按钮,并且您希望使用单个参数化回调而不是每个按钮的唯一回调.Lambda让您轻松实现:

for value in ["one","two","three"]:
    b = tk.Button(label=value, command=lambda arg=value: my_callback(arg))
    b.pack()
Run Code Online (Sandbox Code Playgroud)

(注意:虽然这个问题是专门询问的lambda,你也可以使用functools.partial来获得相同类型的结果)

另一种方法是为每个按钮创建一个单独的回调,这可能导致重复的代码.

  • @Rqomey:不同之处在于,在这个例子中,`value`是在循环中定义的; 在另一个示例中,参数始终只有一个值.当您添加类似`arg = value`的内容时,您将当前值附加到回调.没有它,您将绑定对回调中的变量的引用.引用将始终包含变量的最终值,因为回调在循环运行完毕后的某个时间发生. (5认同)
  • `partial(my_callback,value)`vs`lambda arg = value:my_callback(arg)` - lambda有更多的东西(分配给arg然后用法)而且不太清楚意图是什么(你可能会巧妙地做一些事情)不同的lambda).进口不是真正的问题(无论如何你都有一堆,每个文件只有一次).代码最好根据它的读取程度来判断,而`partial()`比lambda更容易阅读. (2认同)

dbr*_*dbr 37

在Python中,lambda只是一种定义函数内联的方法,

a = lambda x: x + 1
print a(1)
Run Code Online (Sandbox Code Playgroud)

和..

def a(x): return x + 1
print a(1)
Run Code Online (Sandbox Code Playgroud)

.. 完全相同.

没有什么可以用lambda做的,你不能用常规函数做 - 在Python函数中就像其他任何东西一样对象,而lambdas只是定义一个函数:

>>> a = lambda x: x + 1
>>> type(a)
<type 'function'>
Run Code Online (Sandbox Code Playgroud)

我老实说认为lambda关键字在Python中是多余的 - 我从来没有必要使用它们(或者看到一个常用函数,列表理解或许多内置函数之一可以更好地使用的情况)

对于一个完全随机的例子,从文章"Python的lambda被破坏了!" :

看到拉姆达是怎样分解,产生尝试的功能列表fs=[f0,...,f9],其中fi(n)=i+n.第一次尝试:

>>> fs = [(lambda n: i + n) for i in range(10)]
>>> fs[3](4)
13
Run Code Online (Sandbox Code Playgroud)

我认为,即使它确实有效,但它是可怕的和"非单调的",同样的功能可以用无数其他方式编写,例如:

>>> n = 4
>>> [i + n for i in range(10)]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
Run Code Online (Sandbox Code Playgroud)

是的,它不一样,但我从未见过需要在列表中生成一组lambda函数的原因.它可能在其他语言中有意义,但Python不是Haskell(或Lisp,或......)

请注意,我们可以使用lambda并以这种方式仍然达到预期的效果:

>>> fs = [(lambda n,i=i: i + n) for i in range(10)]
>>> fs[3](4)
7
Run Code Online (Sandbox Code Playgroud)

编辑:

在一些情况下lambda很有用,例如在PyQt应用程序中连接信号时通常很方便,如下所示:

w = PyQt4.QtGui.QLineEdit()
w.textChanged.connect(lambda event: dothing())
Run Code Online (Sandbox Code Playgroud)

只是这样做w.textChanged.connect(dothing)dothing使用额外的event参数调用该方法并导致错误.使用lambda意味着我们可以整齐地删除参数而无需定义包装函数.

  • 您的“lambda 已损坏”参数已损坏,因为 python 变量范围规则以这种方式工作,期间。如果你在 for 循环中创建了一个闭包,你会以同样的方式被咬。 (2认同)

Tor*_*amo 30

我发现lambda对于执行相同操作的函数列表很有用,但是对于不同的情况.像Mozilla复数规则一样.

plural_rules = [
    lambda n: 'all',
    lambda n: 'singular' if n == 1 else 'plural',
    lambda n: 'singular' if 0 <= n <= 1 else 'plural',
    ...
]
# Call plural rule #1 with argument 4 to find out which sentence form to use.
plural_rule[1](4) # returns 'plural'
Run Code Online (Sandbox Code Playgroud)

如果你必须为所有那些定义一个函数,你会在它结束时发疯.对于像plural_rule_1,plural_rule_2等等的函数名称也不会很好.eval()当你依赖于变量函数id时,你需要它.


Aar*_*paa 26

您可以lambda使用命名函数或列表和生成器表达式做得更好.

因此,在大多数情况下,你应该只是其中一个基本上在任何情况下(除了可能用于交互式解释器中编写的临时代码).

  • @Rick我不怀疑,但实际情况是,当你看到"lambda"而你认为"zohmygod lambda"并开始在python中编写方案代码时,你会因为python的lambda表达式的局限而令人失望.另一方面,如果你开始思考自己"列表理解会起作用吗?不会.作为一个命名函数,我需要什么才能获得好处?不.好吧:排序(xs,key = lambda x:x.name, x.height)",你可能最终会使用lambda正确的次数. (18认同)
  • @Javier如果你在谈论"lambda"的概念,我同意你的意见; 但是,如果我们在谈论"lambda"python关键字,那么:1)命名函数更快,可以做更多(语句+表达式)几乎任何地方你都可以使用lambdas(map + filter)你可以只生成表达式或列表推导哪些更高效,更简洁.我不是说第一类函数不酷,只是python中的"lambda"关键字不如使用命名函数那么好,就是这样. (11认同)
  • +1:当使用lambda时,我不能强调使用**无名**函数.名字确实具有**宝贵的智力附加价值. (4认同)
  • "在大多数情况下,你应该只是其中一个基本上在任何情况下"期间.在解释器中键入lambda甚至没有用. (3认同)
  • 对于我来说,lambda对于使用带有回调参数的函数是必不可少的,比如sort()和sorted()的key =参数 (3认同)

小智 19

我已经使用Python几年了,我从来没有遇到过我需要 lambda的情况.实际上,正如教程所述,它仅适用于语法糖.

  • 在使用python开发GUI时,它们非常有用.通常,小部件需要对函数的引用.如果你需要一个小部件来调用一个函数并传递参数,那么lambda是一种非常方便的方法. (8认同)
  • 它不是*需要*但它有助于编写更短的代码,并且在许多情况下更具可读性,尤其是。在 Java 或 C++ 等冗长的语言中 (2认同)

rme*_*dor 17

我不能谈论python的lambda的特定实现,但一般来说lambda函数非常方便.它们是函数式编程的核心技术(甚至是技术),它们在面向对象程序中也非常有用.对于某些类型的问题,它们是最好的解决方案,所以当然不应该忘记!

我建议你阅读闭包map函数(链接到python文档,但它几乎存在于支持函数结构的每种语言中),以了解它为什么有用.

  • 没有 lambdas 也可以完成这些事情。这只是一个大麻烦。 (3认同)

Luc*_*iro 17

Lambda函数是一种创建函数的非官僚方式.

而已.例如,让我们假设您拥有主要功能并需要平方值.让我们看看传统的方式和lambda方式来做到这一点:

传统方式:

def main():
...
...
y = square(some_number)
...
return something

def square(x):
    return x**2
Run Code Online (Sandbox Code Playgroud)

lambda方式:

def main():
...
square = lambda x: x**2
y = square(some_number)
return something
Run Code Online (Sandbox Code Playgroud)

看到不同?

Lambda函数与列表很相配,例如列表推导或映射.事实上,列表理解它是一种使用lambda表达自己的"pythonic"方式.例如:

>>>a = [1,2,3,4]
>>>[x**2 for x in a]
[1,4,9,16]
Run Code Online (Sandbox Code Playgroud)

让我们看看语法的每个元素意味着什么:

[]:"给我一个清单"

x**2:"使用这个新生的功能"

对于x中的a:"进入"中的每个元素

那很方便呃?创建这样的功能.让我们用lambda重写它:

>>> square = lambda x: x**2
>>> [square(s) for x in a]
[1,4,9,16]
Run Code Online (Sandbox Code Playgroud)

现在让我们使用map,这是一回事,但更加语言中立.地图有两个参数:

(i)一项功能

(ii)可迭代的

并给出一个列表,其中每个元素都是函数应用于iterable的每个元素.

所以,使用地图我们会:

>>> a = [1,2,3,4]
>>> squared_list = map(lambda x: x**2, a)
Run Code Online (Sandbox Code Playgroud)

如果掌握了lambdas和映射,那么您将拥有以简洁的方式操作数据的强大功能.Lambda函数既不模糊也不带走代码清晰度.不要把事情与新事物混淆.一旦你开始使用它们,你会发现它非常清楚.


Nou*_*him 13

一个关于好东西lambda那是在低估我的看法是,这是直到需要的数值推迟了简单的形式评价的方式.让我解释.

实现了许多库例程,以便它们允许某些参数为callables(lambda为1).我们的想法是,实际值只会在它被使用时计算(而不是在它被调用时).一个(人为的)例子可能有助于说明这一点.假设您有一个例程,它将记录给定的时间戳.您希望例程使用当前时间减去30分钟.你这样称呼它

log_timestamp(datetime.datetime.now() - datetime.timedelta(minutes = 30))
Run Code Online (Sandbox Code Playgroud)

现在假设仅在发生某个事件时才会调用实际函数,并且您希望仅在此时计算时间戳.你可以这样做

log_timestamp(lambda : datetime.datetime.now() - datetime.timedelta(minutes = 30))
Run Code Online (Sandbox Code Playgroud)

假设log_timestamp可以处理这样的可调用对象,它会在需要时对其进行评估,并且您将获得当时的时间戳.

当然有其他方法可以做到这一点(operator例如使用模块),但我希望我已经传达了这一点.

更新:是一个稍微更具体的现实世界的例子.

更新2:我认为这是所谓的thunk的一个例子.


Mik*_*e A 11

如上所述,Python中的lambda运算符定义了一个匿名函数,而在Python函数中则是闭包.重要的是不要将闭包的概念与运算符lambda混淆,运算符lambda只是它们的语法美沙酮.

几年前,当我开始使用Python时,我经常使用lambdas,认为它们很酷,还有列表推导.但是,我写了并且必须维护一个用Python编写的大型网站,大约有几千个功能点.我从经验中学到了lambda可能可以用原型进行原型设计,但除了保存一些关键的stokes,有时候没有提供内联函数(命名闭包)之外什么都不提供.

基本上这归结为几点:

  • 读取使用有意义名称明确编写的软件更容易.根据定义,匿名闭包不能具有有意义的名称,因为它们没有名称.由于某种原因,这种简洁似乎也会感染lambda参数,因此我们经常会看到像lambda x:x + 1这样的例子
  • 重用命名闭包更容易,因为当有名称引用它们时,它们可以通过名称多次引用.
  • 调试使用命名闭包而不是lambdas的代码更容易,因为名称将出现在回溯中,并出现在错误周围.

这足以使它们四舍五入并将它们转换为命名闭包.但是,我对匿名关闭还有另外两个怨恨.

第一个怨恨只是他们只是另一个不必要的关键词混乱了语言.

第二个怨恨是更深层次和范式层面,即我不喜欢它们促进功能编程风格,因为这种风格不如消息传递,面向对象或程序风格灵活,因为lambda演算不是图灵 - 完成(幸运的是,在Python中,即使在lambda中,我们仍然可以摆脱这种限制).我觉得lambdas推广这种风格的原因是:

  • 有一个隐含的回报,即它们似乎应该是"功能".

  • 它们是另一种更明确,更可读,更可重用且更通用的机制的替代状态隐藏机制:方法.

我努力编写没有lambda的Python,并在视线中删除lambdas.我认为如果没有lambda,Python会是一种稍微好一点的语言,但这只是我的看法.

  • "因为lambda演算不是Turing-complete"是完全错误的,无类型的lambda演算是图灵完成的,这就是它如此重要的原因.你可以使用Y-combinator得到递归,``Y = lambda f :( lambda x:x(x))(lambda y:f(lambda*args:y(y)(*args)))` (6认同)

var*_*wal 11

Lambdas实际上是非常强大的构造,源于函数式编程中的思想,并且在Python的不久的将来它决不会被轻易修改,重新定义或删除.它们可以帮助您编写更强大的代码,因为它允许您将函数作为参数传递,从而将函数的概念视为一等公民.

Lambdas确实会让人感到困惑,但一旦获得了可靠的理解,你就可以编写如此清晰优雅的代码:

squared = map(lambda x: x*x, [1, 2, 3, 4, 5])
Run Code Online (Sandbox Code Playgroud)

上面的代码行返回列表中数字的平方列表.当然,你也可以这样做:

def square(x):
    return x*x

squared = map(square, [1, 2, 3, 4, 5])
Run Code Online (Sandbox Code Playgroud)

很明显,以前的代码更短,如果您打算在一个地方使用map函数(或任何类似的函数作为参数),尤其如此.这也使代码更直观和优雅.

另外,正如@David Zaslavsky在他的回答中所提到的,列表推导并不总是如此,特别是如果你的列表必须从一些模糊的数学方式获得值.

从更实际的角度来看,lambdas最近的一个最大优势是GUI和事件驱动编程.如果你看一下Tkinter中的回调,它们作为参数的所有内容都是触发它们的事件.例如

def define_bindings(widget):
    widget.bind("<Button-1>", do-something-cool)

def do-something-cool(event):
    #Your code to execute on the event trigger
Run Code Online (Sandbox Code Playgroud)

如果你有一些参数传递怎么办?像传递2个参数来存储鼠标单击的坐标一样简单.你可以这样轻松地做到这一点:

def main():
    # define widgets and other imp stuff
    x, y = None, None
    widget.bind("<Button-1>", lambda event: do-something-cool(x, y))

def do-something-cool(event, x, y):
    x = event.x
    y = event.y
    #Do other cool stuff
Run Code Online (Sandbox Code Playgroud)

现在你可以争辩说这可以使用全局变量来完成,但你是否真的想要担心内存管理和泄漏,特别是如果全局变量只在一个特定的地方使用?这将是糟糕的编程风格.

简而言之,lambdas很棒,永远不应该被低估.虽然Python lambdas与LISP lambdas不同(它们更强大),但是你可以用它们做很多神奇的事情.


Yog*_*ogi 8

Lambdas与函数式编程风格密切相关.通过将函数应用于某些数据并合并结果来解决问题的想法是谷歌用来实现其大多数算法的.

以函数式编程风格编写的程序很容易并行化,因此对于现代多核机器而言变得越来越重要.所以简而言之,不,你不应该忘记它们.


Nor*_*rtl 7

首先恭喜,设法找出lambda.在我看来,这是一个非常有效的构造.这些日子对功能性编程语言的趋势肯定是一个既不应该避免也不应该在不久的将来重新定义的指标.

你只需要思考一点点不同.我很快你会相信它.但是如果你只处理python,要小心.因为lambda不是真正的闭包,它以某种方式被"破坏":pythons lambda被打破了


bal*_*lki 6

我使用lambdas来避免代码重复.这将使功能易于理解例如:

def a_func()
  ...
  if some_conditon:
     ...
     call_some_big_func(arg1, arg2, arg3, arg4...)
  else
     ...
     call_some_big_func(arg1, arg2, arg3, arg4...)
Run Code Online (Sandbox Code Playgroud)

我用温度lambda替换它

def a_func()
  ...
  call_big_f = lambda args_that_change: call_some_big_func(arg1, arg2, arg3, args_that_change)
  if some_conditon:
     ...
     call_big_f(argX)
  else
     ...
     call_big_f(argY)
Run Code Online (Sandbox Code Playgroud)


Ken*_*Ken 5

我刚刚开始使用Python并首先进入Lambda-我花了一段时间才弄明白.

请注意,这不是对任何事情的谴责.每个人都有一套不容易的东西.

lambda是现实生活中应该被遗忘的那些"有趣"语言项目之一吗?

没有.

我确信有一些可能需要的边缘情况,但考虑到它的模糊性,

这并不模糊.在我过去的两个团队中,每个人都在使用这个功能.

在未来的版本中重新定义它的潜力(我根据它的各种定义做出的假设)

除了几年前修复闭包语义之外,我没有看到过在Python中重新定义它的严肃建议.

并且降低了编码清晰度 - 应该避免吗?

如果你正确使用它,那就不那么清楚了.相反,拥有更多语言结构可以提高清晰度.

这让我想起了C类型的溢出(缓冲区溢出) - 指向顶部变量并重载以设置其他字段值...一种技术表演但是维护编码器的噩梦......

Lambda就像缓冲区溢出?哇.如果你认为这是一个"维护噩梦",我无法想象你如何使用lambda.

  • -1让我(和其他人)再次阅读整个问题.请注意,其他人设法在不做的情况下回答. (5认同)

PyN*_*bie 5

我今天开始阅读David Mertz的书"Python中的文本处理".虽然他对Lambda的描述相当简洁,但第一章中的例子与附录A中的解释相结合,使得它们(最后)跳出了页面,突然间我理解了它们的价值.这并不是说他的解释对你有用,我仍处于发现阶段,所以除了以下内容之外,我不会尝试添加这些回复:我是Python的新手我是OOP的新手Lambdas对我来说是一场挣扎现在我读了Mertz,我想我得到了它们,我认为它们非常有用,因为我认为它们允许更清晰的编程方法.

他重现了Python的Zen,其中一行是Simple比复杂更好.作为一个非OOP程序员用lambdas读代码(直到上周列表理解),我想 - 这很简单?.我终于意识到,实际上这些功能使得代码比替代方案更具可读性和可理解性 - 它总是某种循环.我也意识到像财务报表一样 - Python不是为新手用户设计的,而是专为想要接受教育的用户而设计的.我无法相信这种语言有多强大.当我突然意识到lambdas的目的和价值时,我想撕掉大约30个程序,并在适当的时候重新开始使用lambdas.


小智 5

我可以举个例子,我实际上需要lambda认真.我正在制作一个图形程序,使用右键单击文件并为其分配三个选项之一.事实证明,在Tkinter(GUI接口程序,我正在写这个),当有人按下按钮时,它不能被分配给接受参数的命令.所以如果我选择其中一个选项并希望我选择的结果是:

print 'hi there'
Run Code Online (Sandbox Code Playgroud)

那没什么大不了的.但是如果我需要我的选择来获得特定的细节呢?例如,如果我选择选择A,它会调用一个函数,该函数接受一些依赖于选择A,B或C的参数,TKinter不支持这一点.Lamda是实际解决这个问题的唯一选择......

  • 好吧,大概你可以完成 `def foo...` 然后传入 `foo` 而不是 `lambda`。这只是更多的代码,你必须想出一个名字。 (2认同)

Ben*_*ey4 5

使用lambdas的一个有用的例子是提高长列表推导的可读性.在这个例子loop_dic中,为了清楚起见,但是想象loop_dic很长.如果您只是使用包含i该值的lambda版本的普通值,那么您将得到一个NameError.

>>> lis = [{"name": "Peter"}, {"name": "Josef"}]

>>> loop_dic = lambda i: {"name": i["name"] + " Wallace" }
>>> new_lis = [loop_dic(i) for i in lis]

>>> new_lis
[{'name': 'Peter Wallace'}, {'name': 'Josef Wallace'}]
Run Code Online (Sandbox Code Playgroud)

代替

>>> lis = [{"name": "Peter"}, {"name": "Josef"}]

>>> new_lis = [{"name": i["name"] + " Wallace"} for i in lis]

>>> new_lis
[{'name': 'Peter Wallace'}, {'name': 'Josef Wallace'}]
Run Code Online (Sandbox Code Playgroud)