Как сделать табуляцию в питоне

Добавил пользователь Alex
Обновлено: 04.10.2024

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

В самом простом случае, строкой является последовательность символов заключенная в апострофы, кавычки, тройные кавычки или тройные апострофы:

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

Тем не менее если вам нужно использовать внутри стрроки кавычки или апострофы, то лучше всего экранировать их специальным символом \ :

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

Каквычки и апострофы служат для создания "коротких" строк, а тройные кавычки и тройные апострофы для "длинных". Лучше всего это можно продемонстрировать с помощью функции print() и специальных непечатаемых символов, например таких как \n – символ переноса строки, \t – символ табуляции (отступа).

При создании "длинных" строк нам не нужно вводить все непечатаемые символы вручную, т.е. мы можем печатать текст так, как привыкли это делать, спокойно используя клавиши Tab и Enter:

Причем, обычный вывод снова печатает строку "как есть", обозначая все символы переноса и табуляции:

А вот функция print() выполняет интерпретацию всех непечатаемых символов, выполняя все необходимые преобразования, в местах где они встречаются:

Ввод длинных строк

Наличие очень длинных строк в коде, очень затрудняет его чтение, поэтому в Python, предусмотренно несколько способов ввода таких строк. Допустим у нас есть какая-то очень длинная строка и по каким-то причинам мы не можем вставлять внутрь символ " \n ", что автоматически означает невозможность использования тройных кавычек или тройных апострофов. Ну не вводить же эту строку вот так:

Следует сразу отметить, что символ переноса строки " \n " для интерпретатора означает конец инструкции, но только в том случае если этот символ не находится внутри: круглых ( () ), квадратных ( [] ) и фигурных ( <> ) скобок, а так же тройных кавычках или тройных апострофах. Это очень удобно, если нам необходимо вводить очень длинные последовательности, например матрица 6x6 может быть введена вот так:

И в коде это будет смотреться гораздо лучше чем вот это:

Но для одинарных кавычек или апострофов этот способне не подойдет. Здесь на помощь приходит символ " \ " (newline), который интерпретируется как "новая строка", а не перевод на новую строку. Этот символ позволяет писать очень длинные "однострочные" иструкции в нескольких строках кода. И если вернуться к нашей строке:

То с помощью символа " \ " и оператора конкатенации мы можем записать ее вот так:

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

Второй способ, связан с тем, что если две строки присутствуют рядом в одной строке кода и разделены только пробелами, то они автоматически объединяются:

Надо сразу отметить, что этот трюк работает только для строковых литералов:

А если вспомнить, что символ " \n " игнорируется внутри круглых скобок, то наша длинная строка может быть записана и так:

Именно этот способ рекомендуется использовать в коде. Причем данный способ (в отличие от предыдущего) допускает комментирование:

Префиксы

Так же к литералам строк можно отнести префиксы (в скобках указаны альтернативные способы их написания):

  • u ( U );
  • r ( R );
  • b ( B );
  • f ( F );
  • fr ( rf , fR , rF , Rf , Fr , FR , RF );
  • br ( rb , rB , bR , Br , Rb , BR , RB ).

Нужно сразу уточнить, что между префиксом и строкой не может быть знаков пробела.

Префикс u

Префикс u обозначает строки Юникода и существует лишь для совместимости строк в коде Python3 и Python2. Так что если вы имеете дело только с Python3, то можете смело забыть об этом префиксе.

Префикс r

Префикс r обозначает неформатируемые (или необрабатываемые) строки, в которых подавляется действие символов экранирования. Такие строки очень удобны, для хранения путей к файлам в Windows, например:

Может показаться, что строка хранит неверный с точки зрения синтаксиса операционной системы путь, но если воспользоваться функцией print() , то мы увидим как интерпретатор ее передает:

Такие строки можно спокойно использовать для работы с файловой системой. Единственное, что следует помнить так это то что неформатированная строка не может заканчиваться символом обратного слеша, т.е. строка r'D:\\мои документы\книги\' является недопустимой (как и любая друга строка, заканчивающаяся нечетным количеством обратных слешей). В этой ситуации можно поступить тремя способами.

Первый способ заключается в том что бы добавить в конец строки два символа \ , а затем удалить последний из них:

