Machine learning. Технология программирования на языке python и разработка программ для машинного обучения. Лекция v

Содержание

Слайд 2

Двумерные массивы Вложенные списки и массивы Объектно-ориентированное и функциональное программирование на Python План занятия

Двумерные массивы
Вложенные списки и массивы
Объектно-ориентированное и функциональное программирование на Python

План занятия

Слайд 3

a = [[1, 2, 3], [4, 5, 6]] print(a[0]) print(a[1]) b

a = [[1, 2, 3], [4, 5, 6]]
print(a[0])
print(a[1])
b = a[0]
print(b)
print(a[0][2])
a[0][1] =

7
print(a)
print(b)
b[2] = 9
print(a[0])
print(b)

Обработка и вывод вложенных списков

Слайд 4

a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]]

a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]]
for

row in a:
for elem in row:
print(elem, end=' ')
print()

for row in a:
print(' '.join([str(elem) for elem in row]))

Вывод двумерного массива

Слайд 5

a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]]

a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]]
s

= 0
for i in range(len(a)):
for j in range(len(a[i])):
s += a[i][j]
print(s)

Используем два вложенных цикла для подсчета суммы всех чисел в списке:

То же самое с циклом не по индексу, а по значениям строк

a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]]
s = 0
for row in a:
for elem in row:
s += elem
print(s)

Слайд 6

Создание вложенных списков Первый способ: сначала создадим список из n элементов

Создание вложенных списков

Первый способ:
сначала создадим список из n элементов (для начала просто

из nнулей). Затем сделаем каждый элемент списка ссылкой на другой одномерный список из m элементов:

n = 3
m = 4
a = [0] * n
for i in range(n):
a[i] = [0] * m

Второй (но похожий) способ:
создать пустой список, потом n раз добавить в него новый элемент, являющийся списком-строкой:

n = 3
m = 4
a = []
for i in range(n):
a.append([0] * m)

Третий способ - воспользоваться генератором:
создать список из n элементов, каждый из которых будет списком, состоящих из m нулей:

n = 3
m = 4
a = [[0] * m for i in range(n)]

Слайд 7

Ввод двумерного массива Пример программы, считающей двумерный массив из n строк,

Ввод двумерного массива

Пример программы, считающей двумерный массив из n строк, каждая

из которых содержит m чисел:

# в первой строке ввода идёт количество строк массива
n = int(input())
a = []
for i in range(n):
a.append([int(j) for j in input().split()])

Слайд 8

Ввод двумерного массива Без использования сложных вложенных вызовов функций: # в

Ввод двумерного массива

Без использования сложных вложенных вызовов функций:

# в первой строке

ввода идёт количество строк массива
n = int(input())
a = []
for i in range(n):
row = input().split()
for i in range(len(row)):
row[i] = int(row[i])
a.append(row)

То же самое при помощи генератора:

# в первой строке ввода идёт количество строк массива
n = int(input())
a = [[int(j) for j in input().split()] for i in range(n)]

Слайд 9

Парадигмы программирования Парадигма программирования — это совокупность идей и понятий, определяющих

Парадигмы программирования

Парадигма программирования — это совокупность идей и понятий, определяющих стиль написания

компьютерных программ (подход к программированию). Это способ концептуализации, определяющий организацию вычислений и структурирование работы, выполняемой компьютером.

Императивная
Декларативная

Слайд 10

Императивное программирование Императивное программирование предполагает ответ на вопрос “Как?”. В рамках

Императивное программирование

Императивное программирование предполагает ответ на вопрос “Как?”. В рамках этой парадигмы

вы задаете последовательность действий, которые нужно выполнить, для того чтобы получить результат. Результат выполнения сохраняется в ячейках памяти, к которым можно обратиться в последствии. 

Структурное программирование
Объектно-ориентированное программирование

Слайд 11

Декларативное программирование Декларативное программирование предполагает ответ на вопрос “Что?”. Здесь вы

Декларативное программирование

Декларативное программирование предполагает ответ на вопрос “Что?”. Здесь вы описываете задачу,

даете спецификацию, говорите, что вы хотите получить в результате выполнения программы, но не определяете, как этот ответ будет получен.

Функциональное программирование

Слайд 12

Структурное программирование В рамках структурного подхода к программированию основное внимание сосредоточено

Структурное программирование

В рамках структурного подхода к программированию основное внимание сосредоточено на декомпозиции –

разбиении программы/задачи на отдельные блоки / подзадачи. Разработка ведётся пошагово, методом “сверху вниз”. Наиболее распространенным языком, который предполагает использование структурного подхода к программирования является язык C, в нем, основными строительными блоками являются функции.
Слайд 13

