Основы Python — кратко. Строки.
Поскольку число положительных отзывов превысило число отрицательных, продолжу выкладывание уроков. Те кто уже знаком с основами — можете или просто пропустить урок, или попробовать сделать задание 3 самым коротким способом :)
Для начала маленькое замечание.
Начиная с Python 2.3, всем, кто использует не-ASCII кодировку нужно добавлять указание о кодировке в самом начале программы. Для русского языка это будет в основном:
# -*- coding: cp1251 -*-
или использовать для хранения исходных текстов файлы utf-8 (что предпочтительней).
Изучив управление числами, пришла пора осваивать строки. Пайтон обладает весьма богатым набором возможностей в этой области.
Строки
Строки могут быть заключены в одинарные или двойные кавычки, строки могут использовать esc-последовательности в стиле С, многострочные константы задаются в тройных кавычках.
>>> "habrahabr" 'habrahabr' >>> 'foo bar boz' 'foo bar boz' >>> "won't" "won't" >>> 'don"t' 'don"t' >>> "couldn\"t" 'couldn"t' >>> """multi line ... very long ... string constant""" 'multi line\nvery long\nstring constant' >>> 'this takes \ ... two lines' 'this takes two lines'
Строки можно склеивать оператором + и «размножать» оператором *
>>> "Hello "+"word" 'Hello word' >>> "Hello "*3 'Hello Hello Hello '
По сути же своей строка представляет собой последовательность символов с произвольным доступом. Для получения части символов строки можно использовать т.н. оператор «среза». Обратите внимание, что нумерация начитается с нуля (и достаточно хаотична на первый взгляд).
>>> str = "Hello, cruel world!" # получить 4 символ строки >>> str[3] 'l' # все символы с 8 по 14 >>> str[7:14] 'cruel w' # каждый второй символ со 2 по 13 >>> str[1:12:2] 'el,cul' # некоторые значения можно опускать # каждый второй символ строки. >>> str[::2] 'Hlo re ol!'
Если опустить первый из трех параметров, он считается равным нулю, если опустить второй – срез будет продолжен до конца строки.
# первые 2 символа строки >>> str[:2] 'He' # вся строка кроме 2 первых символов >>> str[2:] 'llo, cruel world!'
Срезы с неправильными границами обрабатываются следующим образом:
— если верхняя граница среза больше длины строки, то она уменьшается до длины строки
— если нижняя граница больше верхней, то возвращается пустая строка
Также срезы могут принимать отрицательные значения.
# последний символ >>> str[-1] '!' # второй символ с конца >>> str[-2] 'd' # два последних символа >>> str[-2:] 'd!' # все символы кроме последних двух >>> str[:-2] 'Hello, cruel worl'
Лучший способ запомнить, как определяются индексы в срезе — считать их указывающими между символами, с номером 0 на левой границе первого символа. А правая граница последнего символа имеет индекс равный длине строки.
Для положительных символов длина строки равна разности между числами на границе.
Для определения длины строки используется функция len().
Unicode
В последних версиях Пайтон очень хорошо поддерживается работа с Unicode-строками.
Для задания unicode-строки в виде константы используется префикс u.
>>> uni = u"Тест" >>> uni u'\u0422\u0435\u0441\u0442'
Кроме того, Пайтон позволяет создать строку в Unicode с помощью одноименной функции.
>>> uni = unicode("Тест", "UTF-8") >>> uni u'\u0422\u0435\u0441\u0442'
Эта функция функция может работать с Latin-1, ASCII, UTF-8, UTF-16, с русскими кодировками ISO-8859-5, KOI8-R, CP1251, CP866 и Mac-cyrillic, и многими другими.
Для обратного преобразования служит метод encode, который преобразует unicode-строку в строку с заданной кодировкой.
>>> uni.encode("UTF-8") '\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82' >>> uni.encode("CP1251") '\xd2\xe5\xf1\xf2'
Для преобразования строки в список по определенному разделителю, используется метод split.
Этот метод в качестве параметра запрашивает разделитель, а возвращает список отдельных «слов» по которому можно «пройти» в цикле for.
>>> str = "Mary has a little lamb" >>> str.split(" ") ['Mary', 'has', 'a', 'little', 'lamb'] >>> for word in str.split(" "): ... print word ... Mary has a little lamb
Домашнее задание.
1. Написать программу, выводящую заданную пользователем строку как минимум в 3 разных кодировках. При этом писать вызов метода encode() в программе можно только 1 раз.
2. Написать программу поиска самого длинного слова в строке, разделенной пробелами.
3. (Повышенная сложность) Написать программу декодирования телефонного номера для АОН.
По запросу АОНа АТС посылает телефонный номер, используя следующие правила:
— Если цифра повторяется менее 2 раз, то это помеха и она должна быть отброшена
— Каждая значащая цифра повторяется минимум 2 раза
— Если в номере идут несколько цифр подряд, то для обозначения «такая же цифра как предыдущая» используется идущий 2 или более подряд раз знак #
Например, входящая строка 4434###552222311333661 соответствует номеру 4452136
Кстати, регулярные выражения использовать в этих заданиях — нельзя :)