Это почти полночь, и у меня только что возник вопрос в моей голове - это "за цикл" утверждение или функцию.
Я всегда думал, что это выражение, но я сделал поиск в 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. В некоторых это даже функция, а не специальный синтаксис, испеченный на языке.