2013-09-01 144 views
-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'做一個函數,因爲會有很長的不同函數列表。整個過程應該發生在一個列表或其他存儲對象中(可能是類,但我真的很難與它們取暖) 我無法真正解釋我嘗試完成它的一段有點尷尬的代碼片段。

+1

好吧,如果你不喜歡的網站,沒有人讓你用它。 – iCodez

+0

我不知道我是否喜歡這個網站,但它有設計上的缺陷,我想鼓勵他們看看。 – user2737835

+3

關於SO本身的評論,建議,投訴等可以發佈在[meta](http://meta.stackoverflow.com/)上。你的問題不是這樣做的地方:它只是噪音。 –

回答

1

SymPy將允許您表達和評估數學運算,同時推遲最終結果直到需要。

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時是否是lambda或「普通物體」時無需知道,並且您可以像這樣訪問它們:

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 
1

您可以使用functions,lambdasclassesproperties完成該操作。

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