Самоучитель PythonВыпуск 2Дмитрий Мусинмая 07, 2017
Скачать 0.74 Mb.
|
S.format(*args, **kwargs) Форматирование строки 12.3. Таблица “Функции и методы строк” 44 Глава 13 Форматирование строк. Метод format Иногда (а точнее, довольно часто) возникают ситуации, когда нужно сделать строку, под- ставив в неё некоторые данные, полученные в процессе выполнения программы (поль- зовательский ввод, данные из файлов и т. д.). Подстановку данных можно сделать с по- мощью форматирования строк. Форматирование можно сделать с помощью оператора %, либо с помощью метода format. Форматирование строк с помощью метода format Если для подстановки требуется только один аргумент, то значение - сам аргумент: >>> 'Hello, {} !' format( 'Vasya' ) 'Hello, Vasya!' А если несколько, то значениями будут являться все аргументы со строками подстановки (обычных или именованных): >>> ' {0} , {1} , {2} ' format( 'a' , 'b' , 'c' ) 'a, b, c' >>> ' {} , {} , {} ' format( 'a' , 'b' , 'c' ) 'a, b, c' >>> ' {2} , {1} , {0} ' format( 'a' , 'b' , 'c' ) 'c, b, a' >>> ' {2} , {1} , {0} ' format( * 'abc' ) 'c, b, a' >>> ' {0} {1} {0} ' format( 'abra' , 'cad' ) 'abracadabra' >>> 'Coordinates: {latitude} , {longitude} ' format(latitude = '37.24N' , longitude = '- ˓→ 115.81W' ) 45 Самоучитель Python, Выпуск 0.2 'Coordinates: 37.24N, -115.81W' >>> coord = { 'latitude' : '37.24N' , 'longitude' : '-115.81W' } >>> 'Coordinates: {latitude} , {longitude} ' format( ** coord) 'Coordinates: 37.24N, -115.81W' Однако метод format умеет большее. Вот его синтаксис: поле замены :: = "{" [имя поля] [ "!" преобразование] [ ":" спецификация] "}" имя поля :: = arg_name ( "." имя атрибута | "[" индекс "]" ) * преобразование :: = "r" (внутреннее представление) | "s" (человеческое ˓→ представление) спецификация :: = см ниже Например: >>> "Units destroyed: {players[0]} " format(players = [ 1 , 2 , 3 ]) 'Units destroyed: 1' >>> "Units destroyed: {players[0]!r} " format(players = [ '1' , '2' , '3' ]) "Units destroyed: '1'" Теперь спецификация формата: спецификация :: = [[fill]align][sign][ #][0][width][,][.precision][type] заполнитель :: = символ кроме '{' или '}' выравнивание :: = "<" | ">" | "=" | "^" знак :: = "+" | "-" | " " ширина :: = integer точность :: = integer тип :: = "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%" Выравнивание производится при помощи символа-заполнителя. Доступны следующие варианты выравнивания: Флаг Значение ‘<’ Символы-заполнители будут справа (выравнивание объекта по левому краю) (по умолчанию). ‘>’ выравнивание объекта по правому краю. ‘=’ Заполнитель будет после знака, но перед цифрами. Работает только с числовыми типами. ‘^’ Выравнивание по центру. Опция “знак” используется только для чисел и может принимать следующие значения: Флаг Значение ‘+’ Знак должен быть использован для всех чисел. ‘-‘ ‘-‘ для отрицательных, ничего для положительных. ‘Пробел’ ‘-‘ для отрицательных, пробел для положительных. Поле “тип” может принимать следующие значения: 13.1. Форматирование строк с помощью метода format 46 Самоучитель Python, Выпуск 0.2 Тип Значение ‘d’, ‘i’, ‘u’ Десятичное число. ‘o’ Число в восьмеричной системе счисления. ‘x’ Число в шестнадцатеричной системе счисления (буквы в нижнем регистре). ‘X’ Число в шестнадцатеричной системе счисления (буквы в верхнем регистре). ‘e’ Число с плавающей точкой с экспонентой (экспонента в нижнем регистре). ‘E’ Число с плавающей точкой с экспонентой (экспонента в верхнем регистре). ‘f ’, ‘F’ Число с плавающей точкой (обычный формат). ‘g’ Число с плавающей точкой. с экспонентой (экспонента в нижнем регистре), если она меньше, чем -4 или точности, иначе обычный формат. ‘G’ Число с плавающей точкой. с экспонентой (экспонента в верхнем регистре), если она меньше, чем -4 или точности, иначе обычный формат. ‘c’ Символ (строка из одного символа или число - код символа). ‘s’ Строка. ‘%’ Число умножается на 100, отображается число с плавающей точкой, а за ним знак %. И напоследок, несколько примеров: >>> coord = ( 3 , 5 ) >>> 'X: {0[0]} ; Y: {0[1]} ' format(coord) 'X: 3; Y: 5' >>> "repr() shows quotes: {!r} ; str() doesn't: {!s} " format( 'test1' , 'test2' ) "repr() shows quotes: 'test1'; str() doesn't: test2" >>> ' {:<30} ' format( 'left aligned' ) 'left aligned ' >>> ' {:>30} ' format( 'right aligned' ) ' right aligned' >>> ' {:^30} ' format( 'centered' ) ' centered ' >>> ' {:*^30} ' format( 'centered' ) # use '*' as a fill char '***********centered***********' >>> ' {:+f} ; {:+f} ' format( 3.14 , - 3.14 ) # show it always '+3.140000; -3.140000' >>> ' {: f} ; {: f} ' format( 3.14 , - 3.14 ) # show a space for positive numbers ' 3.140000; -3.140000' >>> ' {:-f} ; {:-f} ' format( 3.14 , - 3.14 ) # show only the minus -- same as '{:f}; ˓→ {:f}' '3.140000; -3.140000' >>> # format also supports binary numbers >>> "int: {0:d} ; hex: {0:x} ; oct: {0:o} ; bin: {0:b} " format( 42 ) 'int: 42; hex: 2a; oct: 52; bin: 101010' >>> # with 0x, 0o, or 0b as prefix: >>> "int: {0:d} ; hex: {0:#x} ; oct: {0:#o} ; bin: {0:#b} " format( 42 ) 'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010' >>> points = 19.5 >>> total = 22 >>> 'Correct answers: {:.2%} ' format(points / total) 'Correct answers: 88.64%' 13.1. Форматирование строк с помощью метода format 47 Глава 14 Списки (list). Функции и методы списков Сегодня я расскажу о таком типе данных, как списки, операциях над ними и методах, о генераторах списков и о применении списков. Что такое списки? Списки в Python - упорядоченные изменяемые коллекции объектов произвольных типов (почти как массив, но типы могут отличаться). Чтобы использовать списки, их нужно создать. Создать список можно несколькими спо- собами. Например, можно обработать любой итерируемый объект (например, строку ) встроенной функцией list: >>> list ( 'список' ) ['с', 'п', 'и', 'с', 'о', 'к'] Список можно создать и при помощи литерала: >>> s = [] # Пустой список >>> l = [ 's' , 'p' , [ 'isok' ], 2 ] >>> s [] >>> l ['s', 'p', ['isok'], 2] Как видно из примера, список может содержать любое количество любых объектов (в том числе и вложенные списки), или не содержать ничего. И еще один способ создать список - это генераторы списков. Генератор списков - способ 48 Самоучитель Python, Выпуск 0.2 построить новый список, применяя выражение к каждому элементу последовательно- сти. Генераторы списков очень похожи на цикл for >>> c = [c * 3 for c in 'list' ] >>> c ['lll', 'iii', 'sss', 'ttt'] Возможна и более сложная конструкция генератора списков: >>> c = [c * 3 for c in 'list' if c != 'i' ] >>> c ['lll', 'sss', 'ttt'] >>> c = [c + d for c in 'list' if c != 'i' for d in 'spam' if d != 'a' ] >>> c ['ls', 'lp', 'lm', 'ss', 'sp', 'sm', 'ts', 'tp', 'tm'] Но в сложных случаях лучше пользоваться обычным циклом for для генерации списков. Функции и методы списков Создать создали, теперь нужно со списком что-то делать. Для списков доступны основные встроенные функции , а также методы списков. Таблица “методы списков” Метод Что делает list.append(x) Добавляет элемент в конец списка list.extend(L) Расширяет список list, добавляя в конец все элементы списка L list.insert(i, x) Вставляет на i-ый элемент значение x list.remove(x) Удаляет первый элемент в списке, имеющий значение x. ValueError, если такого элемента не существует list.pop([i]) Удаляет i-ый элемент и возвращает его. Если индекс не указан, удаляется последний элемент list.index(x, [start [, end]]) Возвращает положение первого элемента со значением x (при этом поиск ведется от start до end) list.count(x) Возвращает количество элементов со значением x list.sort([key=функция]) Сортирует список на основе функции list.reverse() Разворачивает список list.copy() Поверхностная копия списка list.clear() Очищает список Нужно отметить, что методы списков, в отличие от строковых методов , изменяют сам список, а потому результат выполнения не нужно записывать в эту переменную. >>> l = [ 1 , 2 , 3 , 5 , 7 ] >>> l sort() 14.2. Функции и методы списков 49 Самоучитель Python, Выпуск 0.2 >>> l [1, 2, 3, 5, 7] >>> l = l sort() >>> (l) None И, напоследок, примеры работы со списками: >>> a = [ 66.25 , 333 , 333 , 1 , 1234.5 ] >>> (a count( 333 ), a count( 66.25 ), a count( 'x' )) 2 1 0 >>> a insert( 2 , - 1 ) >>> a append( 333 ) >>> a [66.25, 333, -1, 333, 1, 1234.5, 333] >>> a index( 333 ) 1 >>> a remove( 333 ) >>> a [66.25, -1, 333, 1, 1234.5, 333] >>> a reverse() >>> a [333, 1234.5, 1, 333, -1, 66.25] >>> a sort() >>> a [-1, 1, 66.25, 333, 333, 1234.5] Изредка, для увеличения производительности, списки заменяют гораздо менее гибкими массивами (хотя в таких случаях обычно используют сторонние библиотеки, например NumPy ). 14.3. Таблица “методы списков” 50 Глава 15 Индексы и срезы Сегодня мы поговорим об операциях взятия индекса и среза. Взятие элемента по индексу Как и в других языках программирования, взятие по индексу: >>> a = [ 1 , 3 , 8 , 7 ] >>> a[ 0 ] 1 >>> a[ 3 ] 7 >>> a[ 4 ] Traceback (most recent call last): File " , line 1 , in IndexError : list index out of range Как и во многих других языках, нумерация элементов начинается с нуля. При попытке доступа к несуществующему индексу возникает исключение IndexError. В данном примере переменная a являлась списком , однако взять элемент по индексу можно и у других типов: строк, кортежей. В Python также поддерживаются отрицательные индексы, при этом нумерация идёт с конца, например: >>> a = [ 1 , 3 , 8 , 7 ] >>> a[ - 1 ] 7 >>> a[ - 4 ] 51 Самоучитель Python, Выпуск 0.2 1 >>> a[ - 5 ] Traceback (most recent call last): File " , line 1 , in IndexError : list index out of range Срезы В Python, кроме индексов, существуют ещё и срезы. item[START:STOP:STEP] - берёт срез от номера START, до STOP (не включая его), с шагом STEP. По умолчанию START = 0, STOP = длине объекта, STEP = 1. Соответственно, какие-нибудь (а возможно, и все) параметры могут быть опущены. >>> a = [ 1 , 3 , 8 , 7 ] >>> a[:] [1, 3, 8, 7] >>> a[ 1 :] [3, 8, 7] >>> a[: 3 ] [1, 3, 8] >>> a[:: 2 ] [1, 8] Также все эти параметры могут быть и отрицательными: >>> a = [ 1 , 3 , 8 , 7 ] >>> a[:: - 1 ] [7, 8, 3, 1] >>> a[: - 2 ] [1, 3] >>> a[ - 2 :: - 1 ] [8, 3, 1] >>> a[ 1 : 4 : - 1 ] [] В последнем примере получился пустой список, так как START < STOP, а STEP отрицатель- ный. То же самое произойдёт, если диапазон значений окажется за пределами объекта: >>> a = [ 1 , 3 , 8 , 7 ] >>> a[ 10 : 20 ] [] Также с помощью срезов можно не только извлекать элементы, но и добавлять и удалять элементы (разумеется, только для изменяемых последовательностей). >>> a = [ 1 , 3 , 8 , 7 ] >>> a[ 1 : 3 ] = [ 0 , 0 , 0 ] >>> a 15.2. Срезы 52 Самоучитель Python, Выпуск 0.2 [1, 0, 0, 0, 7] >>> del a[: - 3 ] >>> a [0, 0, 7] 15.2. Срезы 53 Глава 16 Кортежи (tuple) Сегодня я расскажу о таком типе данных, как кортежи (tuple) и о том, где они применя- ются. Кортеж, по сути - неизменяемый список Зачем нужны кортежи, если есть списки? • Защита от дурака. То есть кортеж защищен от изменений, как намеренных (что пло- хо), так и случайных (что хорошо). • Меньший размер. Дабы не быть голословным: >>> a = ( 1 , 2 , 3 , 4 , 5 , 6 ) >>> b = [ 1 , 2 , 3 , 4 , 5 , 6 ] >>> a __sizeof__() 36 >>> b __sizeof__() 44 • Возможность использовать кортежи в качестве ключей словаря : >>> d = {(1, 1, 1) : 1} >>> d {(1, 1, 1): 1} >>> d = {[1, 1, 1] : 1} Traceback (most recent call last): File "", line 1, in d = {[1, 1, 1] : 1} TypeError: unhashable type: 'list' 54 Самоучитель Python, Выпуск 0.2 Как работать с кортежами? С преимуществами кортежей разобрались, теперь встает вопрос - а как с ними работать. Примерно так же, как и со списками. Создаем пустой кортеж: >>> a = tuple () # С помощью встроенной функции tuple() >>> a () >>> a = () # С помощью литерала кортежа >>> a () >>> Создаем кортеж из одного элемента: >>> a = ( 's' ) >>> a 's' Стоп. Получилась строка. Но как же так? Мы же кортеж хотели! Как же нам кортеж полу- чить? >>> a = ( 's' , ) >>> a ('s',) Ура! Заработало! Все дело - в запятой. Сами по себе скобки ничего не значат, точнее, зна- чат то, что внутри них находится одна инструкция, которая может быть отделена пробе- лами, переносом строк и прочим мусором. Кстати, кортеж можно создать и так: >>> a = 's' , >>> a ('s',) Но все же не увлекайтесь, и ставьте скобки, тем более, что бывают случаи, когда скобки необходимы. Ну и создать кортеж из итерируемого объекта можно с помощью все той же пресловутой функции tuple() >>> a = tuple ( 'hello, world!' ) >>> a ('h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!') 16.2. Как работать с кортежами? 55 Самоучитель Python, Выпуск 0.2 Операции с кортежами Все операции над списками , не изменяющие список (сложение, умножение на число, ме- тоды index() и count() и некоторые другие операции). Можно также по-разному менять элементы местами и так далее. Например, гордость программистов на python - поменять местами значения двух пере- менных: a, b = b, a 16.3. Операции с кортежами 56 Глава 17 Словари (dict) и работа с ними. Методы словарей Сегодня я расскажу о таком типе данных, как словари, о работе со словарями, операциях над ними, методах, о генераторах словарей. Словари в Python - неупорядоченные коллекции произвольных объектов с доступом по ключу. Их иногда ещё называют ассоциативными массивами или хеш-таблицами. Чтобы работать со словарём, его нужно создать. Создать его можно несколькими спосо- бами. Во-первых, с помощью литерала: >>> d = {} >>> d {} >>> d = { 'dict' : 1 , 'dictionary' : 2 } >>> d {'dict': 1, 'dictionary': 2} Во-вторых, с помощью функции dict: >>> d = dict (short = 'dict' , long = 'dictionary' ) >>> d {'short': 'dict', 'long': 'dictionary'} >>> d = dict ([( 1 , 1 ), ( 2 , 4 )]) >>> d {1: 1, 2: 4} В-третьих, с помощью метода fromkeys: >>> d = dict fromkeys([ 'a' , 'b' ]) >>> d {'a': None, 'b': None} >>> d = dict fromkeys([ 'a' , 'b' ], 100 ) 57 Самоучитель Python, Выпуск 0.2 >>> d {'a': 100, 'b': 100} В-четвертых, с помощью генераторов словарей, которые очень похожи на генераторы списков >>> d = {a: a ** 2 for a in range ( 7 )} >>> d {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36} Теперь попробуем добавить записей в словарь и извлечь значения ключей: >>> d = { 1 : 2 , 2 : 4 , 3 : 9 } >>> d[ 1 ] 2 >>> d[ 4 ] = 4 ** 2 >>> d {1: 2, 2: 4, 3: 9, 4: 16} >>> d[ '1' ] Traceback (most recent call last): File "", line 1, in d['1'] KeyError : '1' Как видно из примера, присвоение по новому ключу расширяет словарь, присвоение по существующему ключу перезаписывает его, а попытка извлечения несуществующе- го ключа порождает исключение. Для избежания исключения есть специальный метод (см. ниже), или можно перехватывать исключение Что же можно еще делать со словарями? Да то же самое, что и с другими объектами: встроенные функции , ключевые слова (например, циклы for и while ), а также специаль- ные методы словарей. |