Python не гарантирует использование точек с запятой для завершения операторов. Так почему это (ниже) разрешено?
import pdb; pdb.set_trace()
Python не гарантирует использование точек с запятой для завершения операторов. Так почему это (ниже) разрешено?
import pdb; pdb.set_trace()
Ответы:
Python не требует точки с запятой для завершения операторов. Точки с запятой можно использовать для разделения операторов, если вы хотите поместить несколько операторов в одну строку.
Теперь, почему это разрешено? Это простое дизайнерское решение. Я не думаю, что Python нуждается в этой точке с запятой, но кто-то подумал, что было бы хорошо иметь ее, и добавил ее в язык.
timeit a = 5; a*a
timeitзначит? a = 2; a*aбесполезен, так aкак еще 2; это должно было бытьa = 2; a *= a
http://docs.python.org/reference/compound_stmts.html
Составные операторы состоят из одного или нескольких «предложений». Предложение состоит из заголовка и «набора». Заголовки предложений конкретного составного оператора находятся на одном уровне отступа. Каждый заголовок предложения начинается с уникально идентифицирующего ключевого слова и заканчивается двоеточием. Комплект - это группа операторов, контролируемая предложением. Набор может состоять из одного или нескольких разделенных точкой с запятой простых операторов в той же строке, что и заголовок, после двоеточия заголовка, или это может быть один или несколько операторов с отступом в последующих строках . Только последняя форма набора может содержать вложенные составные операторы; следующее недопустимо, в основном потому, что не ясно, к какому условию относится следующий оператор 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)* [";"]
if cond: stmt1; stmt2; stmt3примере либо все, либо ни одно из утверждений не выполняются ".
Python использует в ;качестве разделителя, а не терминатора. Вы также можете использовать их в конце строки, что делает их похожими на терминатор операторов, но это допустимо только потому, что в Python допустимы пустые операторы - строка, содержащая точку с запятой в конце, - это два оператора, второе один бланк
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
Прочитав ответы, я все еще скучаю по одному важному аспекту использования точек с запятой, возможно, единственному, где это действительно имеет значение ...
Когда вы работаете в интерпретаторе REPL (интерактивная оболочка Python, IDLE, ipython), значение последнего выражения выводится на экран, и обычно это предполагаемое поведение.
Но в некоторых случаях вы хотите оценить выражение только для его побочных эффектов, например, чтобы увидеть результаты вашего моделирования, нанесенные на график matplotlib.
В этом случае вы (вероятно) не хотите видеть скрин reprс matplotlibобъектами, которые иногда возвращаются при вызове matplotlibфункции, и, по крайней мере, в IPython, одна из возможностей, которую вы имеете, это добавить точку с запятой к чрезмерно В многословном выражении теперь IPython видит строку ввода, состоящую из двух выражений, matplotlibвызова и пустого оператора, так что значение составного выражения равно Noneи ничего не выводится на экран интерпретатором (другой возможностью является назначение , как в _ = plot(...)но я нахожу это немного более навязчивым).
ИМХО, использование точки с запятой для подавления нежелательных выводов в интерпретаторе стало более актуальным после появления записной книжки IPyton, которая позволяет сохранять ввод и вывод, включая графический вывод, сеанса интерпретатора для документации и возможного повторного использования. ,
ipython... я отредактировал свой ответ, чтобы отразить ваше замечание.
Как все остальные заметили, вы можете использовать точки с запятой для разделения операторов. Вам не нужно , и это не обычный стиль.
Что касается того, почему это полезно, некоторым людям нравится помещать два или более действительно тривиальных коротких высказывания в одну строку (лично я думаю, что это превращает несколько простых тривиальных строк с легким скиммингом в одну сложную линию и затрудняет понимание того, что это тривиально) ,
Но это почти требование, когда вы вызываете Python one liners из оболочки, используя 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
pythonоболочку: просто поместите ваш код в несколько строк или используйте heredoc. Тем не менее, это терпит неудачу, если вы хотите, чтобы это было «одной строкой». ;)
-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);;
Это вызовет синтаксическую ошибку.
Лично я нахожу точку с запятой, чтобы сделать код более читабельным, когда у вас много вложений и функций со многими аргументами и / или аргументами с длинными именами. Итак, на мой взгляд, это намного яснее, чем другие варианты:
if some_boolean_is_true:
call_function(
long_named_arg_1,
long_named_arg_2,
long_named_arg_3,
long_named_arg_4
);
поскольку, для меня, это позволяет вам знать, что последний ')' заканчивает некоторый "блок", который пробегал много строк.
Лично я думаю, что многое из того, что сделано, основано на руководящих принципах стиля PEP, IDE, которые обеспечивают их соблюдение, и убеждение, что «есть только один Pythonic способ сделать что-то». Если вы верите последнему, посмотрите, как форматировать числа: на данный момент Python поддерживает четыре различных способа сделать это.
Я уверен, что я буду огорчен некоторыми несгибаемыми, но компилятор / интерпретатор не заботится о длинных или коротких именах аргументов, и - но для соглашения об отступах в Python - не заботится о пробелах. Самая большая проблема с кодом - дать ясность другому человеку (и даже вам самому после нескольких месяцев работы), чтобы понять, что происходит, где все начинается и заканчивается и т. Д.
Точки с запятой являются частью допустимого синтаксиса: 8. Составные операторы (Справочник по языку Python)
Цитата из « Когда нападают питоны »
Не заканчивайте все ваши утверждения точкой с запятой. Это технически допустимо делать в Python, но совершенно бесполезно, если вы не помещаете более одной инструкции в одну строку (например, x = 1; y = 2; z = 3).
x,y,z = 1,2,3?
x, y, z = 1, 2, 3что это происходит медленнее, потому что он влечет за собой ненужное круговое движение при создании кортежа, а затем сразу же снимает его. (Между прочим, я не думаю, что @communistpancake предлагает x=1; y=2; z=3образец. Хотя я думаю, что он или она просто приводит пример того, как точка с запятой является разделителем, а не терминатором.)
Несколько операторов в одной строке могут содержать точки с запятой в качестве разделителей. Например: http://docs.python.org/reference/compound_stmts.html В вашем случае это позволяет легко вставить точку, которая пробивается в отладчике.
Кроме того, как отметил Марк Лутц в Книге изучения Python , технически законно (хотя это и не нужно и раздражает) завершать все ваши утверждения точкой с запятой.
Точки с запятой можно использовать в одной строке двумя или более командами. Их не нужно использовать, но они не ограничены.
Точка с запятой (;) допускает несколько операторов в одной строке, если ни один из операторов не начинает новый блок кода.
http://www.tutorialspoint.com/python/python_basic_syntax.htm
Точки с запятой (как точки, запятые и скобки), как правило, вызывают религиозные войны. Тем не менее, они (или некоторый подобный символ) полезны в любом языке программирования по разным причинам.
Практичность: возможность поместить несколько коротких команд, концептуально принадлежащих друг к другу, в одну строку. Текст программы, который выглядит как узкая змея, имеет эффект, противоположный тому, что подразумевается под новыми строками и отступами, что выделяет структуру.
Концептуальное: разделение интересов между чистым синтаксисом (в данном случае для последовательности команд) и представлением (например, новой строкой), в старые времена называвшееся «симпатичной печатью».
Наблюдение: для выделения структуры отступ может быть очевидным образом дополнен / заменен вертикальными линиями, служа «визуальной линейкой», чтобы увидеть, где начинается и заканчивается отступ. Различные цвета (например, следуя цветовому коду для резисторов) могут компенсировать скученность.
Это разрешено, потому что авторы решили разрешить это: https://docs.python.org/2/reference/simple_stmts.html
Если перейти к вопросу, почему авторы решили сделать это, я думаю, что это так, потому что полуколонна допускается как простое завершение оператора, по крайней мере, в следующих языках: C ++, C, C #, R, Matlab, Perl, ...
Так что быстрее переходить на использование Python для людей с опытом работы на другом языке. И в таком решении нет потери общности.
Точка с запятой (";") необходима только для разделения операторов внутри одного блока, например, если у нас есть следующий код на C:
if(a>b)
{
largest=a; //here largest and count are integer variables
count+=1;
}
Это может быть написано на Python в любой из двух форм:
if a>b:
largest=a
count=count+1
Или
if a>b: largest=a;count=count+1
В приведенном выше примере вы можете иметь любое количество операторов в ifблоке и могут быть разделены ";" вместо.
Надеюсь, что ничего не так просто, как объяснение выше.
Добавление к обширным знаниям, присутствующим здесь,
это ответ, связанный с библиотекой matplotlib
import numpy as np
import matplotlib as plt
%matplotlib notebook
linear_data = np.array([1, 2, 3, 4, 5, 6, 7, 8])
quadratic_data = linear_data**2
plt.figure()
xvals = range(len(linear_data))
plt.barh(xvals, linear_data, height = 0.3, color='b')
plt.barh(xvals, quadratic_data, height = 0.3, left=linear_data, color='r')
Если вы не поставите точку с запятой в конце строки (горизонтальная черта), на выходе будет график + адрес функции. Но если вы используете точки с запятой в конце обеих строк строки, тогда он только показывает график и подавляет вывод для адреса функции.
Как то так: Сравнение