Разница между утверждением и функцией

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

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

Ответ 1

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

Заявление - это команда. Это что-то делает. В большинстве языков операторы не возвращают значений. Пример:

print "Hello World"

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

function(a) { return a * 2 }

Управляющая структура, также известная как составной оператор, является оператором, который используется для управления потоком выполнения. Примеры:

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

Также стоит отметить, что выражение - это фрагмент кода, который оценивает значение. Пример:

2 + 2

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

Ответ 2

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

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

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 также оба выражения.

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

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

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

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

write_to_disk(result)

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

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

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


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


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

for thing in collection:
    do_stuff(thing)

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

1 + for thing in collection:
    do_stuff(thing)

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

Ответ 3

Этот ответ относится к Python 2.7.2. Взято из учебника python:

" 4. Дополнительные инструменты потока управления

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