我可以为其他函数参数引用或重用Python函数参数吗?
我正在创建一个函数,将一个或两个形状列表a=[x1,y1,c1]/我可以为其他函数参数引用或重用Python函数参数吗?,python,function,parameter-passing,Python,Function,Parameter Passing,我正在创建一个函数,将一个或两个形状列表a=[x1,y1,c1]/B=[x2,y2,c2]作为输入。如果提供了两个形状A和B,则在各自的位置A和B使用每个形状。如果只提供了一个形状(A),默认情况下,函数会在两个不同的位置隐式使用它 我用if-else构造解决了这个问题: def data_process(shape_A, shape_B = None): # ... some code ... res1 = process.shape(shape_A) # shape A is
B=[x2,y2,c2]
作为输入。如果提供了两个形状A和B,则在各自的位置A和B使用每个形状。如果只提供了一个形状(A),默认情况下,函数会在两个不同的位置隐式使用它
我用if-else构造解决了这个问题:
def data_process(shape_A, shape_B = None):
# ... some code ...
res1 = process.shape(shape_A) # shape A is always used
if shape_B is not None:
res2 = process.shape(shape_B)
else:
res2 = process.shape(shape_A)
return res1, res2
data_process(my_shape_A) # call 1
data_process(my_shape_A, shape_B=my_shape_B) # call 2
然而,我认为更优雅的方法是在函数定义中引用shape_A作为默认值,使用shape_B=shape_A
:
def data_process(shape_A, shape_B = shape_A):
# ... some code ...
res1 = process.shape(shape_A) # shape_A is always used
res2 = process.shape(shape_B) # if shape_B not provided, shape_B = shape_A
return res1, res2
因为简单地这样做会给我一个错误,我正在引用未知变量,我想知道:有没有一种方法可以引用或重用Python函数参数作为(相同函数的)其他函数参数
这只是一个简单的用例,但我认为基于其他函数参数的默认函数参数对于节省几行代码非常有用。不,没有。但是有什么问题吗
def data_process(shape_A, shape_B = None):
if shape_B is None:
shape_B = shape_A
# rest of function not worrying about whether shape_B was passed or not
?从逻辑或效率的角度来看,我认为您当前的代码没有任何错误。有一些选择你可以考虑的只是美学原因。< /P> 这假设一个形状(如果提供)是一个元组
def data_process2(shape_A, shape_B=None):
res1 = process.shape(shape_A)
res2 = process.shape(shape_B if shape_B else shape_A)
return res1, res2
def data_process3(shape_A, shape_B=None):
if shape_B:
shape_B = shape_A
res1 = process.shape(shape_A)
res2 = process.shape(shape_B)
return res1, res2
函数头中的
shape\u A
只不过是一个位置参数的名称。您使用的if-else
和None
是正确的。谢谢,“不,没有”回答了我的问题,所以我接受。正如您和其他人指出的,我想这些版本没有什么问题-我只是希望所有的“默认值”逻辑都放在一个地方-而不是:def fn(
some default value):“”
。。。一个长的fn文档…'
一些更多的默认值,以及可能大量的初始化代码函数的其余部分
。我感到惊讶的是,尽管表面上没有这样的事情,但没有人欣赏我心目中的美好;]原因在于python的工作方式def f(x=a):pass
在定义函数时计算a
,而不是在调用函数时。Soa=3;def f(x=a):pass
与def f(x=3)相同,非常有用。你的建议将使a=3;def f(a,b=a):传递不明确。这是错误的建议。传递shape_B=0
与传递shape_B=None
不同,但两者都会导致此代码中的shape_B==shape_A
。如果shape_B不是其他任何shape_A
@FHTMitchell,则使用shape_B,我不同意。一个形状,如果提供的话,应该是一个元组,例如(0,0,0)
,被认为是True
。如果用户想让自己的代码完全防傻瓜,他应该应用类型检查或尝试/除了(确保没有整数,甚至字符串!)。为了举例说明,尝试x=np.empty((0));布尔(x.shape)
x=np.arange(5);x、 形状=5;打印(x)
是有效的numpy。更重要的是y=np.array([]);y、 形状=0;打印(y)
也可以。您演示的x=np.empty((0))
是另一个很好的例子,因为(0)!=(0,)
。你的例子证明了我的观点!将形状设置为整数时,它将存储为元组<代码>x=np.arange(5);x、 形状=5;i实例(x.shape,tuple)
。即使对于空数组的情况..对,所以将整数形状传递给numpy也是有效的。谁在乎它们是如何储存的?关键是上面的函数(process.shape
)很可能正在做我正在做的事情,限制它有什么意义?