我怎么了?关于“oneline FOR statement”和“EXEC”

2024-10-03 06:32:17 发布

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

        r = []
        for e in self.leftCounter[0]:
            r.append(0)
        for i in self.leftCounter:
            r = map(operator.__add__, r, i)
        self.leftCounter = r

        r = []
        for e in self.rightCounter[0]:
            r.append(0)
        for i in self.rightCounter:
            r = map(operator.__add__, r, i)
        self.rightCounter = r

        r = []
        for e in self.neutralCounter[0]:
            r.append(0)
        for i in self.neutralCounter:
            r = map(operator.__add__, r, i)
        self.neutralCounter = r

嗨,我是python新手(也是编程语言)。我一个人想了这么长时间,但最后还是决定问。上面的代码对我来说很好。但当我试图更改到下面的代码时,它不起作用。而且没有特定的错误消息。它只会给我一个类似“无效语法(,第1行)”的消息。我用的是2.7.6版。你知道吗

        r = []
        for i in ['self.leftCounter', 'self.rightCounter', 'self.neutralCounter']:
            exec '[r.append(0) for e in %s[0]]' % i
            exec '[r = map(operator.__add__, r, i) for i in %s]' % i
            exec '%s = r' % i

有人能给我一个提示吗? 非常感谢。你知道吗


Tags: 代码inselfadd消息mapforoperator
1条回答
网友
1楼 · 发布于 2024-10-03 06:32:17

不要使用exec。改用^{}^{}

for name in ['leftCounter', 'rightCounter', 'neutralCounter']:
    r = getattr(self, name)[0]
    for i in getattr(self, name):
        r = map(operator.__add__, r, i)
    setattr(self, name, r)

如果您的输入列表是静态的,您可以存储对属性的直接引用:

for attr in (self.leftCounter, self.rightCounter, self.neutralCounter):
    r = attr[0]
    for i in attr:
        r = map(operator.__add__, r, i)
    attr[:] = r

假设所有三个属性都是列表,允许我们使用切片分配来替换每个列表的内容,而不是重新绑定。你知道吗

相关问题 更多 >