在Python中传递默认和可选参数

时间:2017-07-13 10:46:29

标签: python function arguments default optional-arguments

def fun( key=False,*var):
  if key is False:
     print(var)
     return 0
  print("Key is true")
  return 0
fun(1,2,3)

我没有在fun(1,2,3)中传递key的值。因此,密钥的默认值即 key = False 。但输出是:

Key is true

这些案件是矛盾的。 为什么会这样?

5 个答案:

答案 0 :(得分:3)

但您确实为1传递了key[2,3]*var。{/ p>

您提供给函数的位置参数将按顺序绑定到参数变量 。关键字参数是一个例外,但是在调用函数时你必须明确地命名它们(并且你没有这样做)。

因此,您必须颠倒顺序并在结尾处放置关键字参数key。但这在Python 2中将是一个无效的语法。标准解决方案(在Python 2和Python 3 中都适用)是切换到关键字参数字典并仅在{{{}时为参数提供默认值3}}他们:

>>> def fun(*var, **kwargs):
...    key = kwargs.pop('key', False)
...    print(key)
... 
>>> fun(1,2,3)
False
>>> fun(1,2,3, key=True)
True

自Python 3.0(请参阅popping获取新语法)以来,可以在位置参数列表后面包含关键字参数,如下所示:

>>> def fun(*var, key=False):
...    print(key)
... 
>>> fun(1,2,3)
False
>>> fun(1,2,3, key=True)
True

答案 1 :(得分:0)

这里的问题是Python会将key中的第一个参数变为1,因为这是第一个也是唯一的位置参数。除了这一点之外,它是可选的这一事实。由于False显然不是var,因此它不会打印Key is true.,而是打印key。如果您希望仅fun(key=True)之类的内容访问def fun(*var,**kwargs): if "key" in kwargs and kwargs["key"] is False: print(var) return 0 print("Key is true") return 0 fun(1,2,3) fun(1,2,key=False) ,则需要使用此代码。

public class demo {
public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    String w=sc.nextLine();
    char arr[]=w.toCharArray();
    for(int i=0;i<arr.length;i++){
        System.out.println(arr[i]);
    }


}

答案 2 :(得分:0)

它正如预期的那样工作。只是为了调试,添加了一个打印声明。

def fun( key=False,*var):
    print key, var
    if key is False:
         print(var)
         return 0
    print("Key is true")
    return 0

fun(1,2,3)

快速检查命令行......解释。

>>> print True == 1
True
>>> 
>>> 1 is False
False
>>> 

这就是原因,控制没有进入if语句。

答案 3 :(得分:0)

def fun(*var, key=False):
  if key is False:
    print(var)
    return 0
  print("Key is true")
return 0
fun(1,2,3)
fun(1,2,3, key=True)

在任何函数声明中,如果你同时拥有位置和关键字参数,那么位置参数需要首先放在关键字参数上。

答案 4 :(得分:0)

默认参数应放在最后。 否则,它也将在默认参数中传递用于处理的参数。

public static class MemoryCacheHackExtensions
{
    public static long GetApproximateSize(this MemoryCache cache)
    {
        var statsField = typeof(MemoryCache).GetField("_stats", BindingFlags.NonPublic | BindingFlags.Instance);
        var statsValue = statsField.GetValue(cache);
        var monitorField = statsValue.GetType().GetField("_cacheMemoryMonitor", BindingFlags.NonPublic | BindingFlags.Instance);
        var monitorValue = monitorField.GetValue(statsValue);
        var sizeField = monitorValue.GetType().GetField("_sizedRefMultiple", BindingFlags.NonPublic | BindingFlags.Instance);
        var sizeValue = sizeField.GetValue(monitorValue);
        var approxProp = sizeValue.GetType().GetProperty("ApproximateSize", BindingFlags.NonPublic | BindingFlags.Instance);
        return (long)approxProp.GetValue(sizeValue, null);
    }
}

输出:def fun(*var, key=False): if key is False: print(var) return 0 print("Key is true") return 0 fun(1,2,3)

(1, 2, 3)

输出:def fun(*var, key=False): if key is False: print(var) return 0 print("Key is true") return 0 fun(1, 2, 3, key=True)