Страницы

среда, 21 ноября 2012 г.

Строки. Индексы и срезы.

К элементам строки можно обращаться но индексу, прямо как в С. Первый символ строки имеет индекс 0. В отличие от языка С, строки в Python изменять нельзя. Назначение значения индексу строки, приведет к ошибке.
>>> s = 'Hello'
>>> s[0]
'H'
>>> s[0] = 'h'
Traceback (most recent call last):
  File "&;lt;pyshell#38>", line 1, in <module>
    s[0] = 'h'
TypeError: 'str' object does not support item assignment
Операция извлечения нескольких индексов, называется срезом. Для создания среза (подстроки) используется два индекса, разделенные двоеточиями.
>>>word = 'HelpA'
>>> word[4]
'A'
>>> word[0:2]
'He'
>>> word[2:4]
'lp'
У среза опущенный первый индекс по умолчанию будет равен нулю, а второй размеру строки.
>>> word[:2]    # The first two characters
'He'
>>> word[2:]    # Everything except the first two characters
'lpA'
Третий индекс в срезе означает шаг.
>>> word = 'HelpA'
>>> word[::2]
'HlA'
При помощи срезом можно очень просто и в тоже время очень эффективно создавать новые строки на базе уже имеющихся.
>>> 'x' + word[1:]
'xelpA'
>>> 'Splat' + word[4]
'SplatA'
>>> word[:2] + word[2:]
'HelpA'
>>> word[:3] + word[3:]
'HelpA'
Вырожденные срезы обрабатываются корректно. Слишком большой индекс, заменяется на размер строки, а если верхняя граница меньше, чем нижняя возвращается пустая строка.
>>> word[1:100]
'elpA'
>>> word[10:]
''
>>> word[2:1]
''
Индексы могут быть отрицательными, в этом случае отсчет начинается с права.
>>> word[-1]     # The last character
'A'
>>> word[-2]     # The last-but-one character
'p'
>>> word[-2:]    # The last two characters
'pA'
>>> word[:-2]    # Everything except the last two characters
'Hel'
>>> word[-0]     # (since -0 equals 0)
'H'
Следует обратить внимание, что -0 это 0, поэтому отсчет не начинается с права. В случаи, если отрицательные индексы выходят за диапазон, срез усекается. Но это не сработает, если индекс будет один, интерпретатор выдаст ошибку.
>>> word[-100:]
'HelpA'
>>> word[-10]    # error
Traceback (most recent call last):
  File "", line 1, in ?
IndexError: string index out of range
Можно легко запомнить как работают срезы, если представить индексы как указатели между символами.
 +---+---+---+---+---+
 | H | e | l | p | A |
 +---+---+---+---+---+
 0   1   2   3   4   5
-5  -4  -3  -2  -1
Небольшой фокус. Если сделать полный срез строки, но с отрицательным шагом, мы получим перевернутую строку.
>>> word
'HelpA'
>>> word[::-1]
'ApleH'
А для того чтобы получить последний элемент в строке, достаточно просто задать индекс -1.
>>> word
'HelpA'
>>> word[-1]
'A'

Строки. Основы.

Первое, что следует понять в Python строки это не изменяемые объекты. Каждый раз когда мы вносим изменения в строку, мы создаем новую. Строки могут быть записаны несколькими способами. Их можно заключить в одинарные или двойные кавычки.
>>> 'spam eggs'
'spam eggs'
>>> 'doesn\'t'
"doesn't"
>>> "doesn't"
"doesn't"
>>> '"Yes," he said.'
'"Yes," he said.'
>>> "\"Yes,\" he said."
'"Yes," he said.'
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'
Интерпретатор печатает символы, так же как они были набраны, за исключением кавычек и непечатаемых символов, для их отображения используется экранирование, обратная косая черта. Строковые литералы могут занимать несколько строк, для этого следует в конце строки поставить знак "\", указав, что следующая строка это логическое продолжение. Для переноса строки используется непечатаемый символ "\n".
hello = "This is a rather long string containing\n\
several lines of text just as you would do in C.\n\
    Note that whitespace at the beginning of the line is\
 significant."

print hello

This is a rather long string containing
several lines of text just as you would do in C.
    Note that whitespace at the beginning of the line is significant.
Так же строки могут находиться внутри тройных кавычек ''' или """. При таком форматировании строки будут выводиться на экран как есть. Этот подход часто используется для создания документации к модулю или программе.
print """
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
"""

Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to 
Для того чтобы сделать строковый литерал не изменяемым, необходимо перед ним поставить знак "r" ("raw"). В этом случае интерпретатор не будет обрабатывать непечатаемые символы, такие как "\n". Такой подход удобно использовать при формировании путей к файлам, так как путь может содержать "\n" (перенос строки) или "\t" (табуляция).
>>> path = 'C:\new\tmp'
>>> print path
C:
ew mp

>>> path = r'C:\new\tmp'
>>> print path
C:\new\tmp
>>> 
Строки можно объединять (конкатенировать) при помощи оператора "+" или повторять, оператор "*"
>>> word = 'Help' + 'A'
>>> word
'HelpA'
>>> '<' + word*5 + '>'
'<HelpAHelpAHelpAHelpAHelpA&>'
Если литералы стоят рядом друг с другом, они автоматически объединятся.
>>> 'hello ' 'world' '!' '.'
'hello world!.'