让我们看一下打击示例
import numpy as np
def Test2(t):
ran=np.random.randint(5)
return t-ran
def Test3(t):
test2=Test2(t)
return t**2-test2
a1=Test3(1.0)
a2=Test3(1.0)
a3=Test3(1.0)
print(a1==a2,a1==a3,a2==a3)
答案是错误的,因为每次我调用Test3()时,它都会经过Test2()中的随机部分,并给我不同的结果。因此,我该如何使用相同的Test3()进行进一步的计算,这意味着我只想通过一次Test2()并获得一个常数Test3()。
因为我需要Test3()来进行更多计算,例如查找根,所以这意味着我需要在以后多次调用Test3()。
答案 0 :(得分:2)
Sam Hollenbach的解决方案很好,但考虑到您非常孤立的问题,它的解决方案相当复杂。 我建议将随机值作为参数传递给Test3。
import numpy as np
def Test2(t):
ran=np.random.randint(5)
return t-ran
def Test3(t, ran):
return t**2-ran
ran = Test2(1.0)
a1=Test3(1.0, ran)
a2=Test3(1.0, ran)
a3=Test3(1.0, ran)
print(a1==a2,a1==a3,a2==a3)
这将隔离随机性,并且比为它提供一个类更接近您提供的代码。
答案 1 :(得分:1)
有很多方法可以做到这一点。以下所有方法将显示(True, True, True)
import numpy as np
class TestClass:
def __init__(self):
self.test2out = None
def Test2(self, t):
ran=np.random.randint(5)
return t-ran
def Test3(self, t):
if self.test2out is None:
self.test2out = self.Test2(t)
return t**2-self.test2out
testClass = TestClass()
a1=testClass.Test3(1.0)
a2=testClass.Test3(1.0)
a3=testClass.Test3(1.0)
print(a1==a2,a1==a3,a2==a3)
import numpy as np
def memoize(function):
"""Provides a decorator for memoizing functions"""
from functools import wraps
memo = {}
@wraps(function)
def wrapper(*args):
if args in memo:
return memo[args]
else:
rv = function(*args)
memo[args] = rv
return rv
return wrapper
@memoize
def Test2(t):
ran=np.random.randint(5)
return t-ran
def Test3(t):
test2 = Test2(t)
return t**2-test2
a1=Test3(1.0)
a2=Test3(1.0)
a3=Test3(1.0)
print(a1==a2,a1==a3,a2==a3)
来源:Wikipedia
import numpy as np
test2outcome = None
def Test2(t):
ran=np.random.randint(5)
return t-ran
def Test3(t):
global test2outcome
if test2outcome is None:
test2outcome = Test2(t)
return t**2-test2outcome
a1=Test3(1.0)
a2=Test3(1.0)
a3=Test3(1.0)
print(a1==a2,a1==a3,a2==a3)
答案 2 :(得分:1)
您可以在Test3中植入随机生成器。这样可以确保Test3是可预测的,同时保持Test2的伪随机性:
import numpy as np
def Test2(t):
ran=np.random.randint(5)
return t-ran
def Test3(t):
np.random.seed(0)
test2=Test2(t)
return t**2-test2
a1=Test3(1.0)
a2=Test3(1.0)
a3=Test3(1.0)
print(a1==a2,a1==a3,a2==a3)