2. Введение в синтаксис Python

Текст программы говорит о том, как, а комментарии должны объяснять, почему.Swaroop Chitlur («A Byte of Python»)

Строки исходного текста

Физические строки

Физическая строка исходного файла — это строка заканчивающаяся символом признака конца строки (вводится нажатием на клавишу Enter). Этот признак — специальный символ, зависящий от платформы. В Unix, использует ASCII LF (перевод строки), в Windows — последовательность ASCII CR LF (возврат каретки с последующим переводом строки) и Macintosh — ASCII CR (возврат каретки). Все эти формы можно использовать в равной степени, независимо от платформы.

Логические строки

Программа Python разделена на несколько логических строк. Логическая строка содержит одну или более физических строк, соединяющихся правилами языка. (В интерактивном режиме продолжение логической строки на новой физической строке будет начинаться с символов ...). Логическая строка — это законченное высказывание (инструкция) языка.

Отступы в начале строки

Ведущие пробельные символы (пробелы и табуляции) в начале строки используются в Python для определения группы инструкций, как единого целого — составной инструкции или блока. Отступы в пределах блока должны быть равной символьной длины, иначе это приведет к ошибке. Для совместимости на разных платформах не следует применять смесь из пробелов и табуляций. Например:
Программа 2.1

from turtle import*
begin_fill()
for i in range(5):
    fd(150)
    for j in range(5):
        fd(50)
        left(144)
    left(144)
end_fill()
mainloop() 

Примечание. В дальнейшем, программы будут нумероваться в формате: Программа x.y, где x — номер урока, y — номер программы в этом уроке.

Комментарии

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

Объединение нескольких физических строк

