2013-01-23 30 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

這樣做的一個骯髒但快速的方法是在函數中添加一個參數,在其中根據需要切換其行爲 - 考慮到您在代碼中調用函數的事實是,您使用(或不使用)該開關取決於你在哪裏調用它。不完美的解決方案,但肯定會工作,並易於實施。