0.97M
Category: programmingprogramming

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

1.

MACHINE
LEARNING
ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ PYTHON И
РАЗРАБОТКА ПРОГРАММ ДЛЯ МАШИННОГО ОБУЧЕНИЯ
ЛЕКЦИЯ V

2.

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

3.

Обработка и вывод вложенных списков
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]]
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]]
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нулей).
Затем сделаем каждый
элемент списка ссылкой
на другой одномерный
список из m элементов:
Второй (но похожий)
способ:
создать пустой список,
потом n раз добавить в
него новый элемент,
являющийся спискомстрокой:
Третий способ воспользоваться
генератором:
создать
список
из n элементов, каждый из
которых будет списком,
состоящих из m нулей:
n=3
m=4
a = [0] * n
for i in range(n):
a[i] = [0] * m
n=3
m=4
a = []
for i in range(n):
a.append([0] * m)
n=3
m=4
a = [[0] * m for i in range(n)]

7.

Ввод двумерного массива
Пример программы, считающей двумерный массив из 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.

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

10.

Императивное программирование
Императивное программирование предполагает ответ на вопрос “Как?”. В рамках этой
парадигмы вы задаете последовательность действий, которые нужно выполнить, для того
чтобы получить результат. Результат выполнения сохраняется в ячейках памяти, к которым
можно обратиться в последствии.
• Структурное программирование
• Объектно-ориентированное программирование

11.

Декларативное программирование
Декларативное программирование предполагает ответ на вопрос “Что?”. Здесь вы описываете
задачу, даете спецификацию, говорите, что вы хотите получить в результате выполнения
программы, но не определяете, как этот ответ будет получен.
• Функциональное программирование

12.

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

13.

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

14.

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

15.

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

16.

Функциональное программирование в Python
Функциональным называется такой подход к процессу программирования, в программа
рассматривается как вычисление математических функций, при этом не используются состояния и
изменяемые объекты. Как правило, когда говорят о элементах функционального
программировании в Python, то подразумеваются следующие функции:
1.
2.
3.
4.
5.
Lambda
map()
filter()
reduce()
zip()

17.

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

18.

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

19.

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

20.

А теперь то же самое, только используя lambda выражение:
Функция map может быть так же применена для нескольких списков, в таком случае функцияаргумент должна принимать количество аргументов, соответствующее количеству списков:

21.

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

22.

Функция filter()
Функция filter предлагает элегантный вариант фильтрации элементов последовательности. Принимает
в качестве аргументов функцию и последовательность, которую необходимо отфильтровать:
mixed = ['мак', 'просо', 'мак', 'мак', 'просо', 'мак', 'просо', 'просо', 'просо', 'мак']
zolushka = list(filter(lambda x: x == 'мак', mixed))
print (zolushka)
['мак', 'мак', 'мак', 'мак', 'мак']
Обратите внимание, что функция, передаваемая в filter должна возвращать значение True / False, чтобы
элементы корректно отфильтровались.

23.

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

24.

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

25.

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

26.

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

27.

Создание класса
Определение класса начинается с ключевого слова 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))
# Увеличиваем количество людей перевезенных ЭТИМ лифтом
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.

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

33.

Спасибо за внимание!
English     Русский Rules