Почему нельзя использовать точку с запятой перед циклом for в Python?

#python

#python

Вопрос:

Я могу соединять строки в Python, используя точку с запятой, например

 a=5; b=10
  

Но почему я не могу сделать то же самое с for

 x=['a','b']; for i,j in enumerate(x): print(i,":", j)
  

Комментарии:

1. docs.python.org/2/reference/grammar.html

Ответ №1:

Потому что грамматика Python запрещает это. Смотрите Документацию:

 stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
  

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

Комментарии:

1. Спасибо, я пишу несколько заметок для студентов, и места было мало, поэтому решил присоединиться к ним, как я уже упоминал; в любом случае, в то же время 🙂

Ответ №2:

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

Зачем вам вообще понадобилось писать что-то непонятное вроде этого? Просто разделите его на несколько строк:

 x = ['a','b']
for i,j in enumerate(x):
    print(i, ":", j)
  

Я бы сказал, что этот вариант намного понятнее.


1 Из import this : важна читаемость.

Комментарии:

1. Одним из вариантов использования было бы использование в командной строке: python -c 'import something; for ...'

2. Для варианта использования от @xOneca мы можем использовать понимание списка и запускать множественное понимание списка для каждой строки внутри требуемого цикла for . Например: l = [1, 2, 3]; [ вывести(x) для x в l]; [вывести(x*2) для x вl];

Ответ №3:

Потому что Гвидо ван Россуму, создателю Python, и другим разработчикам на самом деле не нравится стиль форматирования кода «точки с запятой и фигурные скобки».

Чтобы кратко взглянуть на то, как они относятся к этим вещам, попробуйте:

 from __future__ import braces
  

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

Существование ; однострочных составных операторов (например for i in x: print i ) и (например) должно быть только очень ограниченными уступками… и вы не можете их объединить.

Ответ №4:

Грамматика Python этого не допускает. Это хороший ответ, но в чем причина этого?

Я думаю, что логика решения следующая: тело цикла for должно иметь отступ, чтобы его можно было распознать. Итак, если мы допустим not a simple_stmt там, это потребует сложного и легкого для разрыва отступа.

Комментарии:

1. Хороший момент. Я думаю, что это, вероятно, лучшее обоснование этого конкретного ограничения (помимо простого утверждения «GvR ненавидит точки с запятой и фигурные скобки»)

Ответ №5:

Составной оператор состоит из одного или нескольких ‘предложений’. Предложение состоит из заголовка и ‘набора’. Заголовки предложений конкретного составного оператора имеют одинаковый уровень отступа. Заголовок каждого предложения начинается с однозначно идентифицирующего ключевого слова и заканчивается двоеточием. Набор — это группа операторов, управляемых предложением. Набор может представлять собой один или несколько простых операторов, разделенных точкой с запятой, в той же строке, что и заголовок, после двоеточия заголовка, или это может быть один или несколько операторов с отступом в последующих строках.

 x=['a','b'];
  

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

Ответ №6:

Попробуйте это.

 x=['a','b']; [print(i,":", j) for i,j in enumerate(x)]