-4

我想在 Python 中做这样的事情:

b = 2
c = 3
a = (b*c)
b = 10
print a
30

或者:

b = a = 2
a = 10
print b
10

我想做的另一件事是

l = [a + b + c]
print l
a + b + c # As a function not as a result so again if i change a the list entry should change

这应该是即时的,我不能为每个“a”创建一个函数,因为会有很长的不同函数列表。整个过程应该发生在一个列表或其他存储对象中(可能是类,但我真的很难对它们产生热情)我无法真正解释我试图完成它有点尴尬的代码。

4

3 回答 3

4

你可以使用 lambda 函数来做这种事情。

In [1]: b = 2

In [2]: c = 3

In [3]: a = lambda: b * c

In [4]: a
Out[4]: <function __main__.<lambda>>

In [5]: a()
Out[5]: 6

In [6]: b = 10

In [7]: a()
Out[7]: 30

而且,对于列表:

In [8]: l = lambda: [a(), b, c]

In [9]: l()
Out[9]: [30, 10, 3]

In [10]: b = 1

In [11]: l()
Out[11]: [3, 1, 3]

如果您不想将 a 和 l 作为函数调用,可以将它们封装在这样的类中:

class A(object):
    @property
    def a(self):
        if callable(self._a):
            return self._a()
        else:
            return self._a
    @a.setter
    def a(self, value):
        self._a = value
    @property
    def b(self):
        if callable(self._b):
            return self._b()
        else:
            return self._b
    @b.setter
    def b(self, value):
        self._b = value

然后,你在操作时不必知道 a 和 b 是 lambdas 还是“普通对象”,你可以像这样访问它们:

In [13]: x = A()

In [14]: x.a = lambda: x.b * 2

In [15]: x.b = 3

In [16]: x.a
Out[16]: 6

In [17]: x.b = 4

In [18]: x.a
Out[18]: 8
于 2013-09-01T19:08:01.417 回答
1

SymPy将允许您表达和评估数学运算,同时将最终结果推迟到需要时。

于 2013-09-01T19:07:11.117 回答
1

您可以使用functionslambdasclasses来完成此操作properties

def c():
  return a * b

c = lambda: a * b

class myclass(object):
  a = 10
  b = 12

  @property
  def c(self):
    return self.a * self.b

在前两个示例中,它们将被调用为c(),在第三个示例中,您需要:

instance = myclass()
print instance.c
# change a
instance.a = 12
print instance.c
于 2013-09-01T19:08:45.907 回答