更改函数内函数的输出

时间:2013-01-23 11:14:17

标签: python numpy

如何创建一个函数,它将返回不同的东西,这取决于它是单独调用还是在另一个函数中调用?我的例子是在函数中:make_wave_snapshot(大小,波长,相位),它返回一个二维数组,并且还显示一个灰度图像。另一个函数:make_wave_sequence(size,wavelength,nsteps)返回一个三维数组,还有一个灰度图像,可自动循环显示每一步的灰度图像。

def make_wave_snapshot(size,wavelength,phase):
    waves_array = np.zeros((size,size),np.float)
        if size%2==0:
            for y in range(size):
                for x in range(size):
                    r = math.hypot((size/2 - x - 0.5),(size/2 - y - 0.5))
                    d = np.sin((2*math.pi*r/wavelength)-phase)/np.sqrt(r)
                    waves_array[y,x] = d
  !!!       # dp.display_2d_array(waves_array) #Shows visual representation
            return waves_array #Displays array showing values
        else:
            return 'Please use integer of size.'

def make_wave_sequence(size,wavelength,nsteps):
    waves_sequence = np.zeros((nsteps,size,size),np.float)
        if nsteps%1==0:
            for z in range(nsteps):
                waves_sequence[z] = make_wave_snapshot(size,wavelength,(2*math.pi*z/nsteps))
  !!!        #  dp.display_3d_array(waves_sequence)
                return waves_sequence #Displays array showing values
            else:
                return 'Please use positive integer for number of steps'

我知道名称 = 主要,我认为这可能就是答案,但这只是我被告知有助于检查功能的东西不知道如何将它融入实际功能。谢谢。

2 个答案:

答案 0 :(得分:5)

  

如何创建一个函数,它将返回不同的东西,这取决于它是单独调用还是在另一个函数中调用?

你没有。你的用例甚至不需要它。

理论上可以通过使用检查模块或其他检查堆栈帧的方法来实现,但这将是一个非常糟糕的主意。函数应该是可预测的,无论它在何处被调用都可以做同样的事情。

另请注意,检查__name__对您没有帮助,因为它包含模块名称(如果脚本是入口点,则为__main__)并且与作用域的范围无关被称为。

如果你希望你的函数做两件事,一种方法是使用一个额外的参数默认为None,你用它作为一个标志来指示函数是否应该遵循第二条路径:

def example(a, b, do_b=None):
    if do_b is None:
        return a
    else:
        return b

在您的情况下(如果我理解正确),您不希望在make_wave_snapshot内调用make_wave_sequence时显示图像。这与返回值无关,可以通过向函数添加额外的参数来解决,如上所述:

def make_wave_snapshot(size,wavelength,phase,display=True):
    #your code here
    #...
    if display:
        dp.display_2d_array(waves_array) #Shows visual representation

现在你只需在另一个函数内部使用额外的False来调用它:

waves_sequence[z] = make_wave_snapshot(size,wavelength,(2*math.pi*z/nsteps), False)

哦,请永远使用返回值作为错误条件的指示,就像你在循环的else情况下一样。你不是在这里写C,python是一种具有例外的文明语言 - 使用它们。

答案 1 :(得分:1)

一种肮脏但快速的方法是在函数中添加一个参数,根据需要切换其行为 - 假设是你在代码中调用函数,你使用(或不使用)切换取决于你在哪里调用它。不完美的解决方案,但肯定会起作用并且易于实施。