0

您如何创建一个函数,该函数将返回不同的内容,具体取决于它是单独调用还是在另一个函数中调用?我的例子是在一个函数中:make_wave_snapshot(size,wavelength,phase),它返回一个二维数组并显示一个灰度图像。另一个函数:make_wave_sequence(size,wavelength,nsteps) 返回一个 3-d 数组和一个灰度图像,该图像会自动循环显示每一步的灰度图像。

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'

我知道 if name = main并且我认为这可能是答案,但这只是我被告知对检查函数有好处的东西,我不知道如何将它放入实际函数中。谢谢你。

4

2 回答 2

5

您如何创建一个函数,该函数将返回不同的内容,具体取决于它是单独调用还是在另一个函数中调用?

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

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

另请注意,检查__name__对您没有帮助,因为它包含模块名称(或者__main__如果脚本是入口点)并且与调用函数的范围没有任何关系。

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

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

在您的情况下(如果我理解正确的话),您不想make_wave_snapshotmake_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 是一种有异常的文明语言 - 使用它们。

于 2013-01-23T11:33:11.417 回答
1

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

于 2013-01-23T11:25:43.950 回答