Скачать презентацию Программирование на Python е Введение в информатику Глава 11 Скачать презентацию Программирование на Python е Введение в информатику Глава 11

Глава 11 Сбор данных.ppt

  • Количество слайдов: 79

Программирование на Python’е: Введение в информатику Глава 11 Сбор данных Python Programming, 2/e 1 Программирование на Python’е: Введение в информатику Глава 11 Сбор данных Python Programming, 2/e 1

Задачи n n n Понять использование списков (массивов) для представления наборов однородных данных. Ознакомиться Задачи n n n Понять использование списков (массивов) для представления наборов однородных данных. Ознакомиться с функциями и методами, имеющимися в Python’е для обработки списков. Уметь писать программы, которые используют списки для обработки наборов данных. Python Programming, 2/e 2

Задачи n n Уметь писать программы, которые используют списки и классы для структурирования сложных Задачи n n Уметь писать программы, которые используют списки и классы для структурирования сложных данных. Понимать использование словарей в Python’е для хранения неупорядоченных наборов данных. Python Programming, 2/e 3

Примеры задач: элементарная статистика n Многие программы обрабатывают большие наборы похожих данных. n n Примеры задач: элементарная статистика n Многие программы обрабатывают большие наборы похожих данных. n n n Слова в документах Студенты на учебных курсах Данные эксперимента Клиенты фирмы Графические объекты на экране Карты в колоде Python Programming, 2/e 4

Примеры задач: элементарная статистика Давайте еще раз рассмотрим программу, написанную в главе 8: # Примеры задач: элементарная статистика Давайте еще раз рассмотрим программу, написанную в главе 8: # average 4. py # Программа усредняет множество чисел. Иллюстрирует цикл c # ограничителем, используя в качестве ограничителя пустую цепочку def main(): sum = 0. 0 count = 0 x. Str = input("Введите число ( чтобы выйти) >> ") while x. Str != "": x = eval(x. Str) sum = sum + x count = count + 1 x. Str = input ("Введите число ( чтобы выйти) >> ") print("n. Среднее чисел равно", sum / count) main() Python Programming, 2/e 5

Примеры задач: элементарная статистика n n Эта программа позволяет пользователю ввести последовательность чисел, но Примеры задач: элементарная статистика n n Эта программа позволяет пользователю ввести последовательность чисел, но программа не сохраняет числа, которые были введены – она хранит только текущую сумму. Допустим, что мы хотим расширить программу, чтобы она считала не только среднее, но и медиану со стандартным отклонением. Python Programming, 2/e 6

Примеры задач: элементарная статистика n n n Медиана это значение данных, которое разбивает данные Примеры задач: элементарная статистика n n n Медиана это значение данных, которое разбивает данные на две равновеликие части. Для данных 2, 4, 6, 9, 13, медиана равна 6, так как имеется 2 значения больше и два значения меньше 6. Один из способов найти медиану: собрать все данные, упорядочить их и найти среднее значение. Python Programming, 2/e 7

Примеры задач: элементарная статистика n n n Стандартное отклонение это мера того, насколько сильно Примеры задач: элементарная статистика n n n Стандартное отклонение это мера того, насколько сильно разбросаны данные относительно среднего. Если данные плотно сгруппированы вокруг среднего, то отклонение малое. Если данные рассредоточены дальше от среднего, то отклонение больше. Стандартное отклонение это показатель измеряющий/выражающий особость данных. Python Programming, 2/e 8

Примеры задач: элементарная статистика n n n Стандартное отклонение равно Где обозначает среднее , Примеры задач: элементарная статистика n n n Стандартное отклонение равно Где обозначает среднее , представляет i-ое значение данных и n число значений данных. Выражение равно квадрату «отклонения» отдельного значения от среднего. Python Programming, 2/e 9

Примеры задач: элементарная статистика n n Числитель равен сумме квадратов отклонений по всем значениям Примеры задач: элементарная статистика n n Числитель равен сумме квадратов отклонений по всем значениям данных. Допустим, наши данные: 2, 4, 6, 9, and 13. n n Среднее равно 6. 8 Числитель стандартного отклонения и стандартное отклонение равны Python Programming, 2/e 10

Примеры задач: элементарная статистика n n Как видно, вычисление стандартного отклонения требует не только Примеры задач: элементарная статистика n n Как видно, вычисление стандартного отклонения требует не только знания среднего (которое нельзя вычислить пока не введены все данные), но и знания каждого индивидуального значения. Нам нужен способ запоминать значения, когда их вводят. Python Programming, 2/e 11

