2014-02-19 41 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"): 
    .... 
相關問題