是否可以在Python中使用默认参数值赋值的参数值?
我想在右边的默认参数值内的下面的函数中使用左侧参数的值。 是否可以在Python中使用默认参数值赋值的参数值?
def function(var, vartwo = var*2):
return vartwo
print(function(7)) #should print 14
print(function(7,6)) #should print 6
但是我得到NameError:名字 '无功' 没有定义。是不是可以在Python的默认参数值中使用参数值?你会如何建议我解决这个问题?
这是不可能的;这个怎么样?
def function(var, vartwo = None):
if vartwo is None:
vartwo = var*2
return vartwo
print(function(7))
print(function(7,6))
的黑客是默认值设置为None
,然后将其设置在内部。如果不是,则返回用户输入的内容。
那么这解决了他当前的问题,而它的原始问题依然存在。dunno,unanswered - 是否可以将先前声明的参数作为默认值传递给下一个var名称。蟒蛇说不(如预期)。但如何解决这个一般:D –
是的,这将工作,有点希望不要破解。我会把它作为一个不可以在默认情况下使用参数值。我只是设置答案。 –
呃......据我所知,'var'必须被定义为使用。 – TuanDT
你做什么不行,因为var没有被声明。这里有一个不同的方法:
def function(var, multiply=False):
if multiply:
return var * 2
else:
return var
print(function(7, True)) # 14
print(function(6)) # 6
踢皮球:
def function(var, *args):
return (lambda var, vartwo=var * 2: vartwo)(var, *args)
print(function(7)) # should print 14
print(function(7, 6)) # should print 6
I know about lambda functions but mind adding explanation?
既然我们不能在vartwo
的定义中使用var
,我们通过建立一个新的参数列表拖延,通过一个lambda
,其中var
现在被定义,vartwo
的默认值是合法的。
我做了这个有点通过重用var
变量名代表两个不同的变量(一个正式的参数function
和正式的参数lambda
),也作为一个位置占位混乱。
def function(var, *args):
return (lambda vartwo=var * 2: vartwo)(*args)
,但我想保留原来的问题的味道:
我可以,而且可能是应该,因为写了这更简单。
不,不可能将未在函数外定义的值用作该函数的参数值。
另外,我迟到了派对,但如果None
是第二个参数,那么短而简单的工作如何?
def function(var, *args):
return args[0] if args else var * 2
print(function(7)) # prints 14
print(function(7, 6)) # prints 6
print(function(7, None)) # prints 'None'
这里,args
是var
后提供的参数列表,可能是一个空列表。然后,如果列表不为空(这相当于第二个参数),则返回此列表的第一个元素。如果列表为空,我们将返回var * 2
。
这里需要注意的是,如果提供了两个以上的参数,这不会引发相应的错误。如果len(args) > 1
(记住args
是参数第一个参数之后),那么您可以选择手动提高TypeError
,如果这对执行很重要。
在默认值中不能使用另一个参数的值。原因非常简单:默认值只被计算一次:在执行函数定义时。
使用一个常见的模式是有第二个参数被设置为默认的特殊标记值,然后测试该参数是在函数内重新设置:
SENTINEL = object()
def function(var, vartwo=SENTINEL):
# was vartwo set?
if vartwo is not SENTINEL:
return vartwo
return var * 2
这样的函数将返回vartwo
正确,即使你通过None
或任何其他值,除非你明确地通过了SENTINEL
常数。
好吧,你需要传递实际的'默认',这不能是以前声明的另一个参数的名称。 def function(var,vartwo ='blabla'): return vartwo 应该可以工作 –
另一件事 - 如果你需要第二个参数总是作为第一个参数 - 你不认为你需要第二个参数,def函数(var): vartwo = var return vartwo在这里是一样的。或者如果你解释为什么你需要第二个参数如此糟糕,因为从这个上下文中不清楚 –
我编辑了问题以更好地解释上下文。 –