python将变量存储在函数中并在以后使用
是否可以将while循环中的变量存储到函数中,然后在循环结束时从函数中调用相同的变量 例如:在while循环期间,这里的问题是,当我尝试从store()检索变量时,它失败了……因为它需要传递参数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 = .......
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