2012-02-16 5 views
10

Это почти полночь, и у меня только что возник вопрос в голове - это «для цикла» утверждение или функция.Разница между заявлением и функцией

Я всегда думал, что это заявление, но я сделал поиск в Google, поскольку это функция, и для этого есть действительно результаты. Так что это? И в этом случае в чем разница между функцией и выражением?

+0

Это действительно зависит от вашего языка. Что это такое, Ruby, Python или Javascript? – deceze

+1

Хороший вопрос - это показывает, что вы сделали свое исследование, которое огромно. – Purag

+0

@deceze - это не все заявления на этих трех языках? –

ответ

18

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

A statement - это команда. Он что-то делает. В большинстве языков утверждения не возвращают значения. Пример:

print "Hello World" 

function является подпрограмма, которая может быть вызвана в другом месте в программе. Функции часто (но не обязательно) возвращают значения. Пример:

function(a) { return a * 2 } 

control structure, также известный как составного оператора а, это утверждение, которое используется, чтобы направить поток исполнения. Примеры:

if (condition) then { branch_1 } else { branch_2 } 
for (i = 0; i < 10; i += 1) { ... } 

Также стоит отметить, что expression представляет собой фрагмент кода, который вычисляет значение. Пример:

2 + 2 

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

+1

По этой логике, тогда цикл 'for' будет как оператором *, так и * структурой управления, да? И функция не * нуждается в том, чтобы что-то возвращать - ее тоже можно использовать для простого выполнения, но в том смысле, что некоторые вещи являются переменными, а продукт основан на конкретных обстоятельствах. – Purag

+0

Неверно утверждать, что цикл for не является ни оператором, ни функцией (а не тем, что он не используется в качестве структуры управления). Цикл for - составной оператор на большинстве языков, хотя он может быть выражением или функцией. В Javascript, Python и Ruby это утверждение. – zeekay

+0

@Purmou, я был в процессе обновления моего ответа, чтобы исправить это так же, как вы разместили комментарий. –

1

Этот ответ важен для Python 2.7.2. Взятые из python tutorial:

"4. Дополнительные инструменты Flow Control

4.2 для отчетности:. для утверждения в Python немного отличается от того, что вы можете использовать в C или Pascal. Вместо того, чтобы всегда выполнять арифметическую прогрессию чисел (например, в Pascal) или давать пользователю возможность определять как шаг итерации, так и условие остановки (как C), оператор Python выполняет итерации по элементам любой последовательности (список или строка), в порядке их появления в последовательности. "

6

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

A заявление - это вещь, которая выполнена; «инструкция сделать что-то», что понимает реализация языка. например

print "Hello World" 

pass 

def foo(n): 
    return n + 1 

if condition: 
    print 'yay' 
else: 
    print 'doh' 

Вышеупомянутый блок содержит инструкцию печати, инструкцию pass, инструкцию определения функции и инструкцию if/else. Обратите внимание, что определение функции и оператор if/else являются составными операторами; они содержат другие утверждения (возможно, многие из них и, возможно, другие составные утверждения).

выражение - это то, что можно оценить для получения значения. например

1 

"foo" 

2 * 6 

function(argument) 

None 

выше содержит числовое выражение буквального, буквального строковое выражение, выражение с участием операторов, числовые выражения вызова функции, а выражение буквального None. Помимо литералов и переменных, выражения состоят из других выражений. В function(argument), function и argument также оба выражения.

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

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

Заявление может никогда появляются внутри выражения (я считаю, что это не так в Руби и JavaScript, в каком-то смысле, так как они позволяют буквенные кодовые блоки и функции, которые затем используются в качестве значения в целом и функции и блоки кода содержат инструкции, но это отчасти отличается от того, о чем я говорю). Выражение должно иметь значение (даже если оно неинтересное, например, None). Инструкция - это команда; для него не имеет смысла отображаться как часть выражения, потому что оно не имеет ценности.

Многие языки также позволяют использовать выражения как утверждения. Обычный смысл этого - «оценить это выражение, чтобы получить значение, а затем выбросить его». В Python, функции, которые всегда возвращают None обычно используются таким образом:

write_to_disk(result) 

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

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

Итак, если foo является выражением, я могу написать 1 + foo, и хотя это может привести к ошибке типа, это, по крайней мере, имеет такое значение. Если foo является оператором, то 1 + foo обычно является ошибкой разбора; реализация языка даже не сможет понять, что вы пытаетесь сказать.


функция с другой стороны, это вещь, которую вы можете позвонить. На самом деле это не выражение или утверждение само по себе. В Python для создания функции используется оператор def, а вызов функции - выражение. Имя, связанное с функцией после ее создания, также является выражением. Но сама функция является значением , что не является выражением, когда вы получаете техническую информацию, но, безусловно, не является утверждением.


Итак, для петель. Это цикл в Python:

for thing in collection: 
    do_stuff(thing) 

Похож оператором (составной оператор, как если заявление). И чтобы доказать это, это совершенно бессмысленно (и ошибка синтаксического анализа):

1 + for thing in collection: 
    do_stuff(thing) 

В некоторых языках, хотя, эквивалент для цикла является выражение, и имеет значение, к которому вы можете попытаться добавить 1. В некоторых это даже функция, а не специальный синтаксис, испеченный на языке.

+0

«Заявление никогда не может появляться внутри выражения (я считаю, что это неверно в Ruby [...])» - Ruby не имеет операторов, а только выражений. –

+0

@ JörgWMittag Что такое значение цикла for? После быстрого синтаксиса Google Ruby не выглядит так, как будто он имеет значение, за исключением того, что он является блоком кода. Выражение, которое оценивается как «кодовое значение» и выполняемый оператор, выглядит как разные вещи, даже если один и тот же исходный текст в исходном коде может отображаться либо в зависимости от контекста; Я сейчас борюсь с этой проблемой на игрушечном языке, в котором я лениво развиваюсь. – Ben

+0

@ JörgWMittag Я еще кое-что прочитал, и вижу, что это совсем не то, о чем вы говорите. Ruby дает значения циклам и условностям и тому подобное. Ухоженная! Однако все еще есть некоторые вещи, которые на самом деле являются * семантическими * операторами, такими как 'break' (и, кажется, иногда Ruby дает вам синтаксическую ошибку для использования в качестве выражений, хотя и не всегда: http://carboni.ca/blog/p/Заявления-в-Ruby) – Ben

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