Можно добавить экранированный символ обратного слеша \\ вручную:

Или вообще вместо экранированных строк использовать обычные, в которых каждый символ обратного слеша экранирован:

Так же неформатированные строки очень часто используются для хранения разметки LATEX, которая может быть использована для создания математических формул. Например, строка \sum_^k^=> интерпретируется как формула:

А в Python использовать такую строку можно так:

Префикс b

Префикс b используется для обозначения байтовых строк, которые отражают не структуру текста, а двоичную структуру каких-то данных, например файлов с изображениями или аудиофайлов. Каждому байту в такой строке соответствует определенное числовое значение из диапазона [0; 255] . Такие строки могут содержать символы ASCII, но символы с кодом в диапазоне [128, 255] должны быть выражены с помощью экранирования символом \x :

Префикс f

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

Работа данного префикса основана том же микроязыке спецификаторов форматирования, который использует метод format() (см смотрите str.format() — метод форматирования строк). На первый взгляд, этот язык выглядит довольно замысловатой штукой, но если разобраться, то все станет довольно просто.

Как это работает? Допустим, у нас есть строка 'коэффициент k = ' и после знака = мы хотим вставить какое-то числовое вещественное значение, допустим 7.143827 . Вот как это будет выглядеть в коде:

С помощью фигурных скобок <> мы указываем то место в котором должно быть размещено поле для вставки. Внутри скобок, мы сначала указали подставляемое значение 7.143827 , а после двоеточия правила его форматирования. Знак = означает, что если значение короче чем ширина поля, то оно должно быть дополнено слева до нужной ширины тем символом, который указан слева от = , в нашем случае этот символ 0 . Далее, после знака = указан символ + , который вынуждает обозначать положительные и отрицательные числа соответствующими знаками: + или - . Далее, перед . указано число 10 – это ширина поля. А вот число после точки указывает точность (ширину дробной части вместе с точкой) представления вещественного числа.

Действительно замысловато, но в определенных ситуациях весьма и весьма удобно:

В общем, будем считать, что с префиксом f мы немного познакомились, но по хорошему, он заслуживает отдельной страницы.

Префикс fr

Префикс fr определяет литералы форматируемых (!) неформатируемых строк. Иногда, строки с префиксом r действительно называют неформатируемыми, подразумевая, что экранированные последовательности не обрабатываются, а раз они содержат необработанные экранированные последовательности, то их и называют "сырыми". Таким образом, префикс fr это форматируемая "сырая строка".

Существуют ситуации, в которых такие строки могут оказаться весьма удобны. Например, формирование путей к файлам:

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

LATEX-разметка этой формулы имеет следующий вид: x^>>>\,\Gamma(k)>> . И, допустим, мы хотим подставить в нее значения:

Для сохранения каждой фигурной скобки, нам пришлось ее дублировать, т.к. если этого не делать то интерпретатор может ее счесть за начало указателя для вставки поля:

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

Префикс br

Префикс br определяет "сырые" строки байтов, в которых каждый байт всегда выводится в шестнадцатеричном формате, а символы обратного слеша дополнительно экранируются. Обычные строки байтов могут содержать ASCII символы, но иногда это нежелательно:

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

Но все же, допустим у нас есть строка байтов b'\x61' :

Добавим префикс br :

Посмотрим на длины строк:

В строке br'\x61' последовательность \x61 интерпретируется не как код символа a , а как \(4\) отдельных символа. Однако, если обратиться к этим символам, то:

То поймем, что обращение к символам по индексу возвращает числовые коды Юникода. А это лишний раз подтверждает, что я вообще не понимаю для чего нужен этот префикс.

Метод expandtabs() возвращает копию строки, в которой все символы табуляции ‘\ t’ заменены пробелами до следующего кратного значения параметра tabsize.

Параметры expandtabs()

Команда в Python принимает целочисленный аргумент tabsize. Размер табуляции по умолчанию ‒ 8.

Возвращаемое значение

Модуль возвращает строку, в которой все символы ‘\ t’ заменяются пробелами до следующего кратного параметра tabsize.

Пример 1: Без аргумента

Как работает?

Модуль отслеживает текущую позицию курсора. Позиция первого символа ‘\ t’ в приведенной выше программе ‒ 3. И размер табуляции равен 8 (если аргумент не передан).

Символ expandtabs() заменяет ‘\ t’ пробелом до следующей позиции табуляции. Позиция ‘\ t’ ‒ 3, а первая позиция табуляции ‒ 8. Следовательно, количество пробелов после ‘xyz’ равно 5.

Следующие позиции табуляции кратны размеру табуляции. Следующие позиции табуляции ‒ 16, 24, 32 и так далее.

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

Строка в Python - это набор символов, окруженных одинарными, двойными или тройными кавычками. Компьютер не понимает символы; внутри он хранит управляемый символ как комбинацию 0 и 1 .

Каждый символ кодируется в ASCII или Unicode. Поэтому можно сказать, что строки Python также называют коллекцией символов Unicode.

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

Рассмотрим следующий пример на языке Python для создания строки.

Если мы проверим тип переменной str с помощью сценария Python print(type(str)) , то будет выведено:

В Python строки рассматриваются как последовательность символов, что означает, что Python не поддерживает символьный тип данных; вместо этого один символ, записанный как p , рассматривается как строка длины 1 .

Создание строки в Python

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

Индексация и разбиение строк в Python

Как и в других языках, индексация строк в Python начинается с 0 . Например, строка "HELLO" индексируется так, как показано на рисунке ниже.

Индексация и разбиение строк в Python

Рассмотрим следующий пример:

В Python мы можем использовать оператор : (двоеточие) для доступа к подстроке из заданной строки. Рассмотрим следующий пример.

доступ к подстроке из заданной строки в Python

Здесь мы должны заметить, что верхний диапазон, заданный в операторе slice , всегда является эксклюзивным, т.е. если задано str = 'HELLO' , то str[1:3] всегда будет включать str[1] = 'E' , str[2] = 'L' и ничего больше.

Рассмотрим следующий пример:

Мы можем сделать отрицательную нарезку в строке; она начинается с самого правого символа, который обозначается как -1 . Второй крайний правый индекс обозначает -2 , и так далее. Рассмотрим следующее изображение.

отрицательный slice в строке python

Рассмотрим следующий пример

Переназначение строк

Обновить содержимое строки так же просто, как присвоить его новой строке. Объект string не поддерживает присваивание элементов, т.е. строка может быть заменена только новой строкой, поскольку ее содержимое не может быть частично заменено. В Python строки неизменяемы.

Рассмотрим следующий пример.

Однако в примере 1 строка str может быть полностью присвоена новому содержимому, как указано в следующем примере.

Удаление строки в Python

Как мы знаем, строки неизменяемы. Мы не можем удалить или убрать символы из строки. Но мы можем удалить всю строку, используя ключевое слово del .

Пробуем удалить часть строки:

Теперь мы пробуем удалить всю строку:

Строковые операторы в Python

Оператор Описание
+ Ооператор конкатенации, используемый для соединения строк, заданных по обе стороны от оператора.
* Оператор повторения. Он объединяет несколько копий одной и той же строки.
[] Оператор среза. Он используется для доступа к подстрокам определенной строки.
[:] Оператор среза диапазона. Он используется для доступа к символам из указанного диапазона.
in Оператор членства. Он возвращает, присутствует ли определенная подстрока в указанной строке.
not in Оператором членства и выполняет прямо противоположное действие по отношению к in . Он возвращает true , если определенная подстрока отсутствует в указанной строке.
r/R Используется для указания необработанной строки. Необработанные строки используются в тех случаях, когда необходимо вывести фактическое значение управляющих символов, таких как C://python . Чтобы определить любую строку как необработанную, за строкой следует символ r или R .
% Он используется для форматирования строк. Он использует спецификаторы формата, применяемые в программировании на языке C , такие как %d или %f , для отображения их значений в python.

Рассмотрим следующий пример, чтобы понять использование операторов Python.

Форматирование строк в Python

Экранирование последовательности

Допустим, нам нужно записать текст в виде - They said, "Hello what's going on?"- данное утверждение может быть записано в одинарных или двойных кавычках, но оно вызовет SyntaxError , так как содержит как одинарные, так и двойные кавычки.

Рассмотрим следующий пример, чтобы понять реальное использование операторов Python.

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

