2014-02-19 39 views
1

我最近一直在使用tkinter和Python,并且我在创建tkinter中的对象实例时传递参数的方式感到困惑。为什么/某些课程需要一切可能的论证,有些则不需要?

当我自己创建一个类时,可以传递的每个参数都有被传递。但是,在tkinter中创建任何小部件的实例时,并非每个可能的参数都必须立即传递。他们每个默认为一个特定的值。考虑以下代码,用来创建一个画布组件:

canvas = tkinter.Canvas(root, width = 400, height = 250) 

值(400,25)甚至都不需要传递,从而,他们通过自带的名称(宽,高)确定值之前。还有其他值,我可以指定,(例如:背景,边界),但没有必要,因为默认值是好的。

我已经搜索了很长时间试图找到答案,但是,由于我不完全确定要调用这些特殊参数,所以很难找到任何关于此的内容。

+0

请参阅[本教程中的此部分](http://docs.python.org/2/tutorial/controlflow.html#more-on-defining-functions) –

回答

3
  1. 有一种叫做,默认参数,

    def default_parameters(var1 = "cabbage"): 
        print var1 
    
    default_parameters(var1 = "salad")  # salad 
    default_parameters("salad")   # salad 
    default_parameters()     # cabbage 
    default_parameters("salad", "cabbage") # Error! Expects only one parameter 
    

    在这里,如果没有参数传递,假设在定义中指定的默认值。

  2. 如果你想接受许多参数,你可以在这样

    def many_parameters(var1, var2 = "cabbage", *args): 
        print var1, var2, args 
    
    many_parameters("salad", "cabbage", "rabbit", "ninja", "puppy") 
    # salad cabbage ('rabbit', 'ninja', 'puppy') 
    many_parameters("salad", "cabbage", "rabbit", "ninja") 
    # salad cabbage ('rabbit', 'ninja') 
    many_parameters("salad", "cabbage", "rabbit") 
    # salad cabbage ('rabbit',) 
    many_parameters("salad", "cabbage") 
    # salad cabbage 
    many_parameters("salad") 
    # salad cabbage 
    many_parameters() 
    # many_parameters() takes at least 1 argument (0 given) 
    many_parameters("salad", var2 = "ninja", "puppy") 
    # SyntaxError: non-keyword arg after keyword arg 
    many_parameters("salad", "puppy", var2 = "ninja") 
    # many_parameters() got multiple values for keyword argument 'var2' 
    

    这里的参数部分解包,在第一种情况中,saladcabbage被分配到var1var2,但休息的值作为元组分配给args

    第二和第三种情况与第一种情况相同。

    第四种情况没有多余的参数,所以args将为空。

    第五情况下得到了没有多余的参数,并为var2没有价值,所以args将是空的,并假定为var2默认值(cabbage)。

    在第六种情况下,var1没有提供任何默认值。因此,它失败,出现at-least 1 argument expected错误。

    在第七种情况下,在未命名参数之前使用var2(一个命名变量)。这在Python中是错误的。

    在第八情况下,两个var2(命名变量)和puppy位置参数)被设置为var2。现在,Python无法决定为var2使用哪个值。所以它失败了。

  3. 在前面的例子中,我们看到了如何处理默认参数和命名参数。现在,命名参数也被称为关键字参数,通常表示为**kwargs,它实际上是所有命名参数的键值对的字典。 注意:默认参数不计为关键字参数。

    def all_parameters(var1, var2 = "cabbage", *args, **kwargs): 
        print var1, var2, args, kwargs 
    
    all_parameters("salad", "cabbage", "rabbit") 
    # salad cabbage ('rabbit',) {} 
    all_parameters("salad", "cabbage") 
    # salad cabbage() {} 
    all_parameters("salad") 
    # salad cabbage() {} 
    all_parameters("salad", var2 = "ninja", "puppy") 
    # SyntaxError: non-keyword arg after keyword arg 
    all_parameters("salad", "puppy", var2 = "ninja") 
    # all_parameters() got multiple values for keyword argument 'var2' 
    all_parameters("salad", moderator="jonclements", python="martijinpieters") 
    # salad cabbage() {'moderator': 'jonclements', 'python': 'martijinpieters'} 
    

    我相信,除了最后一项之外,其他所有项都已经在前面的两个例子中讨论过了。在最后一种情况下,所有非默认但命名的参数都存储在kwargs字典中。

注:记得**kwargs*args***,在函数定义。他们负责传递给函数的参数的包装。

1

我们来举个例子吧。

def spam(a=1, b=2, c=3): 
    print a, b, c 

该函数有三个参数,所有参数都有默认值。所以我可以在很多方面使用这个函数。

>>> spam() # uses the default values 
1 2 3 
>>> spam(3) # use default for b and c 
3 2 3 
>>> spam(c=4, b=2, a=6) # explicitly assign values 
6 2 4 
>>> spam(b=7) # only assign b, use defaults for a and c 
1 7 3 

与Canvas小部件类似的事情发生了。你可以看到这里的参考: https://infohost.nmt.edu/tcc/help/pubs/tkinter/web/canvas.html

0

当声明一个方法时,你可以指定默认值。例如:

def __init__(self, a, b, c=True, d="default value"): 
    .... 
相关问题