Лутц М. - Изучаем Python (1077325), страница 25
Текст из файла (страница 25)
Не ждите в этой главе исчерпывающих объяснений, поскольку основная ее цель состоит в том, чтобы разжечь ваш аппетит и представить некоторые базовые идеи. Однако лучший способ что-то начать — это просто начать, поэтому перейдем сразу к программному коду. Глава 4. Введение з типы обьектоз паыка Ру(5оп 116 Формально первая форма называется герг (объект в виде кода), а вторая, более дружественная к пользователю, — зтг.
Различия между ними станут более понятны, когда мы приступим к изучению классов, а пока, если что-то выглядит непонятным, попробуйте вывести тот же результат с помощью инструкции ргшт. Помимо выражений для выполнения операций с числами в составе Ру- 1)топ есть несколько полезных модулей: »> 1арогт вата »> вата.Р1 3 1415926535897931 »> вата.аагт(85) 9.2195444572928871 Модуль вать содержит более сложные математические функции, а модуль галсов реализует генератор случайных чисел и функцию случайного выбора (в данном случае из списка, о котором будет рассказываться ниже, в этой же главе): »> 1арогт гапзов »> галсов.
гапзоа( ) 0.59268735266273953 »> галсов.оао1оа((1, 2, 3, 4)) 1 Кроме того, Ру(Поп включает в себя более экзотические числовые объекты, такие как комплексные числа, числа с фиксированной десятичной точкой и множества, а среди свободно распространяемых расширений можно найти и другие числовые типы (например, матрицы и векторы). Обсуждение этих типов будет приводиться далее в этой книге. Пока что мы использовали Ру()гоп как простой калькулятор, но чтобы иметь большую возможность судить о встроенных типах, перейдем к строкам. Строки Строки используются для записи текстовой информации, а также произвольных последовательностей байтов. Это наш первый пример последовательностей, или упорядоченных коллекций других объектов по их позиции.
в языке Ру1йоп. Последовательности поддерживают порядок размещения элементов, которые они содержат, слева направо: элементы сохраняются и извлекаются, исходя из их позиции в последовательности. Строго говоря, строки являются последовательностями односимвольных строк. Другими типами последовательностей являются списки и кортежи (будут описаны ниже). Операции над последовательностями Будучи последовательностями, строки поддерживают операции, предполагающие определенный порядок позиционирования элементов.
Строки Например, если имеется четырехсимвольная строка, то с помощью встроенной функции ]еп можно проверить ее длину, а отдельные эле- менты строки извлечь с помощью выражений индексирования: № Второй элеиент слева В языке Ру(]топ индексы реализованы в виде смещений от начала, и потому индексация начинается с О: первый элемент имеет индекс О, второй — 1 и т.
д. В языке Ру(]топ предусмотрена возможность индекса- ции в обратном порядке, от конца: >» 8[-1] »> 8[-2] 'а' № Последний элемент в конце В № Второй элеиент с конца Формально отрицательные индексы просто складываются с длиной строки, поэтому следующие две операции эквивалентны [хотя первая проще записывается и более понятна, чем вторая): № Последний элеиент в 8 »> 8[-1] »> 8[1еп(3)-1) И Примечательно, что внутри квадратных скобок допускается использовать не только жестко заданные числовые литералы, но и любые другие выражения — везде, где Руь]топ ожидает получить значение, можно использовать литералы, переменные или любые выражения.
Весь синтаксис языка Ру$]топ следует этому общему принципу. В дополнение к простой возможности индексирования по номеру позиции последовательности поддерживают более общую форму индексирования, известную как получение среза [в[(с]пЯ, которая обеспечивает возможность извлечения за одну операцию целого раздела [среза). >» 3 'Зраи' »> 3[1:3] 'ра' Проще всего можно представить себе срез как способ извлечения целого столбца из строки за один шаг. В общем виде синтаксис операции получения среза выглядит как Х[1: О] и означает: яизвлечь из Х все, считая со смещения 1 и до смещения б, но не включая его ь. В качестве результата возвращается новый объект. Например, последняя операция из примера выше вернет все символы строки Я со смещениями с 1 по 2 »> 8 = 'Зраа' »> 1еп(8) 4 >» 3[01 '8' »> 3[1] р № длина № Первий элеиент в 5, счет начинается с позиции О № Отрицательная индексация, более слоиний способ № Строка из 4 сииволов № Срез строки 5 на~иная со сиеаения т и до 2 (не 3) (то есть 3-1 штук) в виде новой строки.
В результате получается срез, или выборка двух символов из середины. При выполнении операции получения среза левая граница по умолча- нию принимается равной нулю, а правая — длине последовательности, к которой применяется операция. В результате мы получаем следую- щие наиболее распространенные варианты использования: Обратите внимание, что в качестве границ срезов можно использовать отрицательные индексы и что последняя операция фактически создает копию всей строки.
Как мы узнаем позднее, нет смысла копировать строки таким способом, но такая форма копирования очень удобна при работе с другими последовательностями, такими как списки. Наконец, будучи последовательностями, строки поддерживают операцию конкатенации, которая записывается в виде знака плюс (объединение двух строк в одну строку), и операцию повторения (новая строка создается за счет многократного повторения другой строки): »> 8 'Брав' »> 8 + 'хуа' Ф Конкатенация 'Браихуз' »> Б Л Б остается без изменений 'Брам' »> 8 ° 8 Л Повторение 'БраиБраазрааБращзращзраазращБраа' Обратите внимание, что знак плюс (+) имеет различное значение для разных объектов: для чисел — сложение, а для строк — конкатенация.
Это универсальное свойство языка РуФ)топ, которое далее в книге будет названо полиморфизмом, означает, что фактически выполняемая операция зависит от объектов, которые принимают в ней участие. Как будет показано, когда мы приступим к изучению динамической типизации, такой полиморфизм в значительной степени обеспечивает выразительность и гибкость программного кода на языке РуФЬоп. Поскольку отсутствуют ограничения, связанные с типами, операции в языке РуФ)топ обычно в состоянии автоматически обрабатывать объекты самых разных типов, при условии, что они поддерживают совместимый »> 8[1: ) 'ращ' »> Б 'Брав' »> 8(0:3) 'Бра' »> 8(:3) 'Бра' »> 8(:-1) Бра' »> 8(',) 'Брав' Глава 4.
Введение а типы объектов языка Ру1)>оп Л Все, кроне первого элеиентв (1:!еп($)) з Сама строка Б беэ изменений Л Все, кроне посяеднего элеиента в то же, что и Б(О:Э) л еще рвз все, кроме последнего элемента, но проще (О: — 1) Л Все содержимое Э, квк обычная копия (О.)еп(Б)) 119 Строки интерфейс (как в данном случае операция +). В языке Рус)соп идея полиморфизма является ключевой концепцией, которую мы будем рассматривать далее в этой книге. Неизменяемость Обратите внимание: в предыдущих примерах ни одна из использованных операций не изменяла оригинальную строку. Все операции над строками в результате создают новую строку, потому что строки в языке Ру()соп являются неизменяемыми — после того, как строка будет создана, ее нельзя изменить.
Например, вы не сможете изменить строку присвоением значения одной из ее позиций, но вы всегда можете создать новую строку и присвоить ей то же самое имя. Поскольку Ру$Ьоп очищает память, занятую не нужными больше объектами (как будет показано позднее), такой подход не так уж неэффективен, как могло бы показаться на первый взгляд: »> 8 '8ращ' »> 8[0) = 'а' № Неизиеняеиие обьекти неяьзя изиенить ..текст сообщения об ошибке опущен... турееггог, асг' оь1есс ооеа пос арррогс тсещ ааасрпщепс »>8= пи+8[1:) № Но с поиощью виракений ии иокеи № созоавать новие обьекти »> 8 'тращ' Все объекты в языке РуС)соп либо относятся к классу неизменяемых, либо нет. Если говорить о базовых типах, то числа, строки и кортежи являются неизменяемыми, а списки и словари — нет (они легко могут изменяться в любой своей части). Помимо всего, неизменяемость может рассматриваться как гарантия, что некоторый объект будет оставаться постоянным на протяжении работы программы.