Символ обратной косой черты ( / ) обозначает escape последовательность. За обратной косой чертой может следовать специальный символ, который интерпретируется по-разному. Одинарные кавычки внутри строки должны быть экранированы. Мы можем применить то же самое, что и в случае с двойными кавычками.

Ниже приведен список управляющих последовательностей для экранирования:

Escape последовательность Описание
\newline Игнорирует новую строку.
\\ Обратный слэш
\' Одинарные кавычки
\\'' Двойные кавычки
\a ASCII гудок
\b ASCII Backspace(BS)
\f ASCII Formfeed (смещение к началу след. страницы)
\n ASCII Linefeed (перевод на след. строку)
\r ASCII Carriege Return(CR) (перемещение курсора к левому краю поля)
\t ASCII горизонтальная табуляция
\v ASCII вертикальная табуляция
\ooo Символ с восьмеричным значением
\xHH Символ с шестнадцатеричным значением.

Вот простой пример использования escape-последовательности.

Мы можем игнорировать управляющую последовательность из заданной строки, используя необработанную строку. Для этого перед строкой нужно написать r или R . Рассмотрим следующий пример.

Метод format() в python

Метод format() является наиболее гибким и полезным методом форматирования строк. Фигурные скобки <> используются в качестве заполнителя строки и заменяются аргументом метода format() . Рассмотрим приведенный пример:

Форматирование строк в Python с помощью оператора %

Python позволяет нам использовать спецификаторы формата, используемые в операторе printf языка Си . Спецификаторы формата в Python обрабатываются так же, как и в C. Однако Python предоставляет дополнительный оператор % , который используется в качестве интерфейса между спецификаторами формата и их значениями. Другими словами, можно сказать, что он связывает спецификаторы формата со значениями.

Рассмотрим следующий пример.

Строковые функции в Python

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

Рекомендуется использовать 4 пробела на каждый уровень отступа. Python 3 запрещает смешивание табуляции и пробелов в отступах. Код, в котором используются и те, и другие типы отступов, должен быть исправлен так, чтобы отступы в нем были расставлены только с помощью пробелов.

2. Точки с запятой

Не разделяйте ваши строки с помощью точек с запятой и не используйте точки с запятой для разделения команд, находящихся на одной строке.

3. Скобки

Используйте скобки экономно. Не используйте их с выражением return или с условной конструкцией, если не требуется организовать перенос строки. Однако скобки хорошо использовать для создания кортежей.

4. Пробелы в выражениях и инструкциях

4.1 Пробелы и скобки

4.1.1 Не ставьте пробелы внутри каких-либо скобок (обычных, фигурных и квадратных).

4.1.2 Никаких пробелов перед открывающей скобкой, которая начинает список аргументов, индекс или срез.

Хорошо Плохо Хорошо Плохо

4.2 Пробелы рядом с запятой, точкой с запятой и точкой

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

4.3 Пробелы вокруг бинарных операторов

4.3.1 Окружайте бинарные операторы одиночными пробелами с каждой стороны. Это касается присваивания ( = ), операторов сравнения ( == , , > , != , <> , , >= , in , not in , is , is not ), и булевых операторов ( and , or , not ). Используйте, как вам покажется правильным, окружение пробелами по отношению к арифметическим операторам, но расстановка пробелов по обеим сторонам бинарного оператора придает целостность коду.

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

4.3.3 Не используйте пробелы по сторонам знака = , когда вы используете его, чтобы указать на именованный аргумент или значение по умолчанию.

5. Длина строк

Ограничивайте длину строк 79 символами (а длину строк документации и комментариев — 72 символами). В общем случае не используйте обратный слеш в качестве перехода на новую строку. Используйте доступное в Python явное объединение строк посредством круглых и фигурных скобок. Если необходимо, можно добавить дополнительную пару скобок вокруг выражения.

Если ваш текст не помещается в одну строку, используйте скобки для явного объединения строк.

Что касается длинных URL в комментариях, то располагайте их, если это необходимо, на одной строке.

Обратный слеш иногда используется. Например, с длинной конструкцией with для переноса блока инструкций.

Ещё один подобный случай — длинные assert .

6. Пустые строки

