2012-03-11 2 views
7

Я занимаюсь Упражнением 41 в разделе «Изучить Python на жестком пути», и мне очень тяжело обмотать мой мозг вокруг того факта, что все это зависит от функции, выполняемой только потому, что она была назначена как значение для переменная. Я написал небольшой скрипт, чтобы подтвердить, что это, как это работает, и это делает:Почему функция foo = function() запускает функцию в Python?

def pants(): 
    print "Put on some pants!" 

def shorts(): 
    print "And don't forget your underwear!" 

zap = pants() 
thing = shorts() 

с результатами бытия:

Put on some pants! 
And don't forget your underwear! 

Так, очевидно, это происходит, но я не могу понять, почему язык работает именно так, что логика стоит за языком, что делает его ценным способом работы. Я думаю, мне было бы полезно перейти к пониманию , почему это, а не просто «так оно и работает».

Для ясности: Я спрашиваю (я думаю), почему функция работает, когда все, что я делаю, присваивает ей значение для чего-то. Операторы печати находятся там, поэтому я вижу, что функция действительно работает.

Это то, что я никогда не на самом деле работает

брюки() шорты()

, что сбивает с толку меня.

Чтобы создать замученную аналогию, если мне выпечки-печенья на доме были «куки()», и я должен был сделать печенье по субботам, я, возможно, в конце концов, считаю, что

Суббота = печенье()

но просто думать «эй, суббота это печенье день» не то же самое, как на самом деле выпечки печенья ... так почему же просто сказать

Суббота = печенье()

на самом деле испечь сотрудничества okies, а не просто настроить субботу с переменной "cookies()" для некоторых более поздних использования?

+5

Вы, вероятно, путает '' print' с return'. – JJJ

+2

Я думаю, что Юхана может быть прав. Вы ожидаете, что 'zap' будет иметь значение« Наденьте штаны! »? Если это так, измените 'print' на' return', а затем 'print zap' после того, как он был назначен. – chooban

+1

Да, очевидно, ваши ожидания смещены с языком. Что вы ожидали? –

ответ

16

Когда вы используете круглые скобки (), функция вызывается. Если вы хотите назначить функцию переменной для ее повторного использования, вы должны удалить туда круглые скобки.

Пример:

def pants(): 
    print "Put on some pants!" 

def shorts(): 
    print "And don't forget your underwear!" 

zap = pants 
thing = shorts 

И тогда, когда вы хотите, чтобы вызвать те функции:

zap() 
thing() 
+0

Итак, присутствие() «преобразует» вещи в функции в глазах Python, и Python пытается сразу запустить эти функции, чтобы получить их возвращаемое значение? – JeanSibelius

+1

Нет, что «преобразует» их в функции, это когда вы их объявляете. В Python все является объектом. Функция является «вызываемым» объектом. В качестве объекта вы можете назначить его переменной, другому объекту в качестве свойства, передать его как параметр и т. Д. Затем, когда вы ** вызываете ** это, он выполняет свою процедуру. Для получения более подробной информации я бы посоветовал вам прочитать о [модели данных] Python (http://docs.python.org/reference/datamodel.html). –

+1

Добавление к моему предыдущему комментарию: наличие '()' говорит Python ** вызывать ** объект. Если его функция будет выполнена, если это не так, это приведет к возникновению исключения, указывающего, что объект не может быть вызван. Возвращает ли функция что-то или нет, зависит от вас и что вам нужно делать. Если вы хотите присвоить результат функции переменной, вам нужно использовать 'return', как было указано в других ответах. Если вы просто хотите что-то распечатать, вы можете использовать 'print' и ничего не нужно возвращать. –

2

zap = pants() свяжет возвращаемое значение функции с переменной, поэтому, конечно, функция запускается, если вы привязываете ее к переменной.

def foo(): 
    return 1 

var = foo() 
print var 

напечатает 1.

Надеюсь, это поможет.

Редактировать: Если вы ожидаете, что значение переменной будет «надеты на некоторые штаны», вы действительно вводите в заблуждение print и return, как указывали люди в комментариях.

5

Хотя может показаться, что ваши функции ничего не возвращают, они на самом деле. Цитата the Python.org documentation:

Оператор возврата возвращает значение из функции. return без аргумента выражения возвращает None. Падение конца функции также возвращает None.

Так что ваши функции действительно выглядеть следующим образом:

def pants(): 
    print "Put on some pants!" 
    return None 

def shorts(): 
    print "And don't forget your underwear!" 
    return None 

Ваши задания назначить zap независимо pants возвращает (то есть значение pants()), и в какой бы то ни thingshorts возвращается. В вашем случае оба - None, но, конечно, функции должны быть выполнены, чтобы понять это (*). Afterall, это может быть, что pants возвращается 42 в течение високосных лет, и что shorts возвращается 'Foobar' всякий раз, когда некоторые генераторы случайных чисел «катится» а 6.


(*) Отступление: То, что функции «должны работать» должны не считаются универсальными. В pure setting, оставляя в стороне специфику Python (о которой я очень мало знаю), компилятор может понять, что обе функции идентичны None и не вызывают никаких вызовов при запуске программы. Но функция, которая печатает что-то (или проверяет, является ли текущий год високосным годом или катит умирает) не будет чистым.

1

Когда интерпретатор видит имя функции, за которым следует(), он знает, что он должен выполнять эту функцию.

Что вы там делаете, говорят: «Назначьте результат этих функций этим переменным».

Но поскольку вы не возвращаете никаких значений из этих функций, вы ничего не видите в переменных.

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

0

Ваши функции вызываются из-за скобки после имени:

zap = pants() 

Этот вызывает функцию pants и помещает результат в zap. Если бы вы это сделали:

zap = pants 

Тогда zap теперь будет ссылаться на функцию штанов.

И если вы только что написали

pants() 

тогда функция брюки также дозвонились, но результат (который не является None) никогда бы не был поставлен в переменной.

6

Итак, очевидно, что это происходит, но я не могу понять, почему язык работает именно так, что логика стоит за языком, что делает его ценным способом работы. Я думаю, мне было бы полезно двигаться дальше, чтобы понять, почему это так, а не просто «так оно и работает».

Язык должен каким-то образом различать функцию и действие вызова функции. Это то, что предоставляют круглые скобки.

f = foo 

В настоящее время f привязан к самой функции. Функция foo может быть выполнена по адресу f().

f = foo() 

Это вызывает функцию foo и связывает возвращаемое значение f.

Обратите внимание, что привязка возвращаемого значения к имени не имеет значения. Простое письмо

foo() 

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

+0

Итак, если я правильно понимаю, Python попытается выполнить что-либо с() после него как функцию, независимо от того, какое большинство контекстов использует его, используя возвращаемое значение функции вместо функции(), если функция то, что должно представлять переменную в ее текущем контексте? – JeanSibelius

0

Из Вашего вопроса, что я думаю, что вы хотите zap будет иметь значение "Put on some pants!" и thing будет иметь значение "And don't forget your underwear!". Если это ваша проблема, давайте обсудим это. В противном случае вам не нужно читать дальше, поскольку я только что обсуждал обо всем этом.

Давайте сделаем это с удовольствием. Когда вы определяете функцию, вы похожи на создание машины, которая делает то, что вы хотите. Теперь давайте подумаем о машине, что, когда вы дадите ей немного еды, она отрубает их и ... ничего не делает! Я имею в виду, что я сделал эту машину, чтобы нарезать пищу и ничего больше! Вы не получите свою расколотую пищу, но на самом деле она расколола вашу пищу, как вы ее сделали.

Теперь, как вы хотите, чтобы ваша расколотая пища вернулась, вы создаете еще одну машину, которая берет вашу пищу, отбивает и возвращает их вам. Плодотворная машина, не так ли? ;-)

Все они верны для функций программирования или математики (хотя я не знаю никакой функции void в математике!: P). Когда вы создаете функцию, вы должны сказать, что она просто выполняет или она выполняет некоторую работу и возвращает результат. Способ определения функции - это утверждение return. В ваших функциях вы только что сказали что-то сделать. И это print "......", так и функции. Вы вызываете команду with() в конце и выполняете свою работу, они печатают ее. Но, как я сказал, если вы не скажете ему вернуть результат, это не произойдет. И поскольку он не возвращает никакого результата, ничего не будет присвоено переменной (не путайте его с None). Когда вы написали эти строки (если в интерпретаторе) или запустите скрипт, вы увидите, что эти строки напечатаны, но ваши zap и thing не имеют значений.

Итак, как это исправить? Скажите им, чтобы они возвращали строки к переменным. Чтобы сообщить об этом, замените операторы print инструкциями return.И не важно экспериментировать, что вы знаете, чтобы узнать о том, что вы знаете о вашем знании верно :-)

Надеется, что это помогает :-)

Смежные вопросы