Сообщение длиной 28672 символа занимает в памяти 21 кбайт. Найдите степень алфавита, который
Обновлено: 22.11.2024
До сих пор мы видели пять типов: int , float , bool , NoneType и стр . Строки качественно отличаются от остальных четырех, поскольку состоят из более мелких частей — символов.
Типы, состоящие из более мелких частей, называются составными типами данных. В зависимости от того, что мы делаем, мы можем захотеть рассматривать составной тип данных как единую вещь или мы можем захотеть получить доступ к его частям. Эта двусмысленность полезна.
Оператор квадратных скобок выбирает один символ из строки:
Выражение fruit[1] выбирает символ номер 1 из fruit . Переменная letter относится к результату. Когда мы отображаем letter , мы получаем сюрприз:
Первая буква "банан" не a , если только вы не компьютерщик. По извращенным причинам ученые-компьютерщики всегда начинают считать с нуля. Нулевая буква (zero-eth) слова "banana" — b. 1-я буква ( one-eth ) — это a , а 2-я ( two-eth ) буква — n .
Если вам нужна нулевая буква строки, просто поместите 0 или любое выражение со значением 0 в скобки:
Выражение в скобках называется индексом. Индекс определяет элемент упорядоченного набора, в данном случае набор символов в строке. Индекс указывает, какой из них вам нужен, отсюда и название. Это может быть любое целочисленное выражение.
7.2. Длина¶
Функция len возвращает количество символов в строке:
Чтобы получить последнюю букву строки, у вас может возникнуть соблазн попробовать что-то вроде этого:
Это не сработает. Это вызывает ошибку времени выполнения IndexError: string index out of range . Причина в том, что в "банан" нет 6-й буквы. Поскольку мы начали считать с нуля, шесть букв пронумерованы от 0 до 5. Чтобы получить последний символ, мы должны вычесть 1 из length :
В качестве альтернативы мы можем использовать отрицательные индексы, которые ведут обратный отсчет от конца строки. Выражение fruit[-1] возвращает последнюю букву, fruit[-2] возвращает предпоследнюю и так далее.
7.3. Обход и цикл for¶
Многие вычисления включают обработку строки по одному символу за раз. Часто они начинаются с самого начала, выбирают по очереди каждого персонажа, что-то делают с ним и продолжают до конца. Этот шаблон обработки называется обходом. Один из способов кодирования обхода — оператор while:
Этот цикл проходит по строке и отображает каждую букву в строке отдельно. Условием цикла является index len(fruit) , поэтому, когда index равно длине строки, условие ложно, и тело цикла не выполняется. . Последний доступный символ — это символ с индексом len(fruit)-1 , который является последним символом в строке.
Использование индекса для обхода набора значений настолько распространено, что Python предоставляет альтернативный, более простой синтаксис — цикл for:
Каждый раз в цикле следующий символ в строке присваивается переменной char . Цикл продолжается до тех пор, пока не останется символов.
В следующем примере показано, как использовать конкатенацию и цикл for для создания абеседарианского ряда. Abecedarian относится к ряду или списку, в котором элементы расположены в алфавитном порядке. Например, в книге Роберта Макклоски Уступи дорогу утятам утят зовут Джек, Как, Лак, Мак, Нак, Уак, Стая и Шарлатан. Этот цикл выводит эти имена по порядку:
Вывод этой программы:
Конечно, это не совсем так, потому что Ouack и Quack написаны с ошибками. Вы исправите это в упражнении ниже.
7.4. Срезы строк¶
Подстрока строки называется срезом. Выбор фрагмента аналогичен выбору символа:
Операция [n:m] возвращает часть строки от n-го символа до m-го символа, включая первый, но исключая последний. Такое поведение противоречит здравому смыслу; имеет больше смысла, если вы представите индексы, указывающие между символами, как на следующей диаграмме:
Если опустить первый индекс (перед двоеточием), срез начинается с начала строки. Если вы опускаете второй индекс, срез идет в конец строки. Таким образом:
Как вы думаете, что означает s[:]?
7.5. Сравнение строк¶
Операторы сравнения работают со строками. Чтобы узнать, равны ли две строки:
Другие операции сравнения полезны для упорядочивания слов в лексиграфическом порядке:
Это похоже на алфавитный порядок, который вы использовали бы в словаре, за исключением того, что все прописные буквы идут перед всеми строчными буквами. В результате:
Распространенный способ решить эту проблему — преобразовать строки в стандартный формат, например в нижний регистр, перед выполнением сравнения. Более сложная задача — заставить программу понять, что зебры — это не фрукты.
7.6. Строки неизменяемы¶
Заманчиво использовать оператор [] в левой части присваивания для изменения символа в строке. Например:
Вместо вывода Jello, world! этот код выдает ошибку времени выполнения TypeError: объект 'str' не поддерживает назначение элементов .
Строки неизменяемы, что означает, что вы не можете изменить существующую строку. Лучшее, что вы можете сделать, это создать новую строку, являющуюся вариацией исходной:
Решение здесь состоит в том, чтобы соединить новую первую букву с фрагментом greeting . Эта операция не влияет на исходную строку.
7.7. Оператор in¶
Оператор in проверяет, является ли одна строка подстрокой другой:
Обратите внимание, что строка является подстрокой самой себя:
Сочетая оператор in с конкатенацией строк с помощью +, мы можем написать функцию, которая удаляет все гласные из строки:
Протестируйте эту функцию, чтобы убедиться, что она делает то, что нам нужно.
7.8. Функция найти¶
Что делает следующая функция?
В некотором смысле find является противоположностью оператора []. Вместо того, чтобы брать индекс и извлекать соответствующий символ, он берет символ и находит индекс, в котором этот символ появляется. Если символ не найден, функция возвращает -1 .
Это первый пример использования оператора return внутри цикла. Если strng[index] == ch , функция немедленно завершает работу, преждевременно прерывая цикл.
Если символ не появляется в строке, программа нормально выходит из цикла и возвращает -1 .
Этот алгоритм вычислений иногда называют обходом эврики, потому что, как только мы находим то, что ищем, мы можем кричать Эврика! и перестань искать.
7.9. Зацикливание и подсчет¶
Следующая программа подсчитывает, сколько раз буква a появляется в строке, и является еще одним примером шаблона счетчика, представленного в разделе Подсчет цифр:
7.10. Необязательные параметры¶
Чтобы найти места второго или третьего появления символа в строке, мы можем изменить функцию find, добавив третий параметр для начальной позиции в строке поиска:
Вызов find2('banana', 'a', 2) теперь возвращает 3 , индекс первого появления 'a' в 'banana' после index 2. Что возвращает find2('banana', 'n', 3)? Если вы сказали 4, значит, вы понимаете, как работает find2.
Более того, мы можем объединить find и find2, используя необязательный параметр:
Вызов find('banana', 'a', 2) этой версии find ведет себя точно так же, как find2 , в то время как в для вызова find('banana', 'a') , start будет установлено значение по умолчанию 0 .
Добавление еще одного необязательного параметра к find приводит к поиску как вперед, так и назад:
Передача значения len(strng)-1 для начала и -1 для шага приведет к поиску в направлении начала строка вместо конца. Обратите внимание, что нам нужно было проверить нижнюю границу для index в цикле while, а также верхнюю границу, чтобы учесть это изменение.
7.11. Модуль string¶
Модуль string содержит полезные функции для работы со строками. Как обычно, нам нужно импортировать модуль, прежде чем мы сможем его использовать:
Чтобы посмотреть, что внутри, используйте функцию dir с именем модуля в качестве аргумента.
который вернет список элементов внутри строкового модуля:
['Шаблон', '_TemplateMetaclass', '__builtins__', '__doc__', '__file__', '__name__', '_float', '_idmap', '_idmapL', '_int', '_long' , '_multimap', '_re', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'atof', 'atof_error', 'atoi', 'atoi_error', 'atol', 'atol_error', 'capitalize', ' capwords», «center», «count», «digits», «expandtabs», «find», «hexdigits», «index», «index_error», «join», «joinfields», «letters», «ljust» , 'нижний', 'строчный регистр', 'lstrip', 'maketrans', 'octdigits', 'для печати', 'знак пунктуации', 'заменить', 'rfind', 'rindex', 'rjust', 'rsplit', ' rstrip', 'split', 'splitfields', 'strip', 'swapcase', 'translate', 'upper', 'uppercase', 'whitespace', 'zfill']
Чтобы узнать больше об элементе в этом списке, мы можем использовать команду type.Нам нужно указать имя модуля, за которым следует элемент, используя точечную нотацию.
Поскольку string.digits — это строка, мы можем напечатать ее, чтобы увидеть, что она содержит:
Неудивительно, что он содержит каждую десятичную цифру.
string.find — это функция, которая делает почти то же самое, что и функция, которую мы написали. Чтобы узнать о ней больше, мы можем распечатать строку документации, __doc__, которая содержит документацию по функции:
Параметры в квадратных скобках являются необязательными. Мы можем использовать string.find во многом так же, как и наш собственный find :
Этот пример демонстрирует одно из преимуществ модулей — они помогают избежать конфликтов между именами встроенных и пользовательских функций. Используя запись через точку, мы можем указать, какую версию find мы хотим.
На самом деле, string.find носит более общий характер, чем наша версия. он может находить подстроки, а не только символы:
Как и у нас, он принимает дополнительный аргумент, указывающий индекс, с которого он должен начинаться:
В отличие от нашего, его второй необязательный параметр указывает индекс, на котором должен заканчиваться поиск:
В этом примере поиск завершается ошибкой, поскольку буква b отсутствует в индексном диапазоне от 1 до 2 (не включая < тт>2 ).
7.12. Классификация персонажей¶
Часто полезно изучить символ и проверить, является ли он прописным или строчным, а также является ли он символом или цифрой. Модуль string предоставляет несколько констант, полезных для этих целей. Один из них, string.digits, мы уже видели.
Строка string.lowercase содержит все буквы, которые система считает строчными. Точно так же string.uppercase содержит все буквы верхнего регистра. Попробуйте следующее и посмотрите, что получится:
Мы можем использовать эти константы и find для классификации символов. Например, если find(lowercase, ch) возвращает значение, отличное от -1 , тогда ch должен быть строчным:
В качестве альтернативы мы можем воспользоваться оператором in:
В качестве еще одной альтернативы мы можем использовать оператор сравнения:
Если ch находится между a и z, это должна быть строчная буква.
Еще одна константа, определенная в модуле string, может удивить вас, когда вы ее распечатаете:
Пробелы перемещают курсор, ничего не печатая. Они создают пустое пространство между видимыми символами (по крайней мере, на белой бумаге). Константа string.whitespace содержит все пробельные символы, включая пробел, табуляцию ( \t ) и новую строку ( \n ). р>
7.13. Форматирование строк¶
Самый краткий и эффективный способ форматирования строки в Python — это использование оператора форматирования строки, %, вместе с операциями форматирования строки Python. Чтобы понять, как это работает, давайте начнем с нескольких примеров:
Синтаксис операции форматирования строки выглядит следующим образом:
Он начинается с формата, который содержит последовательность символов и спецификации преобразования. Спецификации преобразования начинаются с оператора %. За строкой формата следует один %, а затем последовательность значений, по одному для каждой спецификации преобразования, разделенных запятыми и заключенных в круглые скобки. Скобки необязательны, если имеется только одно значение.
В первом примере выше есть единственная спецификация преобразования, %s , которая указывает на строку. Единственное значение "Arthur" соответствует ему и не заключено в круглые скобки.
Во втором примере name имеет строковое значение, "Alice" , а age имеет целочисленное значение, 10 тт> . Они соответствуют двум спецификациям преобразования: %s и %d . d во второй спецификации преобразования указывает, что значение представляет собой десятичное целое число.
s , d и f — это все типы преобразования, которые нам понадобятся для этой книги. Полный список см. в разделе «Операции форматирования строк» Справочника по библиотеке Python.
Следующий пример иллюстрирует реальную пользу форматирования строк:
Эта программа выводит таблицу различных степеней чисел от 1 до 10. В своей текущей форме она использует символ табуляции ( \t ) для выравнивания столбцов значений, но это ломается, когда значения в таблице превышают ширину табуляции из 8 символов:
Одним из возможных решений может быть изменение ширины вкладки, но в первом столбце уже больше места, чем нужно. Лучшим решением будет установить ширину каждого столбца независимо. Как вы, возможно, уже догадались, форматирование строк обеспечивает решение:
Запуск этой версии приводит к следующему выводу:
Значок - после каждого % в спецификации преобразования указывает на выравнивание по левому краю. Числовые значения указывают минимальную длину, поэтому %-13d — это число, выровненное по левому краю, шириной не менее 13 символов.
7.14. Резюме и первые упражнения¶
В этой главе было представлено много новых идей. Следующее резюме и набор упражнений могут оказаться полезными для запоминания того, что вы узнали:
индексирование ( [] ) Доступ к одному символу в строке с использованием его позиции (начиная с 0). Пример: 'This'[2] оценивается как 'i' . Функция длины ( len ) Возвращает количество символов в строке. Пример: len('happy') оценивается как 5 . для обхода цикла ( for )
Обход строки означает доступ к каждому символу в строке по одному. Например, следующий цикл for:
оценивается как EE xx aa mm pp ll ee
срез ( [:] ) срез — это подстрока строки. Пример: 'bananas and cream'[3:6] оценивается как ana (так же, как и 'bananas and cream'[1:4] ). . сравнение строк ( >, >=, == ) Операторы сравнения работают со строками, оценивая их в соответствии с лексиграфическим порядком. Примеры: 'apple' 'banana' оценивается как True . 'Zeta' 'Appricot' оценивается как False . 'Zebra' 'aardvark' оценивается как True, поскольку все прописные буквы предшествуют строчным. оператор in ( in ) Оператор in проверяет, содержится ли один символ или строка внутри другой строки. Примеры: 'heck' в "Я тебя проверю." оценивается как True . 'cheese' в "Я проверю для вас." оценивается как False .
7.14.1. Первые упражнения¶
Запишите оценку интерпретатора Python для каждого из следующих выражений:
Напишите код Python, чтобы пройти каждый из следующих тестов документации:
7.15. Глоссарий¶
составной тип данных Тип данных, в котором значения состоят из компонентов или элементов, которые сами являются значениями. значение по умолчанию Значение, присвоенное необязательному параметру, если в вызове функции для него не указан аргумент. docstring Строковая константа в первой строке определения функции или модуля (а также, как мы увидим позже, в определениях классов и методов). Строки документации предоставляют удобный способ связать документацию с кодом. Строки документации также используются модулем doctest для автоматизированного тестирования. запись через точку Использование оператора точки . для доступа к функциям внутри модуля. immutable Составной тип данных, элементам которого не могут быть присвоены новые значения. index Переменная или значение, используемое для выбора члена упорядоченного набора, например символа из строки. необязательный параметр Параметр, записанный в заголовке функции с присвоением значения по умолчанию, которое он получит, если для него не задан соответствующий аргумент в вызове функции. срез Часть строки (подстроки), определяемая диапазоном индексов. В более общем смысле подпоследовательность любого типа последовательности в Python может быть создана с помощью оператора среза ( sequence[start:stop] ). traverse Перебирать элементы набора, выполняя аналогичную операцию над каждым. пробел Любой из символов, которые перемещают курсор без печати видимых символов. Константа string.whitespace содержит все пробельные символы.
7.16. Упражнения¶
чтобы Ouack и Quack были написаны правильно.
в функцию с именем count_letters и обобщить ее, чтобы она принимала строку и букву в качестве аргументов.
Теперь перепишите функцию count_letters так, чтобы вместо обхода строки она неоднократно вызывала find (версия из Необязательные параметры) с необязательный третий параметр для обнаружения новых вхождений подсчитываемой буквы.
Какая версия is_lower, по вашему мнению, будет самой быстрой? Можете ли вы назвать другие причины, помимо скорости, чтобы предпочесть ту или иную версию?
Создайте файл с именем stringtools.py и поместите в него следующее:
Добавьте тело функции в reverse, чтобы пройти doctests.
Добавить зеркало в stringtools.py .
Напишите для нее тело функции, которое заставит ее работать, как указано в doctests.
Включить remove_letter в stringtools.py .
Напишите для нее тело функции, которое заставит ее работать, как указано в doctests.
В килобайте 1024 байта, а в мегабайте 1024 килобайта, поэтому документ размером 1 КБ будет содержать 1024 байта данных или 1024 символа текста и другой программной информации, описывающей форматирование документа и другие характеристики, чтобы его можно было открыть. и используется программным приложением, таким как Adobe Acrobat или Microsoft Word.
Изображения представлены на экране в виде пикселей или цветных точек, но могут быть созданы в различных форматах, требующих для хранения файлов самых разных размеров. Для каждого изображения требуется разное количество байтов на пиксель, чтобы определить цвет и положение каждого пикселя на экране. Черно-белые изображения требуют меньше места, чем изображения в оттенках серого или цветные из-за количества байтов, необходимых для уникального описания каждого цвета. Изображения могут быть выражены во многих форматах, и некоторые большие форматы файлов, такие как изображения TIFF, являются "без потерь" - это означает, что каждый пиксель (точка цвета на вашем экране) получает свой собственный набор байтов для его описания. При равных цветах и других факторах изображение размером 100x100 пикселей (всего = 1000 пикселей) требует примерно в 10 раз больше места для хранения, чем изображение 10x10 пикселей (всего = 100 пикселей). Для сравнения, для представления одного символа текста, занимающего на экране пространство размером 10 x 10 пикселей, обычно требуется всего один байт.
Если вы поместите отсканированные изображения TIFF в файл PDF, вы обнаружите, что объем пространства, необходимый для нового файла PDF, превышает объем места, занимаемого только изображениями TIFF. Это связано с тем, что в файл PDF встроена информация, описывающая, как просматривать и интерпретировать изображения TIFF в средстве просмотра PDF, а также информация (метаданные) для описания самого файла.
Вы обнаружите, что полная страница электронного текста значительно меньше, чем отсканированное изображение TIFF того же текста, когда оно добавляется в файл PDF.
Разница в размере файла txt выше представляет собой то, что добавлено, чтобы сделать его файлом PDF.
PDF-файл, содержащий 8-битный файл TIFF 10x10 с буквой "a" (такой же размер на экране, как и исходный текст)
Читайте также: