2013-01-23 28 views
0

如何创建一个函数,根据函数是在其自身还是在另一个函数内调用,返回不同的东西?我的例子是在一个函数中:make_wave_snapshot(大小,波长,相位),它返回一个二维数组,并且还显示一个灰度图像。另一个函数:make_wave_sequence(尺寸,波长,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' 

我知道,如果 = 主要,我认为这很可能是答案,但它只是我一直在说是良好的检查功能,我没有任何想法如何使其适合实际功能。谢谢。

回答

5

如何创建一个函数,根据函数是自己调用还是在其他函数中调用不同的函数?

你不知道。它甚至不需要你的用例。

这在理论上可以通过使用检查模块或其他方式来检查堆栈帧,但这是一个非常糟糕的主意。一个函数应该是可预测的,并且执行相同的事情,而不管它被调用的地方。

另外请注意,检查__name__不会帮助你,因为它包含的模块名称(或__main__如果脚本入口点),并没有任何与该范围功能要求收回。

如果你希望你的函数做两个不同的东西,一种方法是使用一个额外的参数默认为None,您可以使用作为一个标志,表示如果函数应遵循的第二条路径:

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

在你的情况(如果我理解正确),你不想显示图像en在make_wave_sequence内部呼叫make_wave_snapshot。这有没有关系返回值和如上所述可以通过增加额外的函数参数来解决:

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

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