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

What's hot

C++ Базовый. Занятие 12.
C++ Базовый. Занятие 12.C++ Базовый. Занятие 12.
C++ Базовый. Занятие 12.
Igor Shkulipa
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.
Igor Shkulipa
 
java 8
java 8java 8
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
Alex Ott
 
Введение в машинное обучение
Введение в машинное обучение Введение в машинное обучение
Введение в машинное обучение
Anton Anokhin
 
Основы С++ (операторы, типы данных, функции)
Основы С++ (операторы, типы данных, функции)Основы С++ (операторы, типы данных, функции)
Основы С++ (операторы, типы данных, функции)
Olga Maksimenkova
 
Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
Olexandra Dmytrenko
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.
Anton Moiseenko
 
C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.
Igor Shkulipa
 
Роман Неволин «Функциональные трюки для вашего объектно-ориентированного кода»
Роман Неволин «Функциональные трюки для вашего объектно-ориентированного кода»Роман Неволин «Функциональные трюки для вашего объектно-ориентированного кода»
Роман Неволин «Функциональные трюки для вашего объектно-ориентированного кода»
SpbDotNet Community
 
Java core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.pptJava core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.ppt
Anton Moiseenko
 

What's hot (11)

C++ Базовый. Занятие 12.
C++ Базовый. Занятие 12.C++ Базовый. Занятие 12.
C++ Базовый. Занятие 12.
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.
 
java 8
java 8java 8
java 8
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Введение в машинное обучение
Введение в машинное обучение Введение в машинное обучение
Введение в машинное обучение
 
Основы С++ (операторы, типы данных, функции)
Основы С++ (операторы, типы данных, функции)Основы С++ (операторы, типы данных, функции)
Основы С++ (операторы, типы данных, функции)
 
Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.
 
C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.
 
Роман Неволин «Функциональные трюки для вашего объектно-ориентированного кода»
Роман Неволин «Функциональные трюки для вашего объектно-ориентированного кода»Роман Неволин «Функциональные трюки для вашего объектно-ориентированного кода»
Роман Неволин «Функциональные трюки для вашего объектно-ориентированного кода»
 
Java core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.pptJava core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.ppt
 

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

пр 15.docx
пр 15.docxпр 15.docx
пр 15.docx
ssuser6d63bc1
 
прак 15.docx
прак 15.docxпрак 15.docx
прак 15.docx
ssuser6d63bc1
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в Processing
Tatiana Volkova
 
запахи кода
запахи кодазапахи кода
запахи кода
Vitaly Ruzhnikov
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструменты
Roman Dvornov
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
Igor Shkulipa
 
Декларативно функциональный стиль в PHP
Декларативно функциональный стиль в PHPДекларативно функциональный стиль в PHP
Декларативно функциональный стиль в PHP
Parallels
 
BDD
BDDBDD
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"
Sergey Nemchinsky
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
corehard_by
 
About Python
About PythonAbout Python
About Python
Yury Yurevich
 
Algorithms and programming lecture in ru
Algorithms and programming lecture in ruAlgorithms and programming lecture in ru
Algorithms and programming lecture in ru
ssuser0562f1
 
Алгоритмизация и программирование С/С++
Алгоритмизация и  программирование С/С++Алгоритмизация и  программирование С/С++
Алгоритмизация и программирование С/С++
ssuser0562f1
 
1
11
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Platonov Sergey
 
Team workflow
Team workflowTeam workflow

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

пр 15.docx
пр 15.docxпр 15.docx
пр 15.docx
 
прак 15.docx
прак 15.docxпрак 15.docx
прак 15.docx
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в Processing
 
запахи кода
запахи кодазапахи кода
запахи кода
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструменты
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
Декларативно функциональный стиль в PHP
Декларативно функциональный стиль в PHPДекларативно функциональный стиль в PHP
Декларативно функциональный стиль в PHP
 
BDD
BDDBDD
BDD
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
About Python
About PythonAbout Python
About Python
 
Algorithms and programming lecture in ru
Algorithms and programming lecture in ruAlgorithms and programming lecture in ru
Algorithms and programming lecture in ru
 
Алгоритмизация и программирование С/С++
Алгоритмизация и  программирование С/С++Алгоритмизация и  программирование С/С++
Алгоритмизация и программирование С/С++
 
1
11
1
 
лек11 7
лек11 7лек11 7
лек11 7
 