Применение списков n n n Нам нужен способ хранить и обрабатывать целые наборы чисел. Применение списков n n n Нам нужен способ хранить и обрабатывать целые наборы чисел. Мы не можем просто взять множество переменных, потому что не знаем заранее сколько будет чисел. Что нам нужно? Некоторый способ собрать целый набор значений в одном объекте. Python Programming, 2/e 12

Списки и массивы n n n Списки в Python’е это упорядоченные последовательности предметов. Например, Списки и массивы n n n Списки в Python’е это упорядоченные последовательности предметов. Например, последовательность n чисел можно назвать S: S = s 0, s 1, s 2, s 3, …, sn-1 Индивидуальные значения последовательности можно снабдить ссылками с помощью значения нижнего указателя. Используя числа как индексы, математики могут кратко описывать вычисления со значениями последовательности используя переменные-индексы, например, Python Programming, 2/e 13

Списки и массивы n Допустим, что последовательность хранится в переменной s. Мы можем написать Списки и массивы n Допустим, что последовательность хранится в переменной s. Мы можем написать цикл, вычисляющий сумму элементов последовательности: sum = 0 for i in range(n): sum = sum + s[i] n Почти все языки программирования содержат структуры-последовательности, подобные s, иногда называемые массивами. Python Programming, 2/e 14

Списки и массивы n n n Список или массив это последовательность предметов, причем вся Списки и массивы n n n Список или массив это последовательность предметов, причем вся последовательность адресуется одним именем (например, s), а отдельные предметы выделяются с помощью индекса (например, s[i]). В других языках программирования размер массива обычно фиксирован, то есть когда вы создаёте массив, вы должны указать его максимальный размер. Массивы обычно однородны, что означает, что все «предметы» последовательности одного типа данных. Python Programming, 2/e 15

Списки и массивы n n n Списки в Python’е динамичны. Они могут расти и Списки и массивы n n n Списки в Python’е динамичны. Они могут расти и сжиматься по требованию. Списки в Python’е также гетерогенны, что означает, что один список может содержать «предметы» произвольных (различных) типов. Списки в Python’е это изменяемые последовательности произвольных объектов. Python Programming, 2/e 16

Операции со списками Оператор <seq> + <seq> * <int-expr> <seq>[] len(<seq>) <seq>[: ] for Операции со списками Оператор + * [] len() [: ] for in : in Значение Конкатенация Повторение Индексация Длина Обрезание Итерирование Членство (булево) Python Programming, 2/e 17

Операции со списками n n Исключая проверку членства, мы уже использовали эти операции с Операции со списками n n Исключая проверку членства, мы уже использовали эти операции с цепочками. Операция членства используется, чтобы проверить, что определённое значение содержится в последовательности. >>> lst = [1, 2, 3, 4] >>> 3 in lst True Python Programming, 2/e 18

Операции со списками n Пример с суммированием, приведённый ранее, можно записать так: sum = Операции со списками n Пример с суммированием, приведённый ранее, можно записать так: sum = 0 for x in s: sum = sum + x n В противоположность цепочкам, списки изменяемы: >>> 4 >>> >>> [1, lst = [1, 2, 3, 4] lst[3] = "Привет" lst 2, 3, 'Привет'] lst[2] = 7 lst 2, 7, 'Привет'] Python Programming, 2/e 19

Операции со списками n Список одинаковых объектов можно создать с помощью оператора повторения. Следующая Операции со списками n Список одинаковых объектов можно создать с помощью оператора повторения. Следующая команда создаёт список из 50 нулей: zeroes = [0] * 50 Python Programming, 2/e 20

Операции со списками n Списки часто строятся по частям, один элемент за раз, с Операции со списками n Списки часто строятся по частям, один элемент за раз, с помощью оператора append. nums = [] x = eval(input('Введите число: ')) while x >= 0: nums. append(x) x = eval(input('Введите число: ')) n Здесь переменная nums используется как накопитель, начиная с пустого списка, каждый раз в цикле добавляется новое значение. Python Programming, 2/e 21

Операции со списками Метод Значение <list>. append(x) Добавляет элемент x в конец списка. <list>. Операции со списками Метод Значение . append(x) Добавляет элемент x в конец списка. . sort() Упорядочивает список. Функцию сравнения можно передать как параметр. . reverse() Обращает список. . index(x) Возвращает индекс первого появления x. . insert(i, x) Вставляет x в список с индексом i. . count(x) Возвращает число появлений x в списке. . remove(x) Удаляет первое появление x в списке. . pop(i) Удаляет i-ый элемент списка и возвращает его значение. Python Programming, 2/e 22

