Разница между утверждением и функцией - PullRequest
12 голосов
/ 16 февраля 2012

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

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

Ответы [ 3 ]

19 голосов
/ 16 февраля 2012

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

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

print "Hello World"

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

function(a) { return a * 2 }

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

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

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

2 + 2

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

8 голосов
/ 16 февраля 2012

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

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

print "Hello World"

pass

def foo(n):
    return n + 1

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

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

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

1

"foo"

2 * 6

function(argument)

None

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

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

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

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

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

write_to_disk(result)

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

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

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

1 голос
/ 16 февраля 2012

Этот ответ относится к Python 2.7.2 .Взято из Python Tutorial :

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...