лек11 7
лек11 7лек11 7
лек11 7
 
Tdd php
Tdd phpTdd php
Tdd php
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
 
Team workflow
Team workflowTeam workflow
Team workflow
 

More from Levon Avakyan

Надежность World of Tanks Server
Надежность World of Tanks ServerНадежность World of Tanks Server
Надежность World of Tanks Server
Levon Avakyan
 
Grpahite&amp;grafana
Grpahite&amp;grafanaGrpahite&amp;grafana
Grpahite&amp;grafana
Levon Avakyan
 
World of Tanks Experience of Using Kafka
World of Tanks Experience of Using KafkaWorld of Tanks Experience of Using Kafka
World of Tanks Experience of Using Kafka
Levon Avakyan
 
SRE vs DevOps
SRE vs DevOpsSRE vs DevOps
SRE vs DevOps
Levon Avakyan
 
Wargaming Clan Platform
Wargaming Clan PlatformWargaming Clan Platform
Wargaming Clan Platform
Levon Avakyan
 
Архитектура мета игры Wargaming. Глобальная карта 2.0.
Архитектура мета игры Wargaming. Глобальная карта 2.0.Архитектура мета игры Wargaming. Глобальная карта 2.0.
Архитектура мета игры Wargaming. Глобальная карта 2.0.
Levon Avakyan
 
Осознанный выбор. Python 3 для реализации сервисного шлюза клиента World of T...
Осознанный выбор. Python 3 для реализации сервисного шлюза клиента World of T...Осознанный выбор. Python 3 для реализации сервисного шлюза клиента World of T...
Осознанный выбор. Python 3 для реализации сервисного шлюза клиента World of T...
Levon Avakyan
 
Кланы в Wargaming. От странички на танковом портале до мультиплатфермнного с...
Кланы в Wargaming. От странички на танковом портале до  мультиплатфермнного с...Кланы в Wargaming. От странички на танковом портале до  мультиплатфермнного с...
Кланы в Wargaming. От странички на танковом портале до мультиплатфермнного с...
Levon Avakyan
 
Оперирование высоко нагруженными проектами. Или "Клановые войны" каждый день
Оперирование высоко нагруженными проектами. Или "Клановые войны" каждый деньОперирование высоко нагруженными проектами. Или "Клановые войны" каждый день
Оперирование высоко нагруженными проектами. Или "Клановые войны" каждый день
Levon Avakyan
 

More from Levon Avakyan (9)

Надежность World of Tanks Server
Надежность World of Tanks ServerНадежность World of Tanks Server
Надежность World of Tanks Server
 
Grpahite&amp;grafana
Grpahite&amp;grafanaGrpahite&amp;grafana
Grpahite&amp;grafana
 
World of Tanks Experience of Using Kafka
World of Tanks Experience of Using KafkaWorld of Tanks Experience of Using Kafka
World of Tanks Experience of Using Kafka
 
SRE vs DevOps
SRE vs DevOpsSRE vs DevOps
SRE vs DevOps
 
Wargaming Clan Platform
Wargaming Clan PlatformWargaming Clan Platform
Wargaming Clan Platform
 
Архитектура мета игры Wargaming. Глобальная карта 2.0.
Архитектура мета игры Wargaming. Глобальная карта 2.0.Архитектура мета игры Wargaming. Глобальная карта 2.0.
Архитектура мета игры Wargaming. Глобальная карта 2.0.
 
Осознанный выбор. Python 3 для реализации сервисного шлюза клиента World of T...
Осознанный выбор. Python 3 для реализации сервисного шлюза клиента World of T...Осознанный выбор. Python 3 для реализации сервисного шлюза клиента World of T...
Осознанный выбор. Python 3 для реализации сервисного шлюза клиента World of T...
 
Кланы в Wargaming. От странички на танковом портале до мультиплатфермнного с...
Кланы в Wargaming. От странички на танковом портале до  мультиплатфермнного с...Кланы в Wargaming. От странички на танковом портале до  мультиплатфермнного с...
Кланы в Wargaming. От странички на танковом портале до мультиплатфермнного с...
 
Оперирование высоко нагруженными проектами. Или "Клановые войны" каждый день
Оперирование высоко нагруженными проектами. Или "Клановые войны" каждый деньОперирование высоко нагруженными проектами. Или "Клановые войны" каждый день
Оперирование высоко нагруженными проектами. Или "Клановые войны" каждый день
 

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

  • 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