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