Отделяйте функции (верхнего уровня, не функции внутри функций) и определения классов двумя пустыми строками. Определения методов внутри класса отделяйте одной пустой строкой. Две пустые строки должны быть между объявлениями верхнего уровня, будь это класс или функция. Одна пустая строка должна быть между определениями методов и между объявлением класса и его первым методом.

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

Python расценивает символ control+L как незначащий (whitespace), и вы можете использовать его, потому что многие редакторы обрабатывают его как разрыв страницы — таким образом, логические части в файле будут на разных страницах. Однако не все редакторы распознают control+L и могут на его месте отображать другой символ.

7. Имена

Имена, которых следует избегать:

7.1 Имена функций

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

Стиль mixedCase допускается в тех местах, где уже преобладает такой стиль — для сохранения обратной совместимости.

7.2 Имена модулей и пакетов

Модули должны иметь короткие имена, состоящие из маленьких букв. Можно использовать символы подчёркивания, если это улучшает читабельность. То же самое относится и к именам пакетов, однако в именах пакетов не рекомендуется использовать символ подчёркивания.

Так как имена модулей отображаются в имена файлов, а некоторые файловые системы являются нечувствительными к регистру символов и обрезают длинные имена, очень важно использовать достаточно короткие имена модулей — это не проблема в Unix, но, возможно, код окажется непереносимым в старые версии Windows, Mac, или DOS.

7.3 Имена классов

Все имена классов должны следовать соглашению CapWords почти без исключений.

Иногда вместо этого могут использоваться соглашения для именования функций, если интерфейс документирован и используется в основном как функции.

Обратите внимание, что существуют отдельных соглашения о встроенных именах: большинство встроенных имен — одно слово (либо два слитно написанных слова), а соглашение CapWords используется только для именования исключений и встроенных констант.

Так как исключения являются классами, к исключениями применяется стиль именования классов. Однако вы можете добавить Error в конце имени (если, конечно, исключение действительно является ошибкой).

7.4 Имена констант

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

8. Комментарии

Комментарии, противоречащие коду, хуже, чем отсутствие комментариев. Всегда исправляйте комментарии, если меняете код!

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

Ставьте два пробела после точки в конце предложения.

Если вы — программист, не говорящий по-английски, то всё равно следует использовать английский язык для написания комментариев. Особенно, если нет уверенности на 120% в том, что этот код будут читать только люди, говорящие на вашем родном языке.

8.1 Блоки комментариев

8.2 Комментарии в строке с кодом

Старайтесь реже использовать подобные комментарии.

Комментарии в строке с кодом не нужны и только отвлекают от чтения, если они объясняют очевидное.

8.3 Строки документации

Соглашения о написании хорошей документации (docstrings) зафиксированы в PEP 257.

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

Очень важно, чтобы закрывающие кавычки стояли на отдельной строке. А еще лучше, если перед ними будет ещё и пустая строка.

Для однострочной документации можно оставить """ на той же строке.

9. Циклы

9.1 Циклы по спискам

Если нам необходимо в цикле пройти по всем элементам списка, то хорошим тоном (да и более читаемым) будет такой способ:

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

А если нужно пройти по списку задом наперед, то лучше всего использовать метод reversed:

Вместо того чтобы писать избыточный код, который и читается-то не очень внятно.

9.2 Циклы по списку чисел

Если есть необходимость пройти в цикле по ряду чисел, то метод range будет намного приемлемее, как минимум потому, что этот метод потребляет намного меньше памяти, чем вариант в блоке "Плохо". А представьте, что у вас ряд из трёх миллиардов последовательных чисел!

9.3 Циклы по спискам с индексами

Метод enumerate позволяет получить сразу индекс и значение из списка, что, во-первых, предоставляет множество возможностей для дальшнейшего проектирования, а во-вторых, такой код легче читается и воспринимается.

9.4 Циклы по двум спискам

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

10. Импорты

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

В то же время, можно писать так:

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

  • импорты из стандартной библиотеки,
  • сторонние импорты,
  • импорты из библиотек вашего приложения.

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

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

Следует избегать шаблонов импортов ( from import * ), так как они делают неясным то, какие имена присутствуют в глобальном пространстве имён, что вводит в заблуждение как читателей, так и многие автоматизированные средства.

Рекомендуем также ознакомиться с полной версией соглашения о том, как писать код на Python (PEP 8)

Читайте также: