Файл: Учебник по информатике. Программирование на Python. Основы 1 Программирование на Python. Основы.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 03.12.2023

Просмотров: 112

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Открытый учебник по информатике. Программирование на Python. Основы
31
'1234' < '12057'
Элемент левой последовательности
Элемент правой последовательности
Результат сравнения
Шаг 1
'1'
'1'
==
Шаг 2
'2'
'2'
==
Шаг 3
'3'
'0'
>
Первая пара отличающихся элементов последовательностей – символы '3' и '0'. Данные элементы противоречат проверяемому условию ('3' > '0'), следовательно, результат сравнения равен False.
Важно!
Последовательности сравнимы только в том случае, если между соответствующими элементами определены операции сравнения. Если же это не так, то интерпретатор вернет ошибку «TypeError: not supported
between instances of and » или «Ошибка типа: <операция> не поддерживается между <тип1> и <тип2>».
Это же замечание применимо для функции сортировки – sorted может отсортировать только такую последовательность, все элементы которой могут быть сравнимы между собой.
Пример.
>>>a = [1, 2, 3]
>>>b = [1, 2, '3']
>>>a > b
TypeError: '>' not supported between instances of 'int' and
'str'
Операция сравнения возвращается ошибку, так как элементы a[2] и b[2] имеют разные типы, операция «>» над которыми не определена.

Открытый учебник по информатике. Программирование на Python. Основы
32
Срезы
Срезом называется подпоследовательность последовательности от элемента
start до элемента finish с шагом step. Причем элемент с индексом start включается в срез, элемент с индексом finish – не включается. Результатом взятия среза является новый объект того же типа, что и последовательность из которой извлекается срез.
Значение шага step – целое число, не равное 0. seq[start:finish:step]
Каждый из параметров среза является необязательным.
• при неуказанном параметре start – значение считается 0 при положительном step и -1 при отрицательном;
• при неуказанном параметре finish – последовательность обрабатывается до конца при положительном step, и до начала при отрицательном;
• значение step по умолчанию равно 1.
Срез будет непустым, при:
• положительном шаге и положении индекса start левее индекса finish,
• отрицательном шаге и положении индекса start правее индекса finish.
Во всех остальных случаях срез будет пустым.
Примеры (помним, что элементы нумеруются с нуля).
'abcdefgh'[2:6:3] == 'cf' # 2 и 5 элементы 'abcdefgh'[5:1:-1] == 'fedc' # 5, 4, 3, 2 элементы 'abcdefgh'[-4:6] == 'ef' # 5, 6 или -4, -5
'abcdefgh'[::-1] == 'hgfedcba'# задом-наперед
Можно заметить, что при указании индексов в разном направлении нумерации в рамках одного среза срез берется от указанного слева ЭЛЕМЕНТА до указанного справа ЭЛЕМЕНТА и не продолжается в обратном направлении.
Например, срез '012345678'[-5:8:2] не будет перебирать значения индексов в диапазоне [-5; 8] с шагом 2 – [-5, -3, -1, 1, 3, 5, 7] . Вместо этого будет обработана последовательность между элементами '012345678'[-5] = '4' и '012345678'[8] = '7'. Соответственно, в срез попадут только выделенные символы '012345678' с шагом 2. В результате чего получим строку '46' (см.рис.2).


Открытый учебник по информатике. Программирование на Python. Основы
33
Рисунок 2. Срез при указании индексов разными способами индексирования
Кортежи
Самый простой тип последовательностей. С ним буквально нельзя делать ничего, кроме общих операций из таблицы выше.
Кортеж – последовательность объектов, которая определена единожды. То есть мы не можем переопределять уже добавленный в кортеж объект.
При сложении двух кортежей получается новый объект, содержащий элементы двух кортежей в добавленном порядке.
Операция += для кортежа работает аналогично записи tup = tup + add_tup
, так как функция расширения объекта не применима к объектам неизменяемого типа данных. Другими словами создается НОВЫЙ объект, ссылкой на который будет переопределенная переменная. Аналогично работает оператор
*=.
Кортежи очень полезны, когда нам нужно обработать массив данных при этом не изменив его.

Открытый учебник по информатике. Программирование на Python. Основы
34
Списки
Списки
– наиболее часто используемый тип для хранения последовательностей. Он весьма удобен, так как позволяет сохранить как отдельные значения, так и сложные объекты в качестве своих элементов.
Обычно списки используют для хранения однотипных данных. Такой подход позволяет писать быстрые и удобные алгоритмы для обработки хранимых значений.
Поддерживаемые операторы
Операторы изменения объекта lst += lst2 и lst *= N расширяют объект при этом не меняя ссылку на него.
Операторы проверки вхождения элемента в последовательность val in lst и val not in lst определяют входит или не входит элемент со значением
val в список lst.
Методы работы со списками
s.append(value)/s.extend(values)
Методы расширения списка.
- append добавляет ОДИН элемент value в конец списка s.
- extend присоединяет список values в конец списка s.
Для добавления одного элемента рекомендуется использовать append, для добавления нескольких – extend.
Примеры. s = [1, 2, 3] s.append(5) # [1, 2, 3, 5] s.extend([2,4,6]) # [1, 2, 3, 5, 2, 4, 6]
s.remove(value)
Удаляет первое вхождение значения value из списка.
Если в списке нет искомого значения, будет возвращена ошибка
«ValueError: list.remove(x): x not in list» или
«Ошибка значения: list.remove(x): x отсутствует в списке».
Примеры. s = [1, 2, 3] s.remove(2) # [1, 3] s.remove(10) # ValueError


Открытый учебник по информатике. Программирование на Python. Основы
35 s.copy()
Метод возвращающий копию объекта.
Пример. s = [1, 2, 6, 10] sc = s.copy() # [1, 2, 6, 10]
ВАЖНО: возвращается неглубокая копия, то есть копируются ссылки на объекты оригинального списка. Поэтому, если в качестве элемента оригинального списка было значение изменяемого типа, то вернется ссылка на этот же объект.
Пример.
# пример работы с изменением объекта s = [1, [1, 2], 3, 4] sc = s.copy() sc[1] += [2, 4] # меняем sc print(s) # [1, [1, 2, 2, 4], 3, 4] – s меняется тоже
Для создания полного дубликата (глубокое копирование) можно воспользоваться методом deepcopy() из библиотеки copy. s.sort(reverse=True/False)
Метод, сортирующий элементы в списке s. Также может производить сортировку в обратном порядке (при указании аргумента reverse=True).
С методами настраиваемых сортировок мы разберемся в одной из следующих глав.
ВАЖНО: изменяет список s в отличии от функции sorted для последовательностей.
Примеры. s = [1, 3, 2, 10, 6, 2] s.sort() # s = [1, 2, 2, 3, 6, 10] s.sort(reverse=True) # s = [10, 6, 3, 2, 2, 1]
s.reverse()
«Переворот» списка, расположение элементов в обратном порядке.
Результат аналогичен взятию среза s[::-1] за тем исключением, что при использовании s.reverse() объект останется прежним.
Пример. s = [1, 5, 2, 8] s.reverse() # [8, 2, 5, 1]

Открытый учебник по информатике. Программирование на Python. Основы
36 s.insert(index, value)
Вставка значения value на позицию index. Все элементы, которые имели позицию бóльшую или равную значению index, сдвигаются на 1 вправо
(индекс увеличивается на 1).
ВАЖНО: если указать значение index, выходящее за допустимый диапазон индексов для изменяемого списка, то в случае значения index, меньше допустимой левой границы, элемент будет добавлен в начало списка, в случае значения index больше длины последовательности – в конец.
Примеры. s = [1, 2, 3] s.insert(1, 10) # [1, 10, 2, 3] s.insert(0, 11) # [11, 1, 10, 2, 3] s.insert(-100, 8) # [8, 11, 1, 10, 2, 3] s.insert(20, 22) # [8, 11, 1, 10, 2, 3, 22]
s.pop(index)
Удаляет элемент с индексом index и возвращает его в качестве результата. В случае указания недопустимого индекса возвращается ошибка «IndexError:
pop index out of range» или «Ошибка индекса: указанный индекс удаляемого элемента выходит за допустимый диапазон».
Если не указывать значение index, будет удален последний элемент списка.
Примеры. s = [1, 2, 3, 4, 5] x = s.pop(3) # s = [1, 2, 3, 5], x = 4 s.pop(100) # IndexError s = [1, 2, 3, 4, 5] y = s.pop() # s = [1, 2, 3, 4], y = 5

Открытый учебник по информатике. Программирование на Python. Основы
37
Строки
Необходимо понимать, что строковый тип данных неизменяемый. Поэтому всегда, когда мы получаем строку отличную от обрабатываемой, создается новый объект.
Также нужно понимать, что отдельный символ также является строкой.
>>>s[i] == s[i:i+1]
True
Поддерживаемые операторы
Операторы изменения объекта s += sub и s *= N работают аналогично записям
s = s + sub и s = s * N соответственно, создавая новый объект и связывая старое имя переменной с созданным объектом.
Операторы проверки вхождения элемента в последовательность sub in s и
sub not in s определяют является/не является ли строка sub подстрокой
(частью) s.
Методы работы со строками
Строковый тип данных поддерживает достаточно большое количество методов. В контексте данного учебника мы не будем рассматривать их все, при желании с полной документацией можно ознакомиться в источнике [10]. Все указанные методы НЕ ИЗМЕНЯЮТ объект строки для которого вызваны. s.find(sub[, start[, end]]) s.index(sub[, start[, end]])
Возвращает число – индекс первого вхождения слева подстроки sub, начиная с индекса start и заканчивая индексом end. Аргументы start и end – необязательные.
Для поиска справа используются аналоги – rindex, rfind.
Разница index и find:
• если find не находит совпадение, результат равен -1,
• если index не находит совпадение – интерпретатор возвращает ошибку.
Примеры.
'adbefb'.find('bef') # 2
'adbefb'.index('bef') # 2
'adbefb'.index('cef') # Error
'adbefb'.find('aaa') # -1


Открытый учебник по информатике. Программирование на Python. Основы
38 s.isdecimal()
Возвращает логическое значение – True, если все символы являются десятичными цифрами, False в обратном случае. Стоит заметить, что это символы, которые входят в категорию «Number, Decimal Digits, Nd» таблицы
Unicode [11].
Примеры.
'12345'.isdecimal() # True
'123asd321'.isdecimal() # False s.
1   2   3   4   5   6   7   8

isnumeric()
Возвращает логическое значение – True, если все символы являются числовыми символами, False в обратном случае. Дополнительно к символам из категории «Number, Decimal Digits» принимает символы из категории
«Other Number, No» [12]
Примеры.
'12345'.isnumeric() # True
'123asd321'.isnumeric() # False s.isdigit()
Возвращает логическое значение – True, если все символы являются цифирными представлениями, False в обратном случае. Работает с подмножеством множества символов для s.isnumeric(), которые соответствуют цифрам от 0 до 9.
Примеры.
'12345'.isdigit() # True
'123asd321'.isdigit() # False
Для обработки символьных последовательностей, где не может быть десятичных цифр, кроме '0123456789', подойдет любой из методов. Однако, стоит понимать, что данные методы обрабатывают разные наборы символов. s.join(strings)
Возвращает строку – объединенные строки из последовательности strings через разделитель s.
ВАЖНО: в качестве аргумента метода могут быть только последовательности из строк, либо одна строка (которая будет интерпретирована как последовательность строк единичной длины).
Примеры.
'0'.join(('1', '223', 'abc')) # '102230abc'
'_'.join('hello') # 'h_e_l_l_o'

Открытый учебник по информатике. Программирование на Python. Основы
39 s.replace(old, new[, count])
Возвращает строку – копию строки s, в которой заменяет подстроки old на строки new count раз. Исходная строка при этом не меняется. Замены происходят слева направо.
Если count не указан, заменяются все вхождения old на new.
Метод replace работает с непересекающимися подстроками, выбирая первое левое вхождение new в old перед заменой. Также можно сказать, что метод работает не рекурсивно.
Примеры:
'pppp'.replace('pp', 'p p') # 'p pp p'
'123321'.replace('1', '202', 1) # '20223321'
'Hello'.replace('sh', 'pr') # 'Hello' s.split(sep=None, maxsplit=-1)
Возвращает список из подстрок, полученный путем разделения строки s по разделителю sep. По умолчанию делит строку по пробельным символам.
Если split встречает два разделителя sep подряд, то возвращает пустое слово, которое соответствует положению этих разделителей.
При указании параметра maxsplit разделяет по первым maxsplit разделителям.
После разделения строки по указанному разделителю sep можно восстановить строку с помощью записи sep.join(s.split(sep)). Данный метод восстановления строки не работает при работе с неуказанным разделителем, то есть запись sep.join(s.split()) не восстановит начальное значение строки s.
Для разделения строки справа, используется аналог rsplit.
ВАЖНО: метод s.split() без указания разделителя делит строку по пробельным группам, то есть в качестве разделителя используется группа пробельных символов (например, группа пробелов или переносы строк). В таком случае не получаются пустые строки, как, например, в случае с указанием в качестве разделителя одиночного пробела.
Примеры.
'123123'.split('2', maxsplit=1) # ['1', '3123']
'abcdabcd'.split('dab') # ['abc', 'cd']
'два пробела'.split() # ['два', 'пробела']
'два пробела'.split(' ') # ['два', '', 'пробела']
'пр дл rs'.rsplit(' ', maxsplit=1) # ['пр дл', 'rs']