Две (или более) физические строки могут быть объединены в одну логическую строку с использованием обратного слэша (бэк-слэш, "\"), а именно: когда физическая строка заканчивается символом "\" и он не является частью строки (т. е. не находится в пределах " ") или комментария, он присоединяет следующую физическую строку, образуя одну логическую строку. После символа "\" должен следовать символ признака конца строки (т. е. физическая строка должна заканчиваться). Например:

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Успешная проверка даты
        return 1

Примечание. Внутри строкового литерала экранирование бзк-слэша не имеет эффекта, но «\\\» уменьшает количество выводимых символов на 1:

print("\ ")
print("\\ ")
print("\\\ ")
print("\\\\")
\ 
\ 
\\ 
\\
Неявное объединение физических строк

Выражения в скобках, в квадратных скобках, либо в фигурных скобках можно разделить на несколько физических строк без использования обратной косой черты. Например:
Программа 2.2

a = "Меня зовут - "
b = input("Ваше имя: ")
c = "\nМне - "
d = input("Ваш возраст: ")
e = "лет."
print(a, # "Меня зовут - "
      b, #  Имя, которое вы ввели
      c, # "Мне - "
      d, #  Возраст, который вы ввели
      e  # "лет"
      )

Функция print()

В программа 2.2 для вывода данных на дисплей используется функция print(). Если не используется метод format() (см. ниже), то функция используется для вывода без форматирования. Функция print имеет аргументы, которые могут придать выводимой информации читаемый вид. В общем виде функция имеет следующие аргументы:

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

Здесь:

  • *objects — перечисленные через запятую объекты (переменные, строки, константы), значения которых нужно выводить
  • sep=' ' — разделитель (по умолчанию — пробел)
  • end='\n' — завершающий символ (по умолчанию — символ конца строки)
  • file=sys.stdout — вывод в файл. Объект file должен быть объектом с методом write(str). print() можно использовать только для текстовых файлов.
  • flush=False — принудительная очистка буфера вывода (по умолчанию — нет, поскольку обычно определяется файлом).

Например:

Программа 2.3

print("2", "+", "2", "= ")
print("4")
print("2", "+", "2", "= ", end="")
print("4")
print("2", "+", "2", "= ", sep="\n")
print("4")

Вывод программы:

2 + 2 = 
4
2 + 2 = 4
2
+
2
= 
4

Метод format()

Функция print() имеет существенный недостаток — она не имеет аргументов, позволяющих производить форматированный вывод. Для осуществления вывода данных с определенным форматированием необходимо использовать метод format.
Мини-руководство по этому методу на страницах документации
Примечание: в python отсутствует символьный тип данных, поэтому одиночный символ также рассматривается как строка.
Синтаксис метода format:

"{:format_spec}".format()

где format_specспецификация формата:

[[fill]align][sign][#][0][width][grouping_option][.precision][type]

Выглядит довольно пугающе, но не беспокойтесь! Обычно используется ограниченное количество форматирующих элементов, к тому же все они не являются обязательными!

Назначение форматирующих элементов
  • fill — символ-заполнитель (любой символ)
  • align — выравнивание. Значения: "<" | ">" | "=" | "^"
  • sign — вывод знака. Значения: "+" | "-" | " "
  • # — вывод префикса для двоичного, восьмеричного и шестнадцатеричного формата (т. е. 0x, 0o, или 0b)
  • 0 — заполнение лидирующими нулями для числовых типов, когда выравнивание не задано явно
  • width — ширина поля вывода (целое число)
  • grouping_option — разделитель разрядов «,» или «_». Не используется для российской локали (для этих целей используется формат «n»)
  • .precision — количество дробных знаков (точка обязательна, затем следует целое число)
  • type — тип выводимого значения (см. таблицу ниже).
Обозначения типов
Символ Описание
b Бинарный формат. Выводит число в двоичной системе счисления
c Преобразует на выводе целое число в соответствующий символ юникода
d Десятичное целое число
e Число в экспоненциальном (научном) формате, e — строчная
E Число в экспоненциальном (с плавающей точкой, научном) формате, E — Прописная
f Число с фиксированной точкой
F Число с фиксированной точкой, NAN и INF (не число и бесконечность) выводить прописными
g Общий числовой формат. Для заданной точности p >= 1 это число округляется до p значащих цифр, а затем форматирует результат как в формате с фиксированной точкой или в научной нотации в зависимости от величины.
G То же самое, что и «g», но буквенные символы выводятся прописными
n То же самое, что и «d», за исключением того, что используется текущая настройка локали для вставки соответствующих символов разделителей.
o Число в восьмеричной системе счисления
s Строковый тип (по умолчанию)
x Шестнадцатеричное число
X То же самое, что и «x», только буквенные символы выводятся прописными
% Значение выводится в процентах (умножается на 100 и добавляется символ «%»)
None Аналогичен «g», за исключением того, что нотация с фиксированной точкой, используется, тогда, когда число имеет по крайней мере одну цифру после десятичной точки. Точность по умолчанию настолько высока, насколько это необходимо для представления конкретного значения.
Флаги используемые для выравнивания:
  • < - Выравнивание объекта по левому краю (по умолчанию)
  • > - Выравнивание объекта по правому краю
  • ^ - Выравнивание по центру

Например:

Программа 2.4

print("{:<10}".format("Я"))
print("{:^10}".format("Я"))
print("{:>10}".format("Я"))

Вывод программы:

Я         
    Я     
         Я

Постановка задачи: С помощью символа "*" вывести следующий рисунок:

     *     
    ***    
   *****   
  *******  
 ********* 
***********

Решение: будем выводить символ "*" c выравниванием по центру:

Программа 2.5

print("{:^11}".format("*"))
print("{:^11}".format("***"))
print("{:^11}".format("*****"))
print("{:^11}".format("*******"))
print("{:^11}".format("*********"))
print("***********")

Можно использовать несколько спецификаций формата для одного и более выводимых значений различных объектов, перечисленных в методе format. Каждая спецификация должна заключаться в отдельные {}. Между спецификациями, заключенными в {} могут находиться произвольное количество различных символов-разделителей. Это позволяет выполнить сколь угодно сложное форматирование внятными и понятными инструментами. Например.

Постановка задачи: Вывести следующий рисунок:

**********
**********
**      **
**      **
**  **  **
**  **  **
**      **
**      **
**********
**********

Символы пробела и табуляции не использовать!
Решение:
Программа 2.6

print("**********")
print("**********")
print("{:}{:>8}".format("**", "**"))
print("{:}{:>8}".format("**", "**"))
print("{:}{:>4}{:>4}".format("**", "**", "**"))
print("{:}{:>4}{:>4}".format("**", "**", "**"))
print("{:}{:>8}".format("**", "**"))
print("{:}{:>8}".format("**", "**"))
print("**********")
print("**********")

Несложно заметить, что в этой программе выводится один и тот же объект несколько раз. Метод format(), позволяет рассматривать совокупность перчисляемых объектов как список и, соответственно, использовать индексацию для повторного вывода нужного объекта. Тогда этот код можно переписать следующим образом:

print("**********")
print("**********")
print("{0:}{0:>8}".format("**"))
print("{0:}{0:>8}".format("**"))
print("{0:}{0:>4}{0:>4}".format("**"))
print("{0:}{0:>4}{0:>4}".format("**"))
print("{0:}{0:>8}".format("**"))
print("{0:}{0:>8}".format("**"))
print("**********")
print("**********")

Примечание. Первый элемент списка имеет индекс 0. Когда для одного объекта используется несколько спецификаций формата, то для каждой из них первым символом в спецификации должен следовать символ-индекс выводимого объекта (в данном случае - он единственный, поэтому везде стоят нули).
Усложним задачу для закрепления основ работы с методом format().
Постановка задачи: Вывести слово "МИР" с помощью символа "*". Символы пробела и табуляции не использовать.

*     * *     * *****
**   ** *    ** *    *
*  *  * *  *  * *****
*     * **    * *
*     * *     * *

Решение:
Программа 2.7

print("{0:1}{0:>6}{0:>2}{0:>6}{1:>6}".format("*","*****"))
print("{0:1}{0:>5}{1:>2}{0:>6}{1:>2}{1:>5}".format("**","*"))
print("{0:1}{0:>3}{0:>3}{0:>2}{0:>3}{0:>3}{1:>6}".format("*","*****"))
print("{0:1}{0:>6}{1:>3}{0:>5}{0:>2}".format("*","**"))
print("{0:1}{0:>6}{0:>2}{0:>6}{0:>2}".format("*"))

В этой программе для одного или двух выводимых объектов используются от 5 до 7 спецификаций формата. На рисунке ниже поясняется как используется индексация для каждой спецификации.

Домашнее задание

Выведите следующие рисунки с помощью метода format() и функции print():

1.
*
**
***
** **
**  **
**   **
**    **
**     **
**      **
**       **
**        **
*************
**************
2.
         *****
             *
            **
           ***
          ****
         *****
        ******
       *******
      ********
     *********
    **********
   ***********
*********************
 *******************
  ****************
3.
       *
      ***
    *** ***
   ***   ***
 ***       ***
***         ***
 ***       ***
   ***   ***
    *** ***
      ***
       *
4.
     *
     *
     *
    * *
   *   *
  *  *  *
  * * * *
  *  *  *
  *     *
  *     *
  *     *
 **  *  **
* *  *  * *
* *  *  * *
***  *  ***
  *******
     *
    * *
    ***


Добавить комментарий