簡體   English   中英

python在函數中存儲變量並在以后使用它

[英]python store variable in function and use it later

是否可以將while循環中的變量存儲到函數中,然后在循環結束時從函數中調用該變量

例如:在while循環期間,問題在於當我嘗試從store()檢索變量時它失敗了......因為它需要傳遞參數。

def store(a,b,c):
    x1 = a
    y1 = b
    z1 = c
    return (x1,y1,z1)

def main():
    while condition:
          x = .......
          y = .......
          z = .......
          ......
          ......
          store(x,y,z) #store to function...
          ......
          ......
          ......
          s1,s2,s3 = store()
          ......
          ......
          ......

正如其他人所說,可能有一個比這更合適的選擇,但在某些情況下(可能在REPL中)可能會很方便。 這是一個簡單的函數,可以使用任意數量的值執行您想要的操作。

def store(*values):
    store.values = values or store.values
    return store.values
store.values = ()

>>> store(1, 2, 3)
>>> a, b, c = store()
>>> print a, b, c
1 2 3
>>> store(4, 5)
>>> a, b = store()
>>> print a, b
4 5

嗯,除非我誤解,這是一個非問題的經典非解決方案。

為什么不直接使用這種語言呢?

while condition:

   x = something
   y = else
   z = altogether
   ...
   save_state = (x,y,z)   ## this is just a python tuple.
   ...
   # do something else to x, y and z, I assume
   ...
   x, y, z = save_state

根據xyz的類型,您可能必須小心將copy存儲到元組中。

(另外,你的縮進是錯誤的,並且在python中沒有end這樣的東西。)

更新:好的,如果我理解得更好,問題就是能夠在下次通過時使用之前的值。 在最簡單的情況下,根本沒有問題:下一次循環時, xyz是它們在前一次循環結束時的任何值(這是所有編程的方式)語言工作)。

但如果你想明確,請嘗試這樣的事情:

 x_prev = some_starting_value
 x = some_starting_value
 while condition:
      x = something_funky(x_prev)

      .... other stuff ....

      x_prev = x

(但請再次注意,這里根本不需要x_prevx=something_funky(x)將起作用。)

從技術上講,如果你有一個深刻的,強烈的願望用函數來做這件事,你總是可以用一個閉包(就像我們所知,一個窮人的對象)來做:

def store(a,b,c):
    def closure():
        return (a,b,c)
    return closure

stored = store(1,2,3)
print stored()

打印(1,2,3)

盡管這是一個壞主意,但我喜歡在這里應用奇怪的解決方案

class Store(object):
    def __init__(self, f):
        self.f = f
        self.store = None

    def __call__(self, *args):
        self.store = self.f(*args)

@Store        
def test(a,b,c):
    return a+b+c

print test(1,2,3)
print test.store

用Store裝飾函數然后調用function.store來獲取你在其中調用的內容,如果函數從未調用它返回一個None,你可以使它引發異常,但我個人並不想這樣做。

不,你不能這樣做。

此外,這是一個可怕的,可怕的想法。 “存儲到函數”是一件非常糟糕的事情,我不願意提供工作代碼。

使用可調用對象。

class Store( object ):
    def __init__( self ):
        self.x, self.y, self.z = None, None, None
    def __call__( self, x=None, y=None, z=None ):
        if x is None and y is None and z is None:
            return self.x, self.y, self.z
        else:
            self.x, self.y, self.z = x, y, z

更好的是做一些更簡單的事情,不涉及具有魔法屬性的函數,當使用和不使用參數調用時,它會執行兩個不同的事情。

任何東西都比“存儲功能”更好。 任何東西。

真。

任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM