Python 在函数中更改函数的输出

Python 在函数中更改函数的输出,python,numpy,Python,Numpy,如何创建一个函数,该函数将返回不同的内容,这取决于它是自己调用的还是在另一个函数中调用的?我的例子是,在一个函数中:make_wave_snapshot(大小、波长、相位),它返回一个二维数组,还显示一个灰度图像。另一个函数:make_wave_sequence(大小、波长、nsteps)返回一个3-d数组和一个灰度图像,该灰度图像自动循环通过每个步骤的灰度图像 def make_wave_snapshot(size,wavelength,phase): waves_array = np

如何创建一个函数,该函数将返回不同的内容,这取决于它是自己调用的还是在另一个函数中调用的?我的例子是,在一个函数中:make_wave_snapshot(大小、波长、相位),它返回一个二维数组,还显示一个灰度图像。另一个函数:make_wave_sequence(大小、波长、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'

我知道ifname=main,我想这可能就是答案,但我只是听说它对检查函数很有用,我不知道如何将它应用到实际函数中。谢谢。

一种肮脏但快速的方法是向函数添加一个参数,在这里您可以根据需要切换其行为-鉴于在代码中调用函数的是您,您可以使用(或不使用)切换,具体取决于您在何处调用它。这不是一个完美的解决方案,但肯定会起作用,而且很容易实现。

一种肮脏但快速的方法是向函数添加一个参数,在这里您可以根据需要切换其行为-鉴于在代码中调用函数的是您,您可以根据调用它的位置使用(或不使用)切换。这不是一个完美的解决方案,但肯定会奏效,而且很容易实现

如何创建一个函数,该函数将返回不同的内容,这取决于它是自己调用的还是在另一个函数中调用的

您不需要。而且您的用例甚至不需要它

理论上,使用inspect模块或其他检查堆栈帧的方法可以实现这一点,但这是一个非常糟糕的想法。函数应该是可预测的,并且无论在何处调用它,都应该执行相同的操作

还请注意,检查
\uuuuuuu name\uuuuuuu
对您没有帮助,因为它包含模块名称(或者
\uuuuuuuuuu main\uuuuuu
,如果脚本是入口点),并且与调用函数的范围无关

如果希望函数执行两种不同的操作,一种方法是使用一个默认为
None
的额外参数,您可以使用该参数作为标志,指示函数是否应遵循第二条路径:

def example(a, b, do_b=None):
    if do_b is None:
        return a
    else:
        return b
在您的情况下(如果我理解正确),您不希望在调用
make\u wave\u snapshot
make\u wave\u序列内部时显示图像。这与返回值无关,可以通过向函数添加额外参数来解决,如上所述:

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是一种有例外的文明语言——使用它们

如何创建一个函数,该函数将返回不同的内容,这取决于它是自己调用的还是在另一个函数中调用的

您不需要。而且您的用例甚至不需要它

理论上,使用inspect模块或其他检查堆栈帧的方法可以实现这一点,但这是一个非常糟糕的想法。函数应该是可预测的,并且无论在何处调用它,都应该执行相同的操作

还请注意,检查
\uuuuuuu name\uuuuuuu
对您没有帮助,因为它包含模块名称(或者
\uuuuuuuuuu main\uuuuuu
,如果脚本是入口点),并且与调用函数的范围无关

如果希望函数执行两种不同的操作,一种方法是使用一个默认为
None
的额外参数,您可以使用该参数作为标志,指示函数是否应遵循第二条路径:

def example(a, b, do_b=None):
    if do_b is None:
        return a
    else:
        return b
在您的情况下(如果我理解正确),您不希望在调用
make\u wave\u snapshot
make\u wave\u序列内部时显示图像。这与返回值无关,可以通过向函数添加额外参数来解决,如上所述:

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是一种有例外的文明语言——使用它们