2016-08-18 139 views
0

我想在右边的默认参数值内的下面的函数中使用左侧参数的值。 是否可以在Python中使用默认参数值赋值的参数值?

def function(var, vartwo = var*2): 
    return vartwo 


print(function(7)) #should print 14 
print(function(7,6)) #should print 6 

但是我得到NameError:名字 '无功' 没有定义。是不是可以在Python的默认参数值中使用参数值?你会如何建议我解决这个问题?

+1

好吧,你需要传递实际的'默认',这不能是以前声明的另一个参数的名称。 def function(var,vartwo ='blabla'): return vartwo 应该可以工作 –

+0

另一件事 - 如果你需要第二个参数总是作为第一个参数 - 你不认为你需要第二个参数,def函数(var): vartwo = var return vartwo在这里是一样的。或者如果你解释为什么你需要第二个参数如此糟糕,因为从这个上下文中不清楚 –

+0

我编辑了问题以更好地解释上下文。 –

回答

3

这是不可能的;这个怎么样?

def function(var, vartwo = None): 
    if vartwo is None: 
     vartwo = var*2 
    return vartwo 

print(function(7)) 
print(function(7,6)) 

的黑客是默认值设置为None,然后将其设置在内部。如果不是,则返回用户输入的内容。

+0

那么这解决了他当前的问题,而它的原始问题依然存在。dunno,unanswered - 是否可以将先前声明的参数作为默认值传递给下一个var名称。蟒蛇说不(如预期)。但如何解决这个一般:D –

+0

是的,这将工作,有点希望不要破解。我会把它作为一个不可以在默认情况下使用参数值。我只是设置答案。 –

+0

呃......据我所知,'var'必须被定义为使用。 – TuanDT

0

你做什么不行,因为var没有被声明。这里有一个不同的方法:

def function(var, multiply=False): 
    if multiply: 
     return var * 2 
    else: 
     return var 

print(function(7, True)) # 14 
print(function(6)) # 6 
2

踢皮球:

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) 

,但我想保留原来的问题的味道:

我可以,而且可能是应该,因为写了这更简单。

+0

不错,非常pythonic – TuanDT

+0

我知道lambda函数,但介意添加解释? –

+1

@JoelAntonioDelacruzParedes,我添加了一些解释以及简化。让我知道它是否不足。 – cdlane

0

不,不可能将未在函数外定义的值用作该函数的参数值。

另外,我迟到了派对,但如果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' 

这里,argsvar后提供的参数列表,可能是一个空列表。然后,如果列表不为空(这相当于第二个参数),则返回此列表的第一个元素。如果列表为空,我们将返回var * 2

这里需要注意的是,如果提供了两个以上的参数,这不会引发相应的错误。如果len(args) > 1(记住args是参数第一个参数之后),那么您可以选择手动提高TypeError,如果这对执行很重要。

0

在默认值中不能使用另一个参数的值。原因非常简单:默认值只被计算一次:在执行函数定义时。

使用一个常见的模式是有第二个参数被设置为默认的特殊标记值,然后测试该参数是在函数内重新设置:

SENTINEL = object() 

def function(var, vartwo=SENTINEL): 
    # was vartwo set? 
    if vartwo is not SENTINEL: 
     return vartwo 

    return var * 2 

这样的函数将返回vartwo正确,即使你通过None或任何其他值,除非你明确地通过了SENTINEL常数。