使用lambda函数更改属性值

2024-09-29 03:37:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以使用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)

Tags: 对象lambda函数nameself列表age属性
3条回答

使用一个简单的for循环来检索students来更新每个的age已经足够好了,就像其他人所说的,但是如果您仍然想使用lambda来更新值,则可能需要利用exec()函数:

_ = list(map(lambda student: exec("student.age+=3"), students))
for _ in students: print(_.age)

输出:

21 23 32

在这种情况下,更新实际上是exec(),而map()只产生None。所以返回的结果毫无意义,我用_来澄清这一点。更简洁的形式是:

list(map(lambda _: exec("_.age+=3"), students))

此外,如果只考虑您想做什么,您根本不需要使用map()(可能更令人困惑):

[(lambda _: exec("_.age += 3"))(_) for _ in students]

此外,可以丢弃lambda

[exec("_.age += 3") for _ in students]

如您所见,上面的“技巧”代码似乎比其他答案更简洁:

for s in students:
    s.age += 3

所以,也许所谓的“一行”是有用的,只是当它有乐趣。。。:)

不幸的是,这是不可能的,因为body of a lambda只允许simple expressions,而student.age += 3statement。所以你不能在那里用羔羊。但是,您仍然可以使用映射解决方案:

def incrementAge (student):
    student.age += 3
    return student

students2 = map(incrementAge, students)

注意students2将包含与students相同的学生,因此您不需要捕获输出(或从incrementAge返回某些内容)。还要注意,在Python 3中,map返回一个需要首先迭代的生成器。您可以在它上调用list()来执行此操作:list(map(…))

最后,一个更好的解决方案是使用一个简单的循环。这样,你就不需要一个函数或创建一个重复的学生列表,而且你也可以非常清楚地表明你的意图:

for student in students:
    student.age += 3

Lambda函数只能包含表达式,不能包含语句。Python中的赋值是一个语句。Lambdas无法执行分配。此外,作业陈述式不会评估其价值,因此您的地图不会产生学生名单。

你想要这个:

for student in students:
    student.age += 3

这不会给你一个新的列表,它会修改旧的列表,但是你的旧列表无论如何都会被修改,你不会做任何事情来培养新的学生。

相关问题 更多 >