Операции со списками >>> >>> [3, >>> [1, >>> >>> [9, >>> 2 >>> Операции со списками >>> >>> [3, >>> [1, >>> >>> [9, >>> 2 >>> [9, >>> 3 >>> [9, lst = [3, 1, 4, 1, 5, 9] lst. append(2) lst 1, 4, 1, 5, 9, 2] lst. sort() lst 1, 2, 3, 4, 5, 9] lst. reverse() lst 5, 4, 3, 2, 1, 1] lst. index(4) lst. insert(4, "Hello") lst 5, 4, 3, 'Hello', 2, 1, 1] lst. count(1)s lst. remove(1) lst 5, 4, 3, 'Hello', 2, 1] lst. pop(3) lst 5, 4, 'Hello', 2, 1] Python Programming, 2/e 23

Операции со списками n n Большинство этих методов не возвращают значение – они изменяют Операции со списками n n Большинство этих методов не возвращают значение – они изменяют содержание списка некоторым образом. Списки могут расти, присоединяя новые элементы и сжиматься, когда элементы удаляются. Отдельные элементы или целые куски (обрезания списков) можно удалить из списка с помощью оператора del. Python Programming, 2/e 24

Операции со списками n n >>> my. List=[34, 26, 0, 10] >>> del my. Операции со списками n n >>> my. List=[34, 26, 0, 10] >>> del my. List[1] >>> my. List [34, 0, 10] >>> del my. List[1: 3] >>> my. List [34] Оператор del не является методом списка, а встроенным оператором, который можно использовать на элементах списка. Python Programming, 2/e 25

Операции со списками n Основные принципы списков n n n Список это последовательность элементов, Операции со списками n Основные принципы списков n n n Список это последовательность элементов, хранимая как один объект. Элементы списка можно сделать доступными с помощью индексирования, подсписки можно сделать доступными с помощью обрезания. Списки изменяемы; индивидуальные элементы или целые куски можно заменить с помощью оператора присваивания. Python Programming, 2/e 26

Операции со списками n n Списки поддерживают набор удобных и часто используемых методов. Списки Операции со списками n n Списки поддерживают набор удобных и часто используемых методов. Списки растут и ужимаются по потребностям. Python Programming, 2/e 27

Статистика со списками n n n Один из способов решить нашу статистическую проблему заключается Статистика со списками n n n Один из способов решить нашу статистическую проблему заключается в занесении и хранении данных в списках. Тогда мы сможем написать функции, которые вычисляют среднее, стандартное отклонение и медиану. Давайте перепишем нашу более раннюю программу для нахождения среднего. Python Programming, 2/e 28

Статистика со списками n Давайте напишем функцию get. Numbers, которая получает числа от пользователя. Статистика со списками n Давайте напишем функцию get. Numbers, которая получает числа от пользователя. n Мы реализуем цикл с ограничением, чтобы получить числа. n Первоначально пустой список используется как накопитель для сбора чисел. n Список возвращается после того как все данные введены. Python Programming, 2/e 29

Статистика со списками def get. Numbers(): nums = [] # начинаем с пустого списка Статистика со списками def get. Numbers(): nums = [] # начинаем с пустого списка # цикл с ограничением для ввода чисел x. Str = input("Введите число ( чтобы выйти) >> ") while x. Str != "": x = eval(x. Str) nums. append(x) # добавляем значение в список x. Str = input("Введите число ( чтобы выйти) >> ") return nums n Используя этот код, мы получаем список чисел от пользователя одной строчкой кода : data = get. Numbers() Python Programming, 2/e 30

Статистика со списками n Теперь нам нужна функция, которая посчитает среднее от чисел в Статистика со списками n Теперь нам нужна функция, которая посчитает среднее от чисел в списке. n n n Ввод: список чисел Вывод: среднее чисел из списка ввода def mean(nums): sum = 0. 0 for num in nums: sum = sum + num return sum/len(nums) Python Programming, 2/e 31

Статистика со списками n n Следующая на очереди функция стандартного отклонения. Чтобы определить стандартное Статистика со списками n n Следующая на очереди функция стандартного отклонения. Чтобы определить стандартное отклонение, нам нужно знать среднее. n n Должны ли мы снова вычислить среднее внутри функции std. Dev? Должны ли мы передать среднее как параметр в функцию std. Dev? Python Programming, 2/e 32

Статистика со списками n n Повторное вычисление среднего внутри функции std. Dev неэффективно, если Статистика со списками n n Повторное вычисление среднего внутри функции std. Dev неэффективно, если данных много. Так как наша программа выдаёт и среднее и стандартное отклонение, давайте вычислим среднее и передадим его в std. Dev в качестве параметра. Python Programming, 2/e 33

Статистика со списками n n n def std. Dev(nums, xbar): sum. Dev. Sq = Статистика со списками n n n def std. Dev(nums, xbar): sum. Dev. Sq = 0. 0 for num in nums: dev = xbar - num sum. Dev. Sq = sum. Dev. Sq + dev * dev return sqrt(sum. Dev. Sq/(len(nums)-1)) Суммирование из формулы выполнено с помощью цикла и накопителя. Переменная sum. Dev. Sq содержит текущую сумму квадратов отклонений элементов. . Python Programming, 2/e 34

Статистика со списками n n У нас нет формулы для вычисления медианы. Нам нужно Статистика со списками n n У нас нет формулы для вычисления медианы. Нам нужно составить алгоритм нахождения среднего значения. Во-первых, нужно упорядочить числа в порядке возрастания. Во-вторых, среднее значение в списке равно медиане. Если длина списка четная, то в качестве медианы можно взять среднее двух чисел из середины. Python Programming, 2/e 35

Статистика со списками n Псевдокод Отсортируй числа в порядке возрастания Если чисел нечетное количество: Статистика со списками n Псевдокод Отсортируй числа в порядке возрастания Если чисел нечетное количество: median = среднему числу else: median = среднему двух средних чисел возвращаем медиану Python Programming, 2/e 36

Статистика со списками def median(nums): nums. sort() size = len(nums) mid. Pos = size Статистика со списками def median(nums): nums. sort() size = len(nums) mid. Pos = size // 2 if size % 2 == 0: median = (nums[mid. Pos] + nums[mid. Pos-1]) / 2 else: median = nums[mid. Pos] return median Python Programming, 2/e 37

Статистика со списками n n С этими функциями основная программа становится простой. def main(): Статистика со списками n n С этими функциями основная программа становится простой. def main(): print("Эта программа вычисляет среднее, медиану и стандартное отклонение. ") data = get. Numbers() xbar = mean(data) std = std. Dev(data, xbar) med = median(data) print("n. Среднее равно", xbar) print("Стандартное отклонение равно", std) print("Медиана равна", med) Python Programming, 2/e 38

Статистика со списками n Подпрограммы статистического анализа могут оказаться полезными для кого-то, поэтому добавим Статистика со списками n Подпрограммы статистического анализа могут оказаться полезными для кого-то, поэтому добавим возможность использовать этот код как модуль, добавляя строку кода: if __name__ == '__main__': main() Python Programming, 2/e 39

Списки объектов n n Все примеры списков, которые мы видели до сих пор, содержали Списки объектов n n Все примеры списков, которые мы видели до сих пор, содержали только простые типы данных, такие как числа и цепочки. Мы можем использовать списки для хранения данных более сложных типов, как например тип данных о студентах из главы 10. Python Programming, 2/e 40

Списки объектов n n Наша программа обработки оценок читает из файла данные об оценках Списки объектов n n Наша программа обработки оценок читает из файла данные об оценках студента и затем печатает информацию об оценках студента и затем печатает данные о студенте с наивысшей средней оценкой (GPA=grade point average). Обычная операция с данными при этом сортировка: по алфавиту, по часам учебных занятий, или по средним оценкам. Python Programming, 2/e 41

Списки объектов n n Давайте напишем программу, которая сортирует студентов по средней оценке, используя Списки объектов n n Давайте напишем программу, которая сортирует студентов по средней оценке, используя класс Student из предыдущей главы. Получаем имя файла с данными от пользователя Читаем данные о студентах в список Сортируем список по средней оценке Получаем имя файла для хранения данных от пользователя Пишем данные о студентах из списка в файл. Python Programming, 2/e 42

Списки объектов n n n Давайте начнём с файлов. Следующий код читает данные из Списки объектов n n n Давайте начнём с файлов. Следующий код читает данные из файла и создаёт список студентов. def read. Students(filename): infile = open(filename, 'r') students = [] for line in infile: students. append(make. Student(line)) infile. close() return students Мы используем функцию make. Student из программы gpa, поэтому нужно не забыть импортировать её. Python Programming, 2/e 43

Списки объектов n n n Давайте также напишем функцию для записи данных о студентах Списки объектов n n n Давайте также напишем функцию для записи данных о студентах в виде списка в файл. Каждая строка должна содержать следующие данные, разделённые табуляциями: фамилию, прослушанные часы, оценки. def write. Students(students, filename): # переменная students обозначает список объектов Student outfile = open(filename, 'w') for s in students: print((s. get. Name(), s. get. Hours(), s. get. QPoints(), sep="t", file=outfile) outfile. close() Python Programming, 2/e 44

Списки объектов n n Используя функции read. Students и write. Students, мы можем преобразовать Списки объектов n n Используя функции read. Students и write. Students, мы можем преобразовать наши данные о студентах в список и затем записать список в файл. Всё, что нам теперь нужно, это отсортировать записи по средней оценке. В статистических программах мы использовали метод sort, чтобы сортировать списки чисел. Как Python сортирует списки объектов? Python Programming, 2/e 45

Списки объектов n n n Чтобы сортировка работала нужно сказать функции sort как нужно Списки объектов n n n Чтобы сортировка работала нужно сказать функции sort как нужно сравнивать объекты. Можно создать ключ в виде функции следующим образом <список>. sort(key=<некот_функция>) Чтобы сортировать по средней оценке, нам нужна функция, которая берёт объект класса Student как параметр и возвращает среднюю оценку студента. Python Programming, 2/e 46

Списки объектов n n n def use_gpa(a. Student): return a. Student. gpa() Мы можем Списки объектов n n n def use_gpa(a. Student): return a. Student. gpa() Мы можем теперь отсортировать данные, вызывая метод sort с ключевой функцией в качестве параметра. data. sort(key=use_gpa) Python Programming, 2/e 47

Списки объектов n n n data. sort(key=use_gpa) Заметьте, что мы не поставили скобки () Списки объектов n n n data. sort(key=use_gpa) Заметьте, что мы не поставили скобки () после имени функции. Это происходит потому, что мы не вызываем функцию use_gpa на выполнение, а посылаем функцию use_gpa в метод sort. Python Programming, 2/e 48

Списки объектов n n n В действительности определение функции use_gpa излишне. Метод gpa в Списки объектов n n n В действительности определение функции use_gpa излишне. Метод gpa в классе Student это функция, которая берёт объект класса Student как параметр (формально, self) и возвращает среднюю оценку. Метод можно использовать прямо: data. sort(key=Student. gpa) Python Programming, 2/e 49

Списки объектов # gpasort. py # Программа сортирует студентов по средней # оценке from Списки объектов # gpasort. py # Программа сортирует студентов по средней # оценке from gpa import Student, make. Student def read. Students(filename): infile = open(filename, 'r') students = [] for line in infile: students. append(make. Student(line)) infile. close() return students def main(): print ("Эта программа сортиру данные о студентах по средней оценке ") filename = input("Введите имя файла данныхe: ") data = read. Students(filename) data. sort(Student. gpa) filename = input("Введите имя выходного файла: ") write. Students(data, filename) print("Данные были записаны в файл", filename) if __name__ == '__main__': main() def write. Students(students, filename): outfile = open(filename, 'w') for s in students: print(s. get. Name(), s. get. Hours(), s. get. QPoints(), sep="t", file=outfile) outfile. close() Python Programming, 2/e 50

Проектирование с использованием списков и классов n n В классе die. View из главы Проектирование с использованием списков и классов n n В классе die. View из главы 10 каждый объект сохраняет семь кругов, представляющих положения кружков на поверхности игральной кости. Ранее мы использовали специальные экземпляры переменных, чтобы отслеживать положение каждого кружка, pip 1, pip 2, pip 3, … Python Programming, 2/e 51

Проектирование с использованием списков и классов n n Что происходит, если мы сохраняем объекты Проектирование с использованием списков и классов n n Что происходит, если мы сохраняем объекты кружков в списке? В предыдущей программе мы создали кружки так: self. pip 1 = self. __make. Pip(cx, cy) n __make. Pip это локальный метод класса Die. View, который создаёт круг с центром, определяемом параметрами. Python Programming, 2/e 52

Проектирование с использованием списков и классов n n Один из подходов начать с пустого Проектирование с использованием списков и классов n n Один из подходов начать с пустого листа и добавлять кружки по одному за раз. pips = [] pips. append(self. __make. Pip(cx-offset, cy-offset) pips. append(self. __make. Pip(cx-offset, cy) … self. pips = pips Python Programming, 2/e 53

Проектирование с использованием списков и классов n n Еще более простой подход – создать Проектирование с использованием списков и классов n n Еще более простой подход – создать список непосредственно. self. pips = [self. __make. Pip(cx-offset, cy-offset), self. __make. Pip(cx-offset, cy), … self. __make. Pip(cx+offset, cy+offset) ] Python достаточно крут, чтобы понимать, что объект продолжается на несколько строк, и ждёт знак ‘]’. Перечисление объектов как выше один объект на строку значительно облегчает чтение. Python Programming, 2/e 54

Проектирование с использованием списков и классов n n n Помещение наших кружков в один Проектирование с использованием списков и классов n n n Помещение наших кружков в один лист упрощает многие наши действия. Заменим цвет кружков на цвет фона: for pip in self. pips: pip. set. Fill(self. background) Наши предыдущие 7 строк кода превратились в две. Python Programming, 2/e 55

Проектирование с использованием списков и классов n n Мы можем включить цвет кружков назад, Проектирование с использованием списков и классов n n Мы можем включить цвет кружков назад, используя список кружков. Наш первоначальный код выглядел так : self. pip 1. set. Fill(self. foreground) self. pip 4. set. Fill(self. foreground) self. pip 7. set. Fill(self. foreground) Теперь он выглядит так: self. pips[0]. set. Fill(self. foreground) self. pips[3]. set. Fill(self. foreground) self. pips[6]. set. Fill(self. foreground) Python Programming, 2/e 56

Проектирование с использованием списков и классов n Существует и более простой способ получить доступ Проектирование с использованием списков и классов n Существует и более простой способ получить доступ к тем же методам: for i in [0, 3, 6]: self. pips[i]. set. Fill(self. foreground) n n Мы можем использовать преимущества этого метода, сохраняя список того, какие кружки активировать. Пройти в цикле все кружки и все выключить. Определить список наборов индексов кружков, которые нужно включить. Пройти в цикле список наборов индексов и включить соответствующие кружки. Python Programming, 2/e 57

Проектирование с использованием списков и классов for pip in self. pips: self. pip. set. Проектирование с использованием списков и классов for pip in self. pips: self. pip. set. Fill(self. background) if value == 1: on = [3] elif value == 2: on = [0, 6] elif value == 3: on = [0, 3, 6] elif value == 4: on = [0, 2, 4, 6] elif value == 5: on = [0, 2, 3, 4, 6] else: on = [0, 1, 2, 3, 4, 5, 6] for i in on: self. pips[i]. set. Fill(self. foreground) Python Programming, 2/e 58

Проектирование с использованием списков и классов n n Можно сделать даже лучше Правильное множество Проектирование с использованием списков и классов n n Можно сделать даже лучше Правильное множество кружков задаётся переменной value. Мы можем сделать этот процесс управляемым таблицей. Мы можем использовать список, в котором каждый элемент является списком индексов. Например, элемент в позиции 3 должен быть [0, 3, 6], потому что именно эти кружки должны быть включены, чтобы показать значение 3. Python Programming, 2/e 59

Проектирование с использованием списков и классов n Код, управляемый таблицей, выглядит так: on. Table Проектирование с использованием списков и классов n Код, управляемый таблицей, выглядит так: on. Table = [ [], [3], [2, 4], [2, 3, 4], [0, 2, 4, 6], [0, 2, 3, 4, 6], [0, 1, 2, 4, 5, 6] ] for pip in self. pips: self. pip. set. Fill(self. background) on = on. Table[value] for i in on: self. pips[i]. set. Fill(self. foreground) Python Programming, 2/e 60

Проектирование с использованием списков и классов n on. Table = [ [], [3], [2, Проектирование с использованием списков и классов n on. Table = [ [], [3], [2, 4], [2, 3, 4], [0, 2, 4, 6], [0, 2, 3, 4, 6], [0, 1, 2, 4, 5, 6] ] for pip in self. pips: self. pip. set. Fill(self. background) on = on. Table[value] for i in on: self. pips[i]. set. Fill(self. foreground) n n Таблица заполнена элементом ‘[]’ в 0 -ой позиции, так как он никогда не будет использоваться. Таблица on. Table останется неизменной в течение всей жизни die. View, поэтому есть смысл поместить таблицу в конструкторo и сохранить её в переменной-экземпляре. Python Programming, 2/e 61

Проектирование с использованием списков и классов # dieview 2. py # Виджет для показа Проектирование с использованием списков и классов # dieview 2. py # Виджет для показа значения игральной кости. # Эта версия использует списки, чтобы упростить отслеживание кружков. class Die. View: """ Die. View это виджет для показа графического представления стандартной шестисторонней игральной кости. """ def __init__(self, win, center, size): """Создаёт вид кости, e. g. : d 1 = GDie(my. Win, Point(40, 50), 20) создаёт кость с центром в (40, 50) со стороной длины 20. """ # сначала определяем стандартные значения self. win = win self. background = "white" # цвет стороны кости self. foreground = "black" # цвет кружка self. psize = 0. 1 * size # радиус кружка hsize = size / 2. 0 # половина размера offset = 0. 6 * hsize # расстояние от центра до #внешнего кружка # создаёт квадрат поверхности cx, cy = center. get. X(), center. get. Y() p 1 = Point(cx-hsize, cy-hsize) p 2 = Point(cx+hsize, cy+hsize) rect = Rectangle(p 1, p 2) rect. draw(win) rect. set. Fill(self. background) # Создаёт 7 кружков со стандартным расположением self. pips = [ self. __make. Pip(cx-offset, cy-offset), self. __make. Pip(cx-offset, cy+offset), self. __make. Pip(cx, cy), self. __make. Pip(cx+offset, cy-offset), self. __make. Pip(cx+offset, cy+offset) ] # Создаёт таблицу, в которой есть кружки для всех значений self. on. Table = [ [], [3], [2, 4], [2, 3, 4], [0, 2, 4, 6], [0, 2, 3, 4, 6], [0, 1, 2, 4, 5, 6] ] self. set. Value(1) def __make. Pip(self, x, y): """Внутренний метод нарисовать кружок с центром в (x, y)""" pip = Circle(Point(x, y), self. psize) pip. set. Fill(self. background) pip. set. Outline(self. background) pip. draw(self. win) return pip def set. Value(self, value): """ Задай эту кость, чтобы показать значение. """ # Выключаем все кружки for pip in self. pips: pip. set. Fill(self. background) # включаем подходящие кружки for i in self. on. Table[value]: self. pips[i]. set. Fill(self. foreground) Python Programming, 2/e 62

Проектирование с использованием списков и классов n Наконец этот пример показывает преимущества инкапсуляции. n Проектирование с использованием списков и классов n Наконец этот пример показывает преимущества инкапсуляции. n Мы улучшили реализацию класса die. View, но при этом не изменили множество методов, которое он поддерживает. n Мы можем заменить эту новую версию класса без необходимости изменять другой код. n Инкапсуляция позволяет нам построить сложные системы программного обеспечения как множество «вставляемых» модулей. Python Programming, 2/e 63

Типичный пример: калькулятор на Python’е n n n Новый класс die. View показывает эффективное Типичный пример: калькулятор на Python’е n n n Новый класс die. View показывает эффективное использование списков в качестве переменных экземпляра класса. Наши списки кружков и таблица on. Table содержат кружки и списки соответственно, которые сами являются объектами. Мы можем рассматривать саму программу как набор структур данных (наборов и объектов) и множества алгоритмов, которые действуют на этих данных. Python Programming, 2/e 64

Калькулятор как объект n n Давайте разработаем программу, которая реализует калькулятор на Python’е. Наш Калькулятор как объект n n Давайте разработаем программу, которая реализует калькулятор на Python’е. Наш калькулятор будет иметь кнопки для n n Десяти цифр (0 -9) Десятичной точки (. ) Четырёх операций (+, -, *, /) Несколько специальных ключей n n n ‘C’ для стирания дисплея ‘<-’ для забоя на дисплее ‘=’ для проведения вычислений Python Programming, 2/e 65

Калькулятор как объект Python Programming, 2/e 66 Калькулятор как объект Python Programming, 2/e 66

Калькулятор как объект n n Мы примем простой подход к выполнению вычислений. По мере Калькулятор как объект n n Мы примем простой подход к выполнению вычислений. По мере того, как нажимаются кнопки их значения появляются на дисплее. Набранное выражение вычисляется, когда нажимается кнопка «=» . Мы можем поделить функционирование калькулятора на две части: создание интерфейса и взаимодействие с пользователем. Python Programming, 2/e 67

Построение интерфейса n n Во-первых, создаём графическое окно. Координаты подобраны так, чтобы упростить расположение Построение интерфейса n n Во-первых, создаём графическое окно. Координаты подобраны так, чтобы упростить расположение кнопок. В последней строке окно помещается в переменную, чтобы другие методы могли обратиться к нему. def __init__(self): # создаём окно для калькулятора win = Graph. Win( «Калькулятор") win. set. Coords(0, 0, 6, 7) win. set. Background("slategray") self. win = win Python Programming, 2/e 68

Построение интерфейса n n n Наш следующий шаг создать кнопки, многократно используя класс Button. Построение интерфейса n n n Наш следующий шаг создать кнопки, многократно используя класс Button. # создаём список кнопок # начинаем с кнопок стандартного размера # b. Specs даёт центры координат и подписи кнопок b. Specs = [(2, 1, '0'), (3, 1, '. '), (1, 2, '1'), (2, 2, '2'), (3, 2, '3'), (4, 2, '+'), (5, 2, '-'), (1, 3, '4'), (2, 3, '5'), (3, 3, '6'), (4, 3, '*'), (5, 3, '/'), (1, 4, '7'), (2, 4, '8'), (3, 4, '9'), (4, 4, '<-'), (5, 4, 'C')] self. buttons = [] for cx, cy, label in b. Specs: self. buttons. append(Button(self. win, Point(cx, cy), . 75, label)) # create the larger = button self. buttons. append(Button(self. win, Point(4. 5, 1), 1. 75, "=")) # activate all buttons for b in self. buttons: b. activate() Список bspecs содержит спецификации кнопок, включая их центры и подписи. Python Programming, 2/e 69

Построение интерфейса n n n Каждая спецификация это кортеж. Кортеж выглядит как список но Построение интерфейса n n n Каждая спецификация это кортеж. Кортеж выглядит как список но обозначается круглыми скобками ‘()’, а не квадратными ‘[]’. Кортежи это последовательности, элементы которых неизменяемы. Python Programming, 2/e 70

Построение интерфейса n Концептуально, каждая итерация цикла начинается с присваивания: (cx, cy, label)=<следующий элемент Построение интерфейса n Концептуально, каждая итерация цикла начинается с присваивания: (cx, cy, label)=<следующий элемент из b. Specs> n n n Каждый элемент в b. Specs -- кортеж. Когда кортеж элементов используется с левой стороны присваивания, соответствующие компоненты кортежа с правой стороны распаковываются в переменные левой стороны. На первом проходе цикла: cx, cy, label = 2, 1, ” 0” Python Programming, 2/e 71

Построение интерфейса n n n Каждая итерация цикла распаковывает очередной кортеж из списка b. Построение интерфейса n n n Каждая итерация цикла распаковывает очередной кортеж из списка b. Specs в переменные «счетчика цикла» . Эти значения затем используются для создания экземпляра класса Button, который добавляется к множеству кнопок. Создание дисплея калькулятора это просто создание прямоугольника с некоторым текстом в центре. Нам нужно сохранить текст в переменной, чтобы к содержанию можно было получить доступ и его можно было изменить. Python Programming, 2/e 72

Построение интерфейса n n Ниже код для создания дисплея bg = Rectangle(Point(. 5, 5. Построение интерфейса n n Ниже код для создания дисплея bg = Rectangle(Point(. 5, 5. 5), Point(5. 5, 6. 5)) bg. set. Fill('white') bg. draw(self. win) text = Text(Point(3, 6), "") text. draw(self. win) text. set. Face("courier") text. set. Style("bold") text. set. Size(16) self. display = text Python Programming, 2/e 73

Разработка кнопок n n n Теперь, когда интерфейс создан, нужен метод, чтобы заставить его Разработка кнопок n n n Теперь, когда интерфейс создан, нужен метод, чтобы заставить его работать. Мы будем использовать событийный цикл, который ожидает щелчка по кнопке, а затем обрабатывает этот щелчок. def run(self): # Бесконечный 'событийный цикл' для обработки # щелчков по кнопкам. while True: key = self. get. Button() self. process. Button(key) Python Programming, 2/e 74

Разработка кнопок n n n Мы продолжаем получать щелчки мыши, пока есть щелчки по Разработка кнопок n n n Мы продолжаем получать щелчки мыши, пока есть щелчки по кнопкам. Чтобы определить был ли щелчок по кнопке, мы проходим циклом по кнопкам и проверяем каждую. def get. Button(self): # Ждёт пока щелкнут по кнопке и # возвращает подпись кнопки по которой # произведён щелчок. while True: p = self. win. get. Mouse() for b in self. buttons: if b. clicked(p): return b. get. Label() # method exit Python Programming, 2/e 75

Разработка кнопок n n То, что кнопки в списке, большое достижение. Можно использовать цикл Разработка кнопок n n То, что кнопки в списке, большое достижение. Можно использовать цикл for для просмотра каждой кнопки по отдельности. Если точка щелчка p оказывается в одной из кнопок, то надпись на кнопке возвращается и происходит выход из во всех иных случаях бесконечного цикла. Python Programming, 2/e 76

Разработка кнопок n n Последний шаг это актуализация дисплея в соответствии с тем какая Разработка кнопок n n Последний шаг это актуализация дисплея в соответствии с тем какая кнопка была щелкнута. Цифра или оператор добавляются на дисплее. Если переменная key содержит надпись кнопки, а переменная text содержит текущее содержание дисплея, то код таков: self. display. set. Text(text+key) Python Programming, 2/e 77

Разработка кнопок n Ключ очистки стирает всё с дисплея: self. display. set. Text( Разработка кнопок n Ключ очистки стирает всё с дисплея: self. display. set. Text("") n Ключ забоя удаляет один символ: self. display. set. Text(text[: -1]) n Ключ равенства вычисляет выражение и выводит результат. Python Programming, 2/e 78

Разработка кнопок n n try: result = eval(text) except: result = 'ERROR' self. display. Разработка кнопок n n try: result = eval(text) except: result = 'ERROR' self. display. set. Text(str(result)) Обработка исключений необходима здесь, чтобы поймать ошибки времени исполнения , если выражения, которые вычисляются, не являются правильными выражениями языка Python. Если будет ошибка, то программа покажет ERROR, а не завершится авостом. Python Programming, 2/e 79