2013-06-17 3 views
22

В Python, эти два примера сделать то же самое:В чем разница между этими двумя способами передачи аргументов?

from tkinter import Label 
widget = Label(None, text='Hello') 
widget.pack() 
widget.mainloop() 

from tkinter import Label 
widget = Label(None,'Hello') 
widget.pack() 
widget.mainloop() 

Я думаю Label это класс, и когда я пытаюсь создать экземпляр этого класса, я всегда делаю то же самое, как и в предыдущем коде пример. Я чувствую себя странно по поводу значения text='Hello'. Может ли кто-нибудь рассказать мне об этом?

+2

Здесь вы не создаете класс, вы создаете объект, создавая экземпляр класса «Ярлык». – glglgl

+0

@glglgl oh..I означает создать экземпляр класса .. Вы правы ... – Sayakiss

ответ

42

text='Hello' означает, что вы явно передавая значение 'Hello' к именованного аргумента вtext в аргументы функции.

Label(None,'Hello') означает 'Hello' передается второй аргумент в определении функции (независимо от того, что имя этой переменной)

>>> def func(first, second): 
...  print first, second 
...  
>>> func('foo', 'text') 
foo text 
>>> func('foo', second = 'text') 
foo text 

С именованные аргументы порядок вызова не имеет значения, но все аргументы ключевого слова должны появляться после позиционных аргументов.

>>> def func(first, second, third): 
    print first, second, third 
...  
>>> func('foo', third = 'spam', second = 'bar') 
foo bar spam 

Здесь first получает значение 'foo' из-за его позиции, в то время как second и third получили свои ценности, потому что они были переданы эти ценности, явно используя их имена.

Для получения более подробной информации читайте документацию: http://docs.python.org/3/tutorial/controlflow.html#more-on-defining-functions

+5

+ 1 Также известен как «Именованная ассоциация параметров» на других языках. – NWS

14

Чувствую странность в значении text = 'Hello'. Может ли кто-нибудь рассказать мне об этом?

Это named argument или keyword argument.

Именованные аргументы позволяют передавать аргументы функциям в любом порядке, не только передавая значение аргумента, но и имя аргумента.

6

text В данном случае это номер keyword argument, что означает, что он не является обязательным. Если вы не укажете его явно, значение по умолчанию будет предоставлено автоматически.

+0

Вы можете передавать необязательные аргументы по ключевым словам. Например, примерный код Ashwini Chaudhary делает это. Я думаю, вы их сбиваете с толку, потому что синтаксис вызова с аргументами ключевого слова похож на определение с параметрами по умолчанию: 'foo (bar = baz)'. – Blckknght

+0

Я знаю о нюансе, но оставил его вне ответа, поскольку связанные документы очень хорошо объясняют ситуацию. Также обратите внимание, что с некоторыми функциями не рекомендуется использовать аргументы ключевых слов, даже если это возможно, см. [Randrange] (http://docs.python.org/3.3/library/random.HTML # random.randrange). – bbayles

7

Как другие говорили, что это keyword argument. Прагматично, разница между указанием или не аргументом - это просто тот аргумент, который будет использоваться.

Например, если у вас есть функция с 3 аргументами и только один или два из них, вам нужно будет указать, какой аргумент вы использовали, если они не были первыми в вашем определении.

def f(a = "a", b = "b", c = "c"): 
    print a, b, c 

>>> f("x") 
x b c 
>>> f("x", "y") 
x y c 
>>> f("x", c = "y") 
x b y 
Смежные вопросы