A B R A C A D A B R A

IndexError: string index out of range

>>> s[8]

 

Traceback (most recent call last):

File "<pyshell#3>", line 1, in <module>

s[8]

IndexError: string index out of range

>>> s[7]

'1'

>>> s[ -7 ]

't'

>>> s[ -12 ]

 

Traceback (most recent call last):

File "<pyshell#6>", line 1, in <module>

s[ -12 ]

IndexError: string index out of range

 

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

>>> s = 'Stroka 1'

>>> len (s)

8

>>> s[7] = 2

 

Traceback (most recent call last):

File "<pyshell#10>", line 1, in <module>

s[7] = 2

TypeError: 'str' object does not support item assignment

 

В тоже время в Питоне существует очень мощное и удобное средство манипулирования данными строки - это так называемый "срез" строки или часть строки, задаваемая диапазоном индексов (такой "срез" в большинстве языков программирования называется "подстрокой"). При этом в квадратных скобках указывается индекс первого символа "среза", затем ставится разделитель (двоеточие) и значение индекса символа до которого берется "срез". При это символ, соответствующий завершающему индексу не включается в срез! Сформированный результат среза представляет собой новую строку.

Например:

 

>>> s = 'Stroka1'

>>> s1 = s[ 0: 6 ]

'Stroka'

>>> s1 = s[ 0: -1 ]

>>> s1

'Stroka'

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

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

 

>>> s = 'Stroka1'

>>> s[ 0: 3 ]

'Str'

>>> s[: 3 ]

'Str'

 

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

 

>>> s = 'Stroka1'

>>> s[ 3: len(s)]

'oka1'

>>> s[ 3: ]

'oka1'

 

Как видно из примеров, срез формирует новую строку из части имеющейся. Отсюда видно, что получить копию исходной строки можно взяв в качестве среза всю строку:

>>> s = 'Stroka1'

>>> s1 = s[ 0: len(s) ]

>>> s2 = s[:]

>>> s1

'Stroka1'

>>> s2

'Stroka1'

Теперь понятно, как можно сформировать строку 'Stroka3' из строки 'Stroka1':

>>> s[:-1] + '2'

'Stroka2'

 

Или можно изменить непосредственно значение строки s:

>>> s

'Stroka1'

>>> s = s[:-1] + '2'

>>> s

'Stroka2'

 

Способ 2 определения строк в Питоне. Прежде чем определить второй способ определения строк, рассмотрим следующую задачу.

Строка содержит некоторое обозначение пути к файлу и его имя

Например

s = 'c:\_DD\work1\t1.txt'

print s

 

Результат получится не тот, который мы ожидали увидеть

>>>

c:\_DD\work1 1.txt

Это происходит потому, что в определении пути файла встречается "обратный" слеш, который определяет специальные символы (в данном случае - табуляцию).

Для пример, длина теста строки - 19 символов (можно пересчитать). А длина выводимой строки - 18 символов (т.к. запись обозначает ОДИН символ - символ табуляции):

s = 'c:\_DD\work1\t1.txt'

print s

print len(s)

 

>>>

c:\_DD\work1 1.txt

18

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

s = 'c:\\_DD\\work1\\t1.txt'

print s

print len(s)

 

>>>

c:\_DD\work1\t1.txt

19

 

Так как обозначения путей файлов в программировании встречается достаточно часто, в Питоне существует специальная запись строк, при которой обратный слеш не рассматривается как специальный символ - так называемые "свободные" (от специальных символов) строки или raw-string. Внутренняя структура объекта такой строки ничем не отличается от обычной. Просто при ее формировании во время работы транслятора обратный слеш на рассматривается как спец. символ. Признаком такой строки является буква r перед первой кавычкой в определении строки:

s = 'c:\\_DD\\work1\\t1.txt'

print s

print len(s)

 

s = r'c:\_DD\work1\t1.txt'

print s

print len(s)

 

>>>

c:\_DD\work1\t1.txt

19

c:\_DD\work1\t1.txt

19

 

Способ 3 определения строк в Питоне. следующий тип строк - это строки произвольной длины, литералы которых могут быть записаны в нескольких строках. Если вы знаете HTML, то этот тип строки несколько напоминает тег   <PRE>.

Например:

 

s = '''String1

String2 String3

   String4

'''

 

print s

 

Результат:

>>>

String1

String2 String3

   String4

 

>>>

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

Строки типа ЮНИКОД (обозначаемые префиксом u перед первой кавычкой: u'Stroka UNICODE') будут нами рассмотрены позднее.

 

 

 

Практические работы.

 

Задание 1.

 

Иногда при отладке программы необходимо точно определить содержимое строки.

Например:

s = 'String1 String2 String3'

print s

print s[8:17]

 

Результат:

>>>

String1 String2 String3

 String2

>>>

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

В таких случаях используется вывод "с ограничителями":

Например, в качестве ограничителей используем символы ">" и "<":

s = 'String1 String2 String3'

print s

print '>' + s[8:17] + '<'

Результат:

>>>

String1 String2 String3

> String2 <

>>>

Четко видно, что в начале и в конце выделенной подстроки имеются пробелы.

 

Задача 1.

 

Теперь рассмотрим простую "традиционную" задачу:

Задана строка "ABRACADABRA"

Требуется вывести на печать (экран" следующую "косынку":

A B R A C A D A B R A

B R A C A D A B R

R A C A D A B

A C A D A

   C A D

       A

Вывод осуществляется путем последовательного использования инструкций print и срезов основной строки "A B R A C A D A B R A".

Сформировать на основе простой последовательной программы процедуру prinAbra.

 

Задача 2.

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

Мы уже пользовались стандартным модулем математических функций math. Для работы со строками также имеется стандартный модуль string. Здесь мы рассмотрим только несколько функций. Одна из таких функций string.center. Эта функция имеет 3 аргумента:

  1. строка, которую надо выровнять по центу некоторого поля;
  2. ширина этого поля (в символах);
  3. "заполнитель" свободного места (по умолчанию это - ПРОБЕЛ).

 

Например, мы хотим выровнять по центру поля шириной 20 символов строку 'String1':

 

import string

 

s1 = 'String1'

print '>' + string.center(s1, 20) + '<'

print '>' + string.center(s1, 20, '*') + '<'

Результат:

>>>

> String1  <

>******String1*******<

>>>

Если при этом исходная строка превышает заданный размер поля, по которому производится выравнивание, то поле автоматически расширяется до нужного размера:

 

s1 = 'String1'

print '>' + string.center(s1, 20) + '<'

print '>' + string.center(s1, 20, '*') + '<'

print '>' + string.center(s1*5, 20) + '<'

Результат:

>>>

> String1      <

>******String1*******<

>String1String1String1String1String1<

>>>

Аналогичные функции имеются для выравнивания по правому и ли левому полю - ljust и rjust соответственно.

 




double arrow
Сейчас читают про: