python将变量存储在函数中并在以后使用

python将变量存储在函数中并在以后使用,python,Python,是否可以将while循环中的变量存储到函数中,然后在循环结束时从函数中调用相同的变量 例如:在while循环期间,这里的问题是,当我尝试从store()检索变量时,它失败了……因为它需要传递参数 def store(a,b,c): x1 = a y1 = b z1 = c return (x1,y1,z1) def main(): while condition: x = ....... y = .......

是否可以将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()
          ......
          ......
          ......
不,你不能这样做

而且,这是一个非常糟糕的想法。“存储到函数”是一件非常糟糕和错误的事情,以至于我在提供工作代码时犹豫不决

使用可调用对象

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
更好的做法是做一些更简单的事情,不涉及一个具有神奇属性的函数,该函数在有参数和无参数调用时可以做两件不同的事情

任何东西都比“存储到函数”好。什么都行

真的


任何东西。

从技术上讲,如果你对函数有着强烈的渴望,你总是可以通过闭包来实现(我们都知道,闭包是穷人的目标):


打印在
(1,2,3)
Hmmm中,除非我有误解,否则这是一个典型的非问题解决方案

为什么不直接使用这种语言呢

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
根据
x
y
z
的类型,可能需要小心地将
副本
存储到元组中

(另外,缩进是错误的,python中没有
end
这样的东西。)

更新:好的,如果我理解得更好,问题是下次通过时是否能够使用上一个值。在最简单的情况下,根本没有问题:下一次通过循环时,
x
y
z
的值与上一次循环结束时的值相同(这是所有编程语言的工作方式)

但是,如果您想明确,请尝试以下方式:

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

      .... other stuff ....

      x_prev = x

(但请再次注意,在这里您根本不需要
x\u prev
x=something\u funky(x)
将起作用。)

正如其他人所说,可能有比这更合适的选择,但在某些情况下(可能在REPL中)可能会更方便。这里有一个简单的函数,它可以处理任意数量的值

def store(*values):
    store.values = values or store.values
    return store.values
store.values = ()
例子
虽然这是个坏主意,但我喜欢应用奇怪的解决方案,所以这里

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,您可以让它引发一个异常,但我个人不想这样做。

我第一次看到您提出这样的想法?为什么不执行
all(x,y,z)
?@Jakob Bowyer:需求太模糊,无法确定这就是目的所在。整个“存储到函数”和“具有不同行为的函数名”是如此奇特,以至于很难找到一种“正确”的方法来做这两件事。可调用对象在语法上似乎很接近,但是。Sheesh。我最后写了一个装饰程序tbh。我想要的是,当循环运行时,它应该存储以前的状态,所以“x,y,z=save_state”将在以前的循环中具有x,y,z的值…@kridigitx:“我想要的是它应该存储以前的状态”?什么?请更新您的问题,使其非常具体地说明您想要什么。你的问题并没有表明这是一项要求。请解决这个问题。我的意思是,当循环运行x、y和z时,不断得到新的值,我想存储x、y、z的值,并在下次循环运行时调用它们……希望你现在明白了。@Kristigitx:我(仍然)不明白。“下次跑步”是什么意思?您是否只希望在上一次迭代中获得该值?如果是这样,这很容易(但与python无关:在循环开始时,
x,y,z
已经具有上一次迭代的值(第一次到第二次迭代除外).-1:这基本上毫无意义。
store=x,y,z
s1,s2,s3=store
工作得很好。为什么要弄乱更复杂的函数语法?你想要函数中的静态变量?…你知道,我认为对象是穷人的闭包,但这正是我的观点,伙计。神奇的是,两者都是真的。W这就是为什么思维正确的人在应该使用闭包时使用闭包,在应该使用对象时使用对象。
>>> 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
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