ООП В рамках объектно-ориентированного (ООП) подхода программа представляется в виде совокупности

ООП

В рамках объектно-ориентированного (ООП) подхода программа представляется в виде совокупности объектов, каждый из

которых является экземпляром определенного класса, классы образуют иерархию наследования. ООП базируется на следующих принципах: инкапсуляция, наследование, полиморфизм, абстракция. Примерами языков, которые позволяют вести разработку в этой парадигме являются C#, Java.
Слайд 14

Функциональное программирование В рамках функционального программирования выполнение программы – это процесс

Функциональное программирование

В рамках функционального программирования выполнение программы – это процесс вычисления, который трактуется как

вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании). Языки, которые реализуют эту парадигму – это Haskell, Lisp.
Слайд 15

Свойства функционального программирования Функции являются объектами первого класса (First Class Object).

Свойства функционального программирования

Функции являются объектами первого класса (First Class Object). Это

означает, что с функциями вы можете работать, также как и с данными: передавать их в качестве аргументов другим функциям, присваивать переменным и т.п.
В функциональных языках не используются переменные (как именованные ячейки памяти), т.к. там нет состояний, а т.к. нет переменных, то и нет операции присваивания, как это понимается в императивном программировании.
Рекурсия является основным подходом для управления вычислениями, а не циклы и условные операторы.
Используются функции высшего порядка (High Order Functions). Функции высшего порядка – это функций, которые могут в качестве аргументов принимать другие функции.
Функции являются “чистыми” (Pure Functions) – т.е. не имеют побочных эффектов (иногда говорят: не имеют сайд-эффектов).
Акцент на том, что должно быть вычислено, а не на том, как вычислять.
Слайд 16

Функциональное программирование в Python Функциональным называется такой подход к процессу программирования,

Функциональное программирование в Python

Функциональным называется такой подход к процессу программирования, в

программа рассматривается как вычисление математических функций, при этом не используются состояния и изменяемые объекты. Как правило, когда говорят о элементах функционального программировании в Python, то подразумеваются следующие функции:

Lambda
map()
filter()
reduce()
zip()

Слайд 17

Lambda выражение в Python lambda оператор или lambda функция в Python

Lambda выражение в Python

lambda оператор или lambda функция в Python это способ создать анонимную

функцию, то есть функцию без имени. Такие функции можно назвать одноразовыми, они используются только при создании. Как правило, lambda функции используются в комбинации с функциями filter, map, reduce.
Синтаксис lambda выражения в Python

В качестве arguments передается список аргументов, разделенных запятой, после чего над переданными аргументами выполняется expression. Если присвоить lambda-функцию переменной, то получим поведение как в обычной функции (делаем мы это исключительно в целях демонстрации)

Слайд 18

Функция map() В Python функция map принимает два аргумента: функцию и

Функция map()

В Python функция map принимает два аргумента: функцию и аргумент составного типа

данных, например, список. map применяет к каждому элементу списка переданную функцию. Например, вы прочитали из файла список чисел, изначально все эти числа имеют строковый тип данных, чтобы работать с ними - нужно превратить их в целое число:
Слайд 19

Тот же эффект мы можем получить, применив функцию map: Пример работы

Тот же эффект мы можем получить, применив функцию map:

Пример работы данной

функции совместно с созданной пользователем функцией:
Слайд 20

А теперь то же самое, только используя lambda выражение: Функция map

А теперь то же самое, только используя lambda выражение:

Функция map может быть так

же применена для нескольких списков, в таком случае функция-аргумент должна принимать количество аргументов, соответствующее количеству списков:
Слайд 21

Если же количество элементов в списках совпадать не будет, то выполнение закончится на минимальном списке:

Если же количество элементов в списках совпадать не будет, то выполнение

закончится на минимальном списке:
Слайд 22

Функция filter() Функция filter предлагает элегантный вариант фильтрации элементов последовательности. Принимает

Функция filter()

Функция filter предлагает элегантный вариант фильтрации элементов последовательности. Принимает в качестве

аргументов функцию и последовательность, которую необходимо отфильтровать:

mixed = ['мак', 'просо', 'мак', 'мак', 'просо', 'мак', 'просо', 'просо', 'просо', 'мак']
zolushka = list(filter(lambda x: x == 'мак', mixed))
print (zolushka)
['мак', 'мак', 'мак', 'мак', 'мак']

Обратите внимание, что функция, передаваемая в filter должна возвращать значение True / False, чтобы элементы корректно отфильтровались.

Слайд 23

Функция reduce() Функция reduce принимает 2 аргумента: функцию и последовательность. reduce()

Функция reduce()

Функция reduce принимает 2 аргумента: функцию и последовательность. reduce() последовательно применяет

функцию-аргумент к элементам списка, возвращает единичное значение. Обратите внимание в Python 2.x функция reduce доступна как встроенная, в то время, как в Python 3 она была перемещена в модуль functools.
Вычисление суммы всех элементов списка при помощи reduce:

Вычисление наибольшего элемента в списке при помощи reduce:

Слайд 24

Функция zip() Функция zip объединяет в кортежи элементы из последовательностей переданных

Функция zip()

Функция zip объединяет в кортежи элементы из последовательностей переданных в качестве

аргументов.

Обратите внимание, что zip прекращает выполнение, как только достигнут конец самого короткого списка.

Слайд 25

Объектно-ориентированное программирование в Python Объектно-ориентированным программированием называется такой подход к программированию,

Объектно-ориентированное программирование в Python

Объектно-ориентированным программированием называется такой подход к программированию, в котором

используются понятия класса и объекта. Говоря проще, когда перед нами стоит задача запрограммировать какой-либо объект, то намного легче сделать это описав этот объект, чем написав ряд функций.
Слайд 26

Терминология объектно-ориентированного программирования Класс (Class): Определенный программистом прототип программируемого объекта с

Терминология объектно-ориентированного программирования

Класс (Class): Определенный программистом прототип программируемого объекта с набором

атрибутов (переменных и методов), которые описывают данный объект. Доступ к аттрибутам и методам осуществляется через точку
Переменная класса (Class variable): Переменная, доступная для всех экземпляров данного класса. Определяется внутри класса, но вне любых методов класса.
Экземпляр класса (Instance): Отдельный объект-представитель определенного класса.
Переменная экземпляра класса (Instance variable): Переменная определенная внутри медота класса, принадлежащая только к этому классу.
Метод (Method): Особая функция, определенная внутри класса.
Наследование (Inheritance): Передача аттрибутов и методов родительского класса дочерним классам.
Перегрузка функций (Function overloading): Изменение работы метода, унаследованного дочерним классом от родительского класса.
Перегрузка операторов (Operator overloading): Определение работы операторов с экземплярами данного класса.
Слайд 27

Создание класса Определение класса начинается с ключевого слова class, после него

Создание класса

Определение класса начинается с ключевого слова class, после него следует имя класса

и двоеточие. Теперь с отступом можно описывать сам класс.

class Elevator:
    """ Simple elevator class """
    # Переменная класса. Сколько людей было перевезено ВСЕМИ лифтами
    people_lifted = 0
# Конструктор класса. Вызывается при создании экземпляра класса
    def __init__(self,name):
        self.name = name
        # переменная экземпляра класса. Количество людей перевезенных КОНКРЕТНЫМ лифтом
        self.people_lifted = 0

Слайд 28

# Метод перевозки людей def lift(self): print ("{} lifted someone".format(self.name)) #

 # Метод перевозки людей
    def lift(self):
        print ("{} lifted someone".format(self.name))
        # Увеличиваем количество людей

перевезенных ЭТИМ лифтом
        self.people_lifted += 1
        # Увеличиваем количество людей перевезенных ВСЕМИ лифтами
        Elevator.people_lifted += 1
# Метод печатающий информацию о конкретном лифте
    def info(self):
        print (self.name, "lifted", self.people_lifted, "people out of", Elevator.people_lifted)
Слайд 29

Создание экземпляров класса Чтобы создать экземпляр класса следует любой переменной присвоить

Создание экземпляров класса

Чтобы создать экземпляр класса следует любой переменной присвоить значение имени класса,

указав в скобках аргументы, которые принимает метод __init__().

elevator_1 = Elevator("OTIS")
elevator_2 = Elevator("PHILLIPS")

Слайд 30

Получение доступа к атрибутам и методам класса Чтобы получить доступ к

Получение доступа к атрибутам и методам класса

Чтобы получить доступ к атрибутам класса

в Python следует после объекта поставить точку и написать имя переменной или метода, которые вы хотите использовать:

# Везем человека в лифте под именем OTIS
elevator_1.lift()
# Везем двоих человек в лифте под именем PHILLIPS
elevator_2.lift()
elevator_2.lift()
# Получаем информацию по лифту под именем OTIS
elevator_1.info()
# Получаем информацию по лифту под именем PHILLIPS
elevator_2.info()

Слайд 31

Соединив все это в одном файле, получим следующее:

Соединив все это в одном файле, получим следующее:

Слайд 32

Файловая система и работа с файлами Домашние задания: как реализуются программы План следующего занятия

Файловая система и работа с файлами
Домашние задания: как реализуются программы

План следующего

занятия