我可以使用lambda函数在类对象列表上循环并更改属性值(对于所有对象或满足特定条件的对象)吗?
class Student(object):
def __init__(self,name,age):
self.name = name
self.age = age
student1 = Student('StudOne',18)
student2 = Student('StudTwo',20)
student3 = Student('StudThree',29)
students = [student1,student2,student3]
new_list_of_students = map(lambda student:student.age+=3,students)
使用一个简单的for循环来检索
students
来更新每个的age
已经足够好了,就像其他人所说的,但是如果您仍然想使用lambda
来更新值,则可能需要利用exec()
函数:输出:
在这种情况下,更新实际上是
exec()
,而map()
只产生None
。所以返回的结果毫无意义,我用_
来澄清这一点。更简洁的形式是:此外,如果只考虑您想做什么,您根本不需要使用
map()
(可能更令人困惑):此外,可以丢弃
lambda
:如您所见,上面的“技巧”代码似乎比其他答案更简洁:
所以,也许所谓的“一行”是有用的,只是当它有乐趣。。。:)
不幸的是,这是不可能的,因为body of a lambda只允许simple expressions,而
student.age += 3
是statement。所以你不能在那里用羔羊。但是,您仍然可以使用映射解决方案:注意
students2
将包含与students
相同的学生,因此您不需要捕获输出(或从incrementAge
返回某些内容)。还要注意,在Python 3中,map
返回一个需要首先迭代的生成器。您可以在它上调用list()
来执行此操作:list(map(…))
。最后,一个更好的解决方案是使用一个简单的循环。这样,你就不需要一个函数或创建一个重复的学生列表,而且你也可以非常清楚地表明你的意图:
Lambda函数只能包含表达式,不能包含语句。Python中的赋值是一个语句。Lambdas无法执行分配。此外,作业陈述式不会评估其价值,因此您的地图不会产生学生名单。
你想要这个:
这不会给你一个新的列表,它会修改旧的列表,但是你的旧列表无论如何都会被修改,你不会做任何事情来培养新的学生。
相关问题 更多 >
编程相关推荐