Почему точка с запятой разрешена в этом фрагменте питона?

Python не гарантирует использование точек с запятой для завершения операторов. Итак, почему это (ниже) разрешено?

import pdb; pdb.set_trace()

Ответ 1

Python не требует полуколоней для завершения операторов. Полуколоны могут использоваться для разграничения операторов, если вы хотите поместить несколько операторов в одну строку.

Теперь, почему это разрешено? Это простое дизайнерское решение. Я не думаю, что Python нуждается в этой полу-двоеточии, но кто-то подумал, что было бы неплохо иметь и добавить его на язык.

Ответ 2

http://docs.python.org/reference/compound_stmts.html

Составные утверждения состоят из одного или нескольких "предложений". Статья состоит из заголовка и набора. Заголовки статей определенного составной оператор находятся на одинаковом уровне отступов. Каждый пункт заголовок начинается с уникально идентифицирующего ключевого слова и заканчивается двоеточие. Набор представляет собой группу операторов, контролируемых условием. Suite может быть одним или несколькими простыми словами с разделителями с запятой в той же строке, что и заголовок, после двоеточия заголовков, или это может быть один или несколько отступов в последующих строках. Только последние форма набора может содержать вложенные составные утверждения; следующее: незаконно, в основном потому, что не было бы ясно, к какому следующее else должно принадлежать:

if test1: if test2: print x

Также обратите внимание, что точка с запятой связывается сильнее, чем двоеточие в этом контекста, так что в следующем примере либо все, либо ни одно из выполняются инструкции печати:

if x < y < z: print x; print y; print z 

Резюмируя:

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | funcdef
                   | classdef
                   | decorated
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]

Ответ 3

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

Ответ 4

Точка с запятой в интерпретаторе

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

Когда вы работаете в интерпретаторе REPL (интерактивная оболочка Python, IDLE, ipython), значение последнего выражения печатается на экране, и обычно это предполагаемое поведение.

Использование выражения для побочных эффектов

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

В этом случае вы (возможно) не хотите видеть экран repr объектов matplotlib, которые иногда возвращаются вызовом функции matplotlib, и одна из возможностей, которую вы имеете, заключается в добавлении точка с запятой для слишком многословного оператора, который сразу состоит из двух выражений, вызова matplotlib и нулевого оператора, так что значение составного выражения None и ничто не выводится на экран интерпретатором (другая возможность - назначение, как в _ = plot(...), но я нахожу это немного более навязчивым).

Личные замечания

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

Ответ 5

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

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

Но это почти требование, когда вы вызываете Python из одной оболочки из оболочки с помощью python -c '<some python code>'. Здесь вы не можете использовать отступы для разделения операторов, поэтому, если ваш однострочный слой действительно представляет собой двухстрочный ключ, вам нужно использовать точку с запятой. И если вы хотите использовать другие аргументы в своем однострочном пространстве, вам нужно будет импортировать sys, чтобы получить sys.argv, для чего требуется отдельный оператор import. например.

python -c "import sys; print ' '.join(sorted(sys.argv[1:]))" 5 2 3 1 4
1 2 3 4 5

Ответ 6

Цитата из При атаке Pythons"

Не завершайте все ваши утверждения точкой с запятой. Это технически законно для этого в Python, но совершенно бесполезно, если вы не помещаете более одного оператора в одну строку (например, x = 1; y = 2; z = 3).

Ответ 7

Точки с запятой являются частью допустимого синтаксиса: 8. Составные операторы (Справочник по языку Python)

Ответ 8

Несколько операторов в одной строке могут включать точки с запятой в качестве разделителей. Например: http://docs.python.org/reference/compound_stmts.html В вашем случае это упрощает вставку точки в отладчик.

Кроме того, как упоминал Марк Лутц в Learning Python Book, технически законно (хотя и ненужно и раздражает) прекратить все ваши заявления с точкой с запятой.

Ответ 9

Python позволяет использовать полуточку для обозначения конца инструкции, если вы включаете в строку несколько операторов.

Ответ 10

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

Точка с запятой (;) допускает несколько операторов в одной строке, если ни один из операторов не запускает новый кодовый блок.

http://www.tutorialspoint.com/python/python_basic_syntax.htm

Ответ 11

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

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

  • Концептуально: разделение проблем между чистым синтаксисом (в данном случае, для последовательности команд) из представления (например, новой строки), в старые времена, называемое "довольно-печатная".

Наблюдение: для выделения структуры отступы могут быть увеличены или заменены вертикальными линиями очевидным образом, выступая в качестве "визуальной линейки", чтобы увидеть, где начинается и заканчивается отступ. Различные цвета (например, после цветового кода для резисторов) могут компенсировать скопление.

Ответ 12

Для кого-то из C/C++ фона программирования, используя; в конце каждого утверждения кажется логичным и облегчает адаптацию к Python.

Ответ 13

Правда ли, что питону не нужны точки с запятой, потому что он использует выравнивание отступов для понимания начала и конца фрагментов кода?

Ответ 14

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

Иногда ясность того, когда заканчивается утверждение или блок, очень полезна. Стандартный код C часто читает что-то вроде этого:

for(i=0; i<100; i++) {
    do something here;
    do another thing here;
}

continue doing things;

где вы используете пробел для большей ясности - и легко видеть, где заканчивается цикл.

Python позволяет завершить работу с помощью (необязательной) точки с запятой. Как отмечено выше, это НЕ означает, что существует инструкция для выполнения, за которой следует оператор "null". Так, например,

print(x);
print(y);

Такой же как

print(x)
print(y)

Если вы считаете, что первая имеет нулевой оператор в конце каждой строки, попробуйте - как было предложено - сделать это:

print(x);;

Он выдает синтаксическую ошибку.

Лично я считаю, что точка с запятой делает код более удобочитаемым, когда у вас много вложенных функций и функций со многими аргументами и/или длинными именами args. Итак, на мой взгляд, это намного яснее, чем другие варианты:

if some_boolean_is_true:
    call_function(
        long_named_arg_1,
        long_named_arg_2,
        long_named_arg_3,
        long_named_arg_4
    );

поскольку, для меня, это позволяет вам знать, что последний ')' заканчивает какой-то "блок", который пробегал по многим строкам.

Я лично считаю, что многое можно сделать из руководящих принципов стиля PEP, IDEs, которые их применяют, и убеждение, что существует "только один способ для Pythonic". Если вы верите в последнее, посмотрите, как форматировать номера: на данный момент Python поддерживает четыре разных способа сделать это.

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

Ответ 15

Это было разрешено, поскольку авторы решили разрешить это: https://docs.python.org/2/reference/simple_stmts.html.

Если перейти к вопросу о том, почему авторы решили сделать это, я думаю, это так, потому что полуколонна допускается как завершение простого оператора, по крайней мере, в следующих языках: C++, C, С#, R, Matlab, Perl,...

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