Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Программирование как способ
выражения мыслей
Левон Авакян/ WoT Server
Relaibility/
l_avakyan@wargaming.net
Или учимся разговаривать с машиной
1
Оглавление 2
• Как работает современный компьютер
• Немного истории
• Алгоритмы
• Внутреннее устройство
• Языки программирования
• Какие бывают
• Чем отличаются
• Для чего используются
• Python
• Философия
• Основные конструкции
• Примеры
О чем я буду говорить
3
Как работает
современный
компьютер
Без фундамента никуда
Вычислительные машины 4
Вычислительная машина, счётная машина — механизм, электромеханическое
или электронное устройство, предназначенное для автоматического
выполнения математических операций
Они были очень давно
Алгоритм 5
Алгоритм — набор инструкций, описывающих порядок действий исполнителя для достижения
некоторого результата.
Свойства алгоритма:
• Дискретность
• Детерминированность
• Понятность
• Завершаемость
• Массовость
• Результативность
Все знают, но боятся сказать
Машина Тьюринга 6
Машина Тьюринга — абстрактная вычислительная машина. Способна имитировать всех
исполнителей, каким-либо образом реализующих процесс пошагового вычисления, в котором
каждый шаг вычисления достаточно элементарен.
Состоит из:
• Неограниченная в обе стороны лента, разделённая на ячейки
• Управляющее устройство
• Головка
Конкретная реализация требует:
• Алфавит, включающий пустой символ
• Множество состоянии головки
• Правила перехода
Звучит круто, может быть дело в слове «машина»
Машина Тьюринга 7
Пример
Архитектура фон Неймана 8
Архитектура фон Неймана — широко известный принцип совместного хранения команд и
данных в памяти компьютера.
Звучит еще круче чем «машина Тьюринга»
Архитектура фон Неймана 9
Основные принципы:
• Принцип однородности памяти
• Принцип адресности
• Принцип программного управления
• Принцип двоичного кодирования
Обсудим?
10
11
Языки
программирования
Как сказать машине, что я от нее
хочу
Язык программирования 12
Язык программирования — формальный язык, предназначенный для записи компьютерных
программ. Язык программирования определяет
набор лексических, синтактических и семантических правил, определяющих внешний вид
программы и действия, которые выполнит исполнитель (обычно — ЭВМ) под её управлением.
А что это?
Парадигмы программирования 13
Императивное программирование — это парадигма программирования для которой
характерно следующее:
• в исходном коде программы записываются инструкции (команды);
• инструкции должны выполняться последовательно;
• при выполнении инструкции данные, полученные при выполнении предыдущих инструкций,
могут читаться из памяти;
• данные, полученные при выполнении инструкции, могут записываться в память.
Декларативное программирование — это парадигма программирования, в которой
задаётся спецификация решения задачи, то есть описывается, что представляет собой
проблема и ожидаемый результат.
Классификация
Языки программирования 14
• Процедурное программирование
• Функциональное программирование
• Логическое программирование
• Объектно-ориентированное программирование
Классификация
Процедурное программирование 15
Процедурное программирование — программирование на императивном языке, при котором
последовательно выполняемые операторы можно собрать в подпрограммы, то есть более
крупные целостные единицы кода, с помощью механизмов самого языка.
Примеры:
• C
• Pascal
Классификация
Функциональное программирование 16
Функциональное программирование - раздел дискретной математики и
парадигма программирования, в которой процесс вычисления трактуется как вычисление
значений функций в математическом понимании последних (в отличие от функций как
подпрограмм в процедурном программировании).
Примеры:
• Erlang
• Hasckell
Классификация
Логическое программирование 17
Логическое программирование - парадигма программирования, основанная на
автоматическом доказательстве теорем, а также раздел дискретной математики, изучающий
принципы логического вывода информации на основе заданных фактов и правил вывода.
Примеры:
• Planner
• Prolog
Классификация
Объектно-ориентированное программирование 18
Объектно-ориентированное программирование — методология программирования,
основанная на представлении программы в виде совокупности объектов, каждый из которых
является экземпляром определенного класса, а классы образуют иерархию наследования
Примеры:
• Java
• C#
• C++
Классификация
Уровень Абстракции 19
Уровень Абстракции — один из способов сокрытия деталей реализации определенного набора
функциональных возможностей. Применяется для управления сложностью проектируемой
системы при декомпозиции, когда система представляется в виде иерархии уровней
абстракции.
Пример уровней абстракции.
• Слой аппаратных абстракции
• Прошивка
• Язык ассемблера
• Ядро операционной системы
• Приложения
Классификация
Может есть вопросы?
20
21
Python
Переходим к практике
История 22
• Создатель Гвидо Ван Россум
• Появился после того, как Гвидо работал над учебным языком ABC в конце 80х годов
• Первую версию опубликовал в 1991 году.
• Текущая версия 3.7 ( 14 августа 2017 года)
Философия 23
• Красивое лучше, чем уродливое.
• Явное лучше, чем неявное.
• Простое лучше, чем сложное.
• Сложное лучше, чем запутанное.
• Плоское лучше, чем вложенное.
• Разреженное лучше, чем плотное.
• Читаемость имеет значение.
• Особые случаи не настолько особые, чтобы нарушать правила.
• При этом практичность важнее безупречности.
• Ошибки никогда не должны замалчиваться.
• Если не замалчиваются явно.
• Встретив двусмысленность, отбрось искушение угадать. Должен существовать один — и,
желательно, только один — очевидный способ сделать это.
• Хотя он поначалу может быть и не очевиден, если вы не голландец.
• Сейчас лучше, чем никогда.
• Хотя никогда зачастую лучше, чем прямо сейчас.
• Если реализацию сложно объяснить — идея плоха.
• Если реализацию легко объяснить — идея, возможно, хороша.
• Пространства имён — отличная штука! Будем делать их побольше!
Утиная типизация ( Duck Typing) 24
Если это выглядит как утка, плавает как утка и крякает как утка, то это, возможно, и есть утка.
Переменные 25
Переменная — это простейшая именованная структура данных, в которой может быть сохранён
промежуточный или конечный результат работы программы.
Пример:
a = 10
b = 3.1415926
c = "Hello"
d = [1, 2, 3]
Типы переменных (объектов):
• Целочисленные (int) Список (list)
• С плавающей точкой (float) Словарь (dict)
• Строки (юникод строки) (str) Множество (set)
• None
Операторы 26
Большинство предложений (логических строк) в программах содержат выражения. Простой
пример выражения: 2 + 3. Выражение можно разделить на операторы и операнды.
Операторы – это некий функционал, производящий какие-либо действия, который может быть
представлен в виде символов, как например +, или специальных зарезервированных слов.
Операторы могут производить некоторые действия над данными, и эти данные
называются операндами. В нашем случае 2 и 3 – это операнды.
Примеры операторов:
• +,-,*,/ - операторы математических действий
• >,<,<=,>=, == - операторы сравнения
• not, and, or – логические операторы
• x[индекс] – обращение по индексу
• f(аргумент, …) – вызов функции
Условные операторы 27
if test1:
state1
elif test2:
state2
else:
state3
if test1:
state1
else:
state2
if test1:
state1
Циклы 28
for i in range(0,5):
print(i * 2)
0 2 4 6 8
i = 5
while i < 15:
print(i)
i = i + 2
5 7 9 11 13
Функции 29
Фукнция - последовательность инструкций, возвращающая некое значение.
def add(x, y):
return x + y
>>> add(1, 10)
11
>>> add('abc', 'def')
'abcdef’
Анонимные функции:
>>> (lambda x, y: x + y)(1, 2)
3
>>> (lambda x, y: x + y)('a', 'b')
'ab'
Additional information
Классы и объекты 30
Класс – тип, описывающий устройство объектов.
Объект — это экземпляр класса.
Класс можно сравнить с чертежом, по которому создаются объекты.
В Python все абсолютно является объектами.
>>> class Car:
def move(self): # self - обязательный аргумент, содержащий в себе экземпляр
# класса, передающийся при вызове метода,
# поэтому этот аргумент должен присутствовать
# во всех методах класса.
return “Car is moving”
>>> my_car = Car()
>>> my_car.move()
“Car is moving”
Пример 31
Задача. Создать список студентов. Реализовать возможность выводить отсортированный по
возрастанию среднего бала список.
Выглядит не сложно
Пример 32
Описываем студента
class Student:
description = "This is shared attribute for all instances of students"
def __init__(self, name, group_id):
self.name = name
self.avg_grade = 0
self.group_id = group_id
self.marks = []
def describe(self):
print("My name is %s, I'm studing in group %d and my average_grade is %.2f»
%(self.name, self.group_id, self.avg_grade))
def get_marks(self):
for i in range(0,10):
mark = random.randint(1,10)
self.marks.append(mark)
self.recalculate_avg()
def recalculate_avg(self):
self.avg_grade=sum(x for x in self.marks)/len(self.marks)
Пример 33
Создаем студентов
NAMES = ["Olga", "Petr", "Natalia", "Fedor", "Vlad", "Maksim"]
GROUPS = [121,221]
def create_student(name, group_id):
s = Student(name,group_id)
s.get_marks()
s.describe()
return s
if __name__ == '__main__':
students = []
print ("Creating students")
while len(NAMES) >0:
name = NAMES.pop()
random_group_id = random.randint(0,1)
student = create_student(name, GROUPS[random_group_id])
students.append(student)
Пример 34
Сортируем студентов
print ("Ordered students by avg mark")
sorted_students = sorted(students,key=lambda student:student.avg_grade)
for s in sorted_students:
s.describe()
Creating students
My name is Maksim, I'm studieng in group 221 and my average_grade is 7.10
My name is Vlad, I'm studieng in group 221 and my average_grade is 6.40
My name is Fedor, I'm studieng in group 221 and my average_grade is 4.60
My name is Natalia, I'm studieng in group 121 and my average_grade is 5.50
My name is Petr, I'm studieng in group 221 and my average_grade is 6.20
My name is Olga, I'm studieng in group 121 and my average_grade is 5.10
Order students by avg mark
My name is Fedor, I'm studieng in group 221 and my average_grade is 4.60
My name is Olga, I'm studieng in group 121 and my average_grade is 5.10
My name is Natalia, I'm studieng in group 121 and my average_grade is 5.50
My name is Petr, I'm studieng in group 221 and my average_grade is 6.20
My name is Vlad, I'm studieng in group 221 and my average_grade is 6.40
My name is Maksim, I'm studieng in group 221 and my average_grade is 7.10
Вместо вывода 35
• Существует огромное количество различных языков программирования
• Язык программирования – это инструмент, который позволяет «сказать» машине, что ей
нужно сделать
• Самыми простыми для восприятия и пользования являются процедурные языки
• Многие современные языки совмещают в себе несколько парадигм программирования
• Само по себе кодирование не является сложной задачей ( на мой взгляд скоро тут человека
заменит ИИ)
• Более сложной и интересной задачей является описание сущностей, связей между ними и
построение систем.
• Написание кода это навык – пробуйте, тренируйтесь и вы сможете облегчить себе и другим
жизнь, поручив машине выполнять рутинную работу.
Спасибо
L_avakyan@wargaming.net
36

More Related Content

Программирование как способ выражения мыслей.

  • 1. Программирование как способ выражения мыслей Левон Авакян/ WoT Server Relaibility/ l_avakyan@wargaming.net Или учимся разговаривать с машиной 1
  • 2. Оглавление 2 • Как работает современный компьютер • Немного истории • Алгоритмы • Внутреннее устройство • Языки программирования • Какие бывают • Чем отличаются • Для чего используются • Python • Философия • Основные конструкции • Примеры О чем я буду говорить
  • 4. Вычислительные машины 4 Вычислительная машина, счётная машина — механизм, электромеханическое или электронное устройство, предназначенное для автоматического выполнения математических операций Они были очень давно
  • 5. Алгоритм 5 Алгоритм — набор инструкций, описывающих порядок действий исполнителя для достижения некоторого результата. Свойства алгоритма: • Дискретность • Детерминированность • Понятность • Завершаемость • Массовость • Результативность Все знают, но боятся сказать
  • 6. Машина Тьюринга 6 Машина Тьюринга — абстрактная вычислительная машина. Способна имитировать всех исполнителей, каким-либо образом реализующих процесс пошагового вычисления, в котором каждый шаг вычисления достаточно элементарен. Состоит из: • Неограниченная в обе стороны лента, разделённая на ячейки • Управляющее устройство • Головка Конкретная реализация требует: • Алфавит, включающий пустой символ • Множество состоянии головки • Правила перехода Звучит круто, может быть дело в слове «машина»
  • 8. Архитектура фон Неймана 8 Архитектура фон Неймана — широко известный принцип совместного хранения команд и данных в памяти компьютера. Звучит еще круче чем «машина Тьюринга»
  • 9. Архитектура фон Неймана 9 Основные принципы: • Принцип однородности памяти • Принцип адресности • Принцип программного управления • Принцип двоичного кодирования
  • 12. Язык программирования 12 Язык программирования — формальный язык, предназначенный для записи компьютерных программ. Язык программирования определяет набор лексических, синтактических и семантических правил, определяющих внешний вид программы и действия, которые выполнит исполнитель (обычно — ЭВМ) под её управлением. А что это?
  • 13. Парадигмы программирования 13 Императивное программирование — это парадигма программирования для которой характерно следующее: • в исходном коде программы записываются инструкции (команды); • инструкции должны выполняться последовательно; • при выполнении инструкции данные, полученные при выполнении предыдущих инструкций, могут читаться из памяти; • данные, полученные при выполнении инструкции, могут записываться в память. Декларативное программирование — это парадигма программирования, в которой задаётся спецификация решения задачи, то есть описывается, что представляет собой проблема и ожидаемый результат. Классификация
  • 14. Языки программирования 14 • Процедурное программирование • Функциональное программирование • Логическое программирование • Объектно-ориентированное программирование Классификация
  • 15. Процедурное программирование 15 Процедурное программирование — программирование на императивном языке, при котором последовательно выполняемые операторы можно собрать в подпрограммы, то есть более крупные целостные единицы кода, с помощью механизмов самого языка. Примеры: • C • Pascal Классификация
  • 16. Функциональное программирование 16 Функциональное программирование - раздел дискретной математики и парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании). Примеры: • Erlang • Hasckell Классификация
  • 17. Логическое программирование 17 Логическое программирование - парадигма программирования, основанная на автоматическом доказательстве теорем, а также раздел дискретной математики, изучающий принципы логического вывода информации на основе заданных фактов и правил вывода. Примеры: • Planner • Prolog Классификация
  • 18. Объектно-ориентированное программирование 18 Объектно-ориентированное программирование — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования Примеры: • Java • C# • C++ Классификация
  • 19. Уровень Абстракции 19 Уровень Абстракции — один из способов сокрытия деталей реализации определенного набора функциональных возможностей. Применяется для управления сложностью проектируемой системы при декомпозиции, когда система представляется в виде иерархии уровней абстракции. Пример уровней абстракции. • Слой аппаратных абстракции • Прошивка • Язык ассемблера • Ядро операционной системы • Приложения Классификация
  • 22. История 22 • Создатель Гвидо Ван Россум • Появился после того, как Гвидо работал над учебным языком ABC в конце 80х годов • Первую версию опубликовал в 1991 году. • Текущая версия 3.7 ( 14 августа 2017 года)
  • 23. Философия 23 • Красивое лучше, чем уродливое. • Явное лучше, чем неявное. • Простое лучше, чем сложное. • Сложное лучше, чем запутанное. • Плоское лучше, чем вложенное. • Разреженное лучше, чем плотное. • Читаемость имеет значение. • Особые случаи не настолько особые, чтобы нарушать правила. • При этом практичность важнее безупречности. • Ошибки никогда не должны замалчиваться. • Если не замалчиваются явно. • Встретив двусмысленность, отбрось искушение угадать. Должен существовать один — и, желательно, только один — очевидный способ сделать это. • Хотя он поначалу может быть и не очевиден, если вы не голландец. • Сейчас лучше, чем никогда. • Хотя никогда зачастую лучше, чем прямо сейчас. • Если реализацию сложно объяснить — идея плоха. • Если реализацию легко объяснить — идея, возможно, хороша. • Пространства имён — отличная штука! Будем делать их побольше!
  • 24. Утиная типизация ( Duck Typing) 24 Если это выглядит как утка, плавает как утка и крякает как утка, то это, возможно, и есть утка.
  • 25. Переменные 25 Переменная — это простейшая именованная структура данных, в которой может быть сохранён промежуточный или конечный результат работы программы. Пример: a = 10 b = 3.1415926 c = "Hello" d = [1, 2, 3] Типы переменных (объектов): • Целочисленные (int) Список (list) • С плавающей точкой (float) Словарь (dict) • Строки (юникод строки) (str) Множество (set) • None
  • 26. Операторы 26 Большинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3. Выражение можно разделить на операторы и операнды. Операторы – это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например +, или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 – это операнды. Примеры операторов: • +,-,*,/ - операторы математических действий • >,<,<=,>=, == - операторы сравнения • not, and, or – логические операторы • x[индекс] – обращение по индексу • f(аргумент, …) – вызов функции
  • 27. Условные операторы 27 if test1: state1 elif test2: state2 else: state3 if test1: state1 else: state2 if test1: state1
  • 28. Циклы 28 for i in range(0,5): print(i * 2) 0 2 4 6 8 i = 5 while i < 15: print(i) i = i + 2 5 7 9 11 13
  • 29. Функции 29 Фукнция - последовательность инструкций, возвращающая некое значение. def add(x, y): return x + y >>> add(1, 10) 11 >>> add('abc', 'def') 'abcdef’ Анонимные функции: >>> (lambda x, y: x + y)(1, 2) 3 >>> (lambda x, y: x + y)('a', 'b') 'ab' Additional information
  • 30. Классы и объекты 30 Класс – тип, описывающий устройство объектов. Объект — это экземпляр класса. Класс можно сравнить с чертежом, по которому создаются объекты. В Python все абсолютно является объектами. >>> class Car: def move(self): # self - обязательный аргумент, содержащий в себе экземпляр # класса, передающийся при вызове метода, # поэтому этот аргумент должен присутствовать # во всех методах класса. return “Car is moving” >>> my_car = Car() >>> my_car.move() “Car is moving”
  • 31. Пример 31 Задача. Создать список студентов. Реализовать возможность выводить отсортированный по возрастанию среднего бала список. Выглядит не сложно
  • 32. Пример 32 Описываем студента class Student: description = "This is shared attribute for all instances of students" def __init__(self, name, group_id): self.name = name self.avg_grade = 0 self.group_id = group_id self.marks = [] def describe(self): print("My name is %s, I'm studing in group %d and my average_grade is %.2f» %(self.name, self.group_id, self.avg_grade)) def get_marks(self): for i in range(0,10): mark = random.randint(1,10) self.marks.append(mark) self.recalculate_avg() def recalculate_avg(self): self.avg_grade=sum(x for x in self.marks)/len(self.marks)
  • 33. Пример 33 Создаем студентов NAMES = ["Olga", "Petr", "Natalia", "Fedor", "Vlad", "Maksim"] GROUPS = [121,221] def create_student(name, group_id): s = Student(name,group_id) s.get_marks() s.describe() return s if __name__ == '__main__': students = [] print ("Creating students") while len(NAMES) >0: name = NAMES.pop() random_group_id = random.randint(0,1) student = create_student(name, GROUPS[random_group_id]) students.append(student)
  • 34. Пример 34 Сортируем студентов print ("Ordered students by avg mark") sorted_students = sorted(students,key=lambda student:student.avg_grade) for s in sorted_students: s.describe() Creating students My name is Maksim, I'm studieng in group 221 and my average_grade is 7.10 My name is Vlad, I'm studieng in group 221 and my average_grade is 6.40 My name is Fedor, I'm studieng in group 221 and my average_grade is 4.60 My name is Natalia, I'm studieng in group 121 and my average_grade is 5.50 My name is Petr, I'm studieng in group 221 and my average_grade is 6.20 My name is Olga, I'm studieng in group 121 and my average_grade is 5.10 Order students by avg mark My name is Fedor, I'm studieng in group 221 and my average_grade is 4.60 My name is Olga, I'm studieng in group 121 and my average_grade is 5.10 My name is Natalia, I'm studieng in group 121 and my average_grade is 5.50 My name is Petr, I'm studieng in group 221 and my average_grade is 6.20 My name is Vlad, I'm studieng in group 221 and my average_grade is 6.40 My name is Maksim, I'm studieng in group 221 and my average_grade is 7.10
  • 35. Вместо вывода 35 • Существует огромное количество различных языков программирования • Язык программирования – это инструмент, который позволяет «сказать» машине, что ей нужно сделать • Самыми простыми для восприятия и пользования являются процедурные языки • Многие современные языки совмещают в себе несколько парадигм программирования • Само по себе кодирование не является сложной задачей ( на мой взгляд скоро тут человека заменит ИИ) • Более сложной и интересной задачей является описание сущностей, связей между ними и построение систем. • Написание кода это навык – пробуйте, тренируйтесь и вы сможете облегчить себе и другим жизнь, поручив машине выполнять рутинную работу.

Editor's Notes

  1. Машина Беббиджа. Адда Лавлейс вычисление числе Бернулли.
  2. Вычислительные алгоритмы и управляющие. Попытки формализации: рекурсивные функции, лямда исчесления, нормальный алгоритм Маркова, Машина Тьюринга 30ые годы. Тезис Чёрча — Тьюринга
  3. Конечный автомат
  4. А какое дальнейшее развитие вы видите? А как сейчас пытаются обойти ограничения модели фон Неймана
  5. Привести пример использования функционального языка на практике. Телекоммуникации, лямбда-исчесления. Нет переменных! Мы оперируем только понятием функция.
  6. Задача Энштейна
  7. Пример duck typing