WEB-ПРОГРАММИРОВАНИЕ
Лекция #5. Введение в язык программирования Python 3
Омский государственный университет им. Ф. М. Достоевского
Факультет компьютерных наук
Яковенко К. С
2
Python
высокоуровневый язык программирования общего назначения,
ориентированный на повышение производительности
разработчика и читаемости кода.
Поддерживаются несколько парадигм программирования:
процедурное программирование
объектно-ориентированное
и в меньшей степени функциональное.
3
Компании использующие Python
и многие другие
4
История развития
языка программирования Python
Python 1.0 - январь 1994
– Python 1.5 - 31 декабря 1997
– Python 1.6 - 5 сентября 2000
Python 2.0 - 16 октября 2000
– Python 2.1 - 17 апреля 2001
– Python 2.2 - 21 декабря 2001
– Python 2.3 - 29 июля 2003
– Python 2.4 - 30 ноября 2004
– Python 2.5 - 19 сентября 2006
– Python 2.6 - 1 октября 2008
– Python 2.7- 3 июля 2010
Python 3.0 - 3 декабря 2008
— Python 3.1 - 27 июня 2009
— Python 3.2 - 20 февраля 2011
— Python 3.3 - 29 сентября 2012
— Python 3.4 - 16 марта 2014
5
PEP (Python Enhancement Proposal)
— специально разработанный документ, содержащий
информацию для сообщества Python или описание
новой функции языка, его процессов или окружающей
среды.
PEP документ должен содержать краткое описание
технических особенностей и обоснование выбора
вводимой функции.
Самый известный PEP8: Style Guide for Python Code
6
Основы языка
Типы данных
Арифметические и логические операции
Управляющие структуры
ООП
Обработка исключений
Генераторы и декораторы
7
Типы данных:
Представление чисел
Целочисленные типы
– int(x, base=10) – целые числа
– bool([x]) – логические значения
Типы чисел с плавающей точкой
– float([x]) – числа с плавающей точкой двойной точности
– complex([real[, imag]]) – комплексные числа
– decimal.Decimal(value="0", context=None) – числа
фиксированной точности
8
Представление чисел (примеры)
Целые числа:
>>> 14600926, 0b110111101,
0o67545336, 0xDECADE
(14600926, 445, 14600926, 14600926)
>>> int(14600926), int('14600926'),
int('67545336', 8)
(14600926, 14600926, 14600926)
>>> int('DECADE', 16), int('110111101', 2),
bool(14600926), bool()
(14600926, 445, True, False)
Числа с плавающей точкой:
>>> 0.0, 5.4, -2.5, 8.9e-4
(0.0, 5.4,-2.5, 0.00089)
>>> -89.5+2.125j, complex(-89.5, 2.125)
((-89.5+2.125j), (-89.5+2.125j))
>>> import decimal
>>>decimal.Decimal('54321.0123456789
87654321')
Decimal('54321.012345678987654321')
9
Типы данных: Строки
последовательность символов с произвольным доступом
str(object='')
>>> text = """Строки в тройных кавычках могут включать 'апострофы' и
"кавычки" без лишних формальностей. Мы можем даже экранировать
символ перевода строки  благодаря чему данная конкретная строка
будет занимать всего две строки."""
>>> a = "Здесь 'апострофы' можно не экранировать, а "кавычки"
придется."
>>> b = 'Здесь 'апострофы' придется экранировать, а "кавычки" не
обязательно.'
10
Unicode
Все строки в Python 3 по умолчанию задаются
в Unicode символах.
str(object=b'', encoding='utf-8', errors='strict')
В Python 2 используется функция
unicode(object[, encoding[, errors]])
или спецификатор u перед строкой.
>>> unicode("Привет","UTF-8")
u'u041fu0440u0438u0432u0435u0442'
>>> u'Привет'
u'u041fu0440u0438u0432u0435u0442'
11
Операции над строками
Операторы сравнения <, <=, ==, !=, > и >=.
Срезы строк, с помощью оператора доступа [ ]
seq[start] – извлекает символ
seq[start:end] – извлекает подстроку
seq[start:end:step] – извлекает последовательность символов
с шагом step
Строковые методы
.join .split .startswith .endswith .replace и т.д.
Функции и операторы для работы с итерируемыми
объектами (рассматриваются ниже)
12
Форматирование строк
str.format(*args,**kwargs)
возвращает новую строку, замещая поля в контекстной строке
соответствующими аргументами.
Формат полей:
{field_name}
{field_name!conversion}
{field_name:format_specification}
{field_name!conversion:format_specification}
Порядковый номер или
имя аргумента
Тип формы представления:
строковая (а) или
репрезентативная (r)
Спецификатор формата для
чисел и последовательностей
Спецификатор формата задается собственным мини-языком (подробнее почитать здесь)
13
Примеры работы со строками
Вставка подстроки в строку:
s = 'The waxwork man'
s = s[:12] + 'wo' + s[12:] # результат 'The waxwork woman'
Инвертирование строки
s = s[::-1] # результат 'namow krowxaw ehT'
Замена подстроки
s = s.replace('woman','man') # результат 'The waxwork man'
Разбиение на слова
s = s.split('') # результат ['The','waxwork','man']
Форматирование
'{who} turned {0} this year'.format(88, who="She")
# результат 'She turned 88 this year'
14
Типы данных: Последовательности
В языке Python имеется пять встроенных типов
последовательностей:
list, bytearray, bytes, str, tuple
Это одни из типов данных, поддерживающих оператор
проверки на вхождение (in), функцию определения
размера (len()), оператор извлечения срезов ([]) и
возможность выполнения итераций.
15
Типы данных: Множества
— неупорядоченная коллекция из нуля или более ссылок
указывающих на хешируемые объекты.
class set([iterable]) class frozenset([iterable])
Хешируемые объекты имеют специальный метод __hash__(), на
протяжении всего жизненного цикла объекта всегда
возвращающий одно и то же значение, которые могут участвовать
в операциях сравнения на равенство.
16
Типы данных: Словари
— неупорядоченная коллекция из нуля или более пар «ключ-
значение», в которых в качестве ключей могут использоваться
ссылки на хешируемые объекты, а в качестве значений – ссылки на
объекты любого типа.
class dict(**kwargs)
class dict(mapping, **kwargs)
class dict(iterable, **kwargs)
>>> d = {"root": 18, "blue": [75, "R", 2], 21: "venus", -14: None,
… "mars": "rover", (4, 11): 18, 0: 45}
>>> d[21] = 'Hello World!'
>>> d[21]
'Hello World!'
17
Типы данных: Ссылки
В языке Python нет переменных как таковых – вместо них
используются ссылки на объекты.
objectReference = value
a = 7 a 7
a = 7
b = a
a 7
b
a = 7
b = a
a = “Liberty”
a 7
b “Liberty”
— object references
— object in memory
18
Арифметические и логические
операторы
●
Оператор идентичности is, is not
●
Операторы сравнения <, <=, ==, !=, >=, >
●
Оператор членства in, not in
●
Логические операторы and, or и not.
●
Простые арифметические операторы +, -, *, /
●
Комбинированные операторы присваивания +=, -=, *=, /=
19
Условное ветвление
Общая схема условной инструкции
if boolean_expression1:
suite1
elif boolean_expression2:
suite2
…
elif boolean_expressionN:
suiteN
else:
else_suite
Условное выражение:
expression1 if boolean_expression else expression2
20
Циклы
Существует только цикл с предусловием:
while boolean_expression:
while_suite
else:
else_suite
Цикл обхода итерируемого множества
for expression in iterable:
for_suite
else:
else_suite
Цикл for в Python и С++ или Java не являются
эквивалентными конструкциями.
21
Обработка исключений
try:
try_suite
except exception_group1 as variable1:
except_suite1
except exception_groupN as variableN:
except_suiteN
else:
else_suite
finally:
finally_suite
Порождение исключений:
raise exception(args)
raise
22
Если этого не достаточно, можно создать собственное:
class exceptionName(baseException): pass
baseException – либо класс Exception, либо его потомок.
object
BaseException
Exception
ArithmeticError
Exception
EnvironmentError EOFError LookupError ValueError
IOError OSError IndexError KeyError
Встроенные исключения
23
Функции
Глобальные и локальные функции:
def functionName(parameters):
suite
return value
Лямбда-функции:
lambda parameters: expression
24
Функции: примеры использования
Площадь треугольника по формуле Герона:
import math
def heron(a, b, c, unit='meters'):
s = (a + b + c) / 2.0
area = math.sqrt(s * (s - a) * (s - b) * (s - c))
return '{0} {1}'.format(area, unit)
heron(25, 24, 7) # вернет '84.0 meters'
heron(25, 24) # породит исключение TypeError
heron(25, c=7, b=24, unit='sm') # вернет '84.0 sm'
heron(*[25, 24, 7], unit='mm') # вернет '84.0 mm'
25
Генераторы
Функции-генераторы
def generator(parameters):
suite
yield value
suite
Генераторы списков
[expression for item in iterable if condition]
Генераторы словарей
{keyexpression: valueexpression for key, value in iterable if condition}
Декораторы функций и методов
Декоратор - это функция, которая принимает функцию или метод в качестве
единственного аргумента и возвращает новую функцию или метод,
включающую декорированную функцию или метод, с дополнительными
функциональными возможностями.
def positive_result(function):
def wrapper(*args, **kwargs):
result = function(*args, **kwargs)
assert result >= 0, function.__name__ + "() result isn't >= 0"
return result
return wrapper
@positive_result
def discriminant(a, b, c):
return (b ** 2) - (4 * a * c)
discriminant(1, 8, 7) # вывод 36
discriminant(5, 6, 7) # исключение AssertionError: discriminant() result isn't >= 0
27
Объектно-ориентированная концепция
Абсолютно все в Python является объектом, унаследованым
от базового класса object.
Классы в Python поддерживают:
Методы, свойства и атрибуты
Множественное наследование и специализацию классов
Полиморфизм
Используется механизм утиной типизации
Классы в Python не поддерживают:
Перегрузку методов
Управление доступом к данным
28
Классы
Синтаксис опрделения
class className(base_classes):
suite
class className(object):
classAttr = value
def __new__(cls, *args, **kwargs):
suite
def __init__(self, *args, **kwargs):
suite
def __del__(self):
suite
Инициализация объекта
classInstance = className(parameters)
del classInstance
конструктор
деструктор без гарантии вызова
29
Классы: использование свойств
Свойство – это элемент данных объекта, доступ к которым
оформляется как доступ к переменной экземпляра, но само
обращение неявно обслуживается встроенными методами.
class A(object):
def __init__(self):
self._x = None
@property
def x(self):
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
30
Классы: вызов родительских методов
осуществляется с помощью функции
super([type[, object-or-type]])
class A(object): pass
class B(object): pass
class C(B,A):
def __init__(self, *args, **kwargs):
# self.__class__.__mro__ = [C, B, A, objects]
super().__init__(*args, **kwargs)
# super(C, self).__init__() => B.__init__(self)
# super(B, self).__init__() => A.__init__(self)
# super(A, self).__init__() => object.__init__(self)
Вычисление метода строится на основе
алгоритма определения порядка
разрешения методов MRO C3
31
Модули и пакеты
Модуль в Python – это обычный файл с расширением .ру
Импортирование модулей:
import importable
import importablel, importable2, …, importableN
import importable as preferred_name
Пакет – это простой каталог, содержащий множество модулей
и файл с именем __init__ .ру.
Импортирование из моделуй и пакетов:
from importable import object as preferred_name
from importable import object1, object2, …, objectN
from importable import (object1, object2, object3, …, objectN)
from importable import *
32
Обзор стандартной библиотеки
string – содержит ряд полезных констант и классов для
обработки строк
re – модуль для использования регулярных выражений
optparse, getopt – работа с аргументами командной строки
math, cmath, random – математические библиотеки
calendar, datetime, time – работа с датой и временем
os – платформо независимый доступ к средствам ОС
shutil – высокоуровневые функции для работы с каталогами и
файлами
и еще составе свыше 200 пакетов и модулей.
33
Сильные стороны Python
Удобный в разработке
– высокая скорость разработки
– простой синтаксис
– набор мощных встроенных инструментов
Свободная лицензия
Кросплатформенность
Легко интегрируемый с другими ЯП/платформами
The Zen of Python, by Tim Peters
import this
34
Ограничения Python
Отсутствие типизации
Скорость исполнения кода
GIL – Global Interpreter Lock
35
Яковенко Кирилл Сергеевич
kirill.yakovenko@gmail.com
Омский государственный университет им. Ф. М. Достоевского
Факультет компьютерных наук

Лекция #5. Введение в язык программирования Python 3

  • 1.
    WEB-ПРОГРАММИРОВАНИЕ Лекция #5. Введениев язык программирования Python 3 Омский государственный университет им. Ф. М. Достоевского Факультет компьютерных наук Яковенко К. С
  • 2.
    2 Python высокоуровневый язык программированияобщего назначения, ориентированный на повышение производительности разработчика и читаемости кода. Поддерживаются несколько парадигм программирования: процедурное программирование объектно-ориентированное и в меньшей степени функциональное.
  • 3.
  • 4.
    4 История развития языка программированияPython Python 1.0 - январь 1994 – Python 1.5 - 31 декабря 1997 – Python 1.6 - 5 сентября 2000 Python 2.0 - 16 октября 2000 – Python 2.1 - 17 апреля 2001 – Python 2.2 - 21 декабря 2001 – Python 2.3 - 29 июля 2003 – Python 2.4 - 30 ноября 2004 – Python 2.5 - 19 сентября 2006 – Python 2.6 - 1 октября 2008 – Python 2.7- 3 июля 2010 Python 3.0 - 3 декабря 2008 — Python 3.1 - 27 июня 2009 — Python 3.2 - 20 февраля 2011 — Python 3.3 - 29 сентября 2012 — Python 3.4 - 16 марта 2014
  • 5.
    5 PEP (Python EnhancementProposal) — специально разработанный документ, содержащий информацию для сообщества Python или описание новой функции языка, его процессов или окружающей среды. PEP документ должен содержать краткое описание технических особенностей и обоснование выбора вводимой функции. Самый известный PEP8: Style Guide for Python Code
  • 6.
    6 Основы языка Типы данных Арифметическиеи логические операции Управляющие структуры ООП Обработка исключений Генераторы и декораторы
  • 7.
    7 Типы данных: Представление чисел Целочисленныетипы – int(x, base=10) – целые числа – bool([x]) – логические значения Типы чисел с плавающей точкой – float([x]) – числа с плавающей точкой двойной точности – complex([real[, imag]]) – комплексные числа – decimal.Decimal(value="0", context=None) – числа фиксированной точности
  • 8.
    8 Представление чисел (примеры) Целыечисла: >>> 14600926, 0b110111101, 0o67545336, 0xDECADE (14600926, 445, 14600926, 14600926) >>> int(14600926), int('14600926'), int('67545336', 8) (14600926, 14600926, 14600926) >>> int('DECADE', 16), int('110111101', 2), bool(14600926), bool() (14600926, 445, True, False) Числа с плавающей точкой: >>> 0.0, 5.4, -2.5, 8.9e-4 (0.0, 5.4,-2.5, 0.00089) >>> -89.5+2.125j, complex(-89.5, 2.125) ((-89.5+2.125j), (-89.5+2.125j)) >>> import decimal >>>decimal.Decimal('54321.0123456789 87654321') Decimal('54321.012345678987654321')
  • 9.
    9 Типы данных: Строки последовательностьсимволов с произвольным доступом str(object='') >>> text = """Строки в тройных кавычках могут включать 'апострофы' и "кавычки" без лишних формальностей. Мы можем даже экранировать символ перевода строки благодаря чему данная конкретная строка будет занимать всего две строки.""" >>> a = "Здесь 'апострофы' можно не экранировать, а "кавычки" придется." >>> b = 'Здесь 'апострофы' придется экранировать, а "кавычки" не обязательно.'
  • 10.
    10 Unicode Все строки вPython 3 по умолчанию задаются в Unicode символах. str(object=b'', encoding='utf-8', errors='strict') В Python 2 используется функция unicode(object[, encoding[, errors]]) или спецификатор u перед строкой. >>> unicode("Привет","UTF-8") u'u041fu0440u0438u0432u0435u0442' >>> u'Привет' u'u041fu0440u0438u0432u0435u0442'
  • 11.
    11 Операции над строками Операторысравнения <, <=, ==, !=, > и >=. Срезы строк, с помощью оператора доступа [ ] seq[start] – извлекает символ seq[start:end] – извлекает подстроку seq[start:end:step] – извлекает последовательность символов с шагом step Строковые методы .join .split .startswith .endswith .replace и т.д. Функции и операторы для работы с итерируемыми объектами (рассматриваются ниже)
  • 12.
    12 Форматирование строк str.format(*args,**kwargs) возвращает новуюстроку, замещая поля в контекстной строке соответствующими аргументами. Формат полей: {field_name} {field_name!conversion} {field_name:format_specification} {field_name!conversion:format_specification} Порядковый номер или имя аргумента Тип формы представления: строковая (а) или репрезентативная (r) Спецификатор формата для чисел и последовательностей Спецификатор формата задается собственным мини-языком (подробнее почитать здесь)
  • 13.
    13 Примеры работы состроками Вставка подстроки в строку: s = 'The waxwork man' s = s[:12] + 'wo' + s[12:] # результат 'The waxwork woman' Инвертирование строки s = s[::-1] # результат 'namow krowxaw ehT' Замена подстроки s = s.replace('woman','man') # результат 'The waxwork man' Разбиение на слова s = s.split('') # результат ['The','waxwork','man'] Форматирование '{who} turned {0} this year'.format(88, who="She") # результат 'She turned 88 this year'
  • 14.
    14 Типы данных: Последовательности Вязыке Python имеется пять встроенных типов последовательностей: list, bytearray, bytes, str, tuple Это одни из типов данных, поддерживающих оператор проверки на вхождение (in), функцию определения размера (len()), оператор извлечения срезов ([]) и возможность выполнения итераций.
  • 15.
    15 Типы данных: Множества —неупорядоченная коллекция из нуля или более ссылок указывающих на хешируемые объекты. class set([iterable]) class frozenset([iterable]) Хешируемые объекты имеют специальный метод __hash__(), на протяжении всего жизненного цикла объекта всегда возвращающий одно и то же значение, которые могут участвовать в операциях сравнения на равенство.
  • 16.
    16 Типы данных: Словари —неупорядоченная коллекция из нуля или более пар «ключ- значение», в которых в качестве ключей могут использоваться ссылки на хешируемые объекты, а в качестве значений – ссылки на объекты любого типа. class dict(**kwargs) class dict(mapping, **kwargs) class dict(iterable, **kwargs) >>> d = {"root": 18, "blue": [75, "R", 2], 21: "venus", -14: None, … "mars": "rover", (4, 11): 18, 0: 45} >>> d[21] = 'Hello World!' >>> d[21] 'Hello World!'
  • 17.
    17 Типы данных: Ссылки Вязыке Python нет переменных как таковых – вместо них используются ссылки на объекты. objectReference = value a = 7 a 7 a = 7 b = a a 7 b a = 7 b = a a = “Liberty” a 7 b “Liberty” — object references — object in memory
  • 18.
    18 Арифметические и логические операторы ● Операторидентичности is, is not ● Операторы сравнения <, <=, ==, !=, >=, > ● Оператор членства in, not in ● Логические операторы and, or и not. ● Простые арифметические операторы +, -, *, / ● Комбинированные операторы присваивания +=, -=, *=, /=
  • 19.
    19 Условное ветвление Общая схемаусловной инструкции if boolean_expression1: suite1 elif boolean_expression2: suite2 … elif boolean_expressionN: suiteN else: else_suite Условное выражение: expression1 if boolean_expression else expression2
  • 20.
    20 Циклы Существует только циклс предусловием: while boolean_expression: while_suite else: else_suite Цикл обхода итерируемого множества for expression in iterable: for_suite else: else_suite Цикл for в Python и С++ или Java не являются эквивалентными конструкциями.
  • 21.
    21 Обработка исключений try: try_suite except exception_group1as variable1: except_suite1 except exception_groupN as variableN: except_suiteN else: else_suite finally: finally_suite Порождение исключений: raise exception(args) raise
  • 22.
    22 Если этого недостаточно, можно создать собственное: class exceptionName(baseException): pass baseException – либо класс Exception, либо его потомок. object BaseException Exception ArithmeticError Exception EnvironmentError EOFError LookupError ValueError IOError OSError IndexError KeyError Встроенные исключения
  • 23.
    23 Функции Глобальные и локальныефункции: def functionName(parameters): suite return value Лямбда-функции: lambda parameters: expression
  • 24.
    24 Функции: примеры использования Площадьтреугольника по формуле Герона: import math def heron(a, b, c, unit='meters'): s = (a + b + c) / 2.0 area = math.sqrt(s * (s - a) * (s - b) * (s - c)) return '{0} {1}'.format(area, unit) heron(25, 24, 7) # вернет '84.0 meters' heron(25, 24) # породит исключение TypeError heron(25, c=7, b=24, unit='sm') # вернет '84.0 sm' heron(*[25, 24, 7], unit='mm') # вернет '84.0 mm'
  • 25.
    25 Генераторы Функции-генераторы def generator(parameters): suite yield value suite Генераторысписков [expression for item in iterable if condition] Генераторы словарей {keyexpression: valueexpression for key, value in iterable if condition}
  • 26.
    Декораторы функций иметодов Декоратор - это функция, которая принимает функцию или метод в качестве единственного аргумента и возвращает новую функцию или метод, включающую декорированную функцию или метод, с дополнительными функциональными возможностями. def positive_result(function): def wrapper(*args, **kwargs): result = function(*args, **kwargs) assert result >= 0, function.__name__ + "() result isn't >= 0" return result return wrapper @positive_result def discriminant(a, b, c): return (b ** 2) - (4 * a * c) discriminant(1, 8, 7) # вывод 36 discriminant(5, 6, 7) # исключение AssertionError: discriminant() result isn't >= 0
  • 27.
    27 Объектно-ориентированная концепция Абсолютно всев Python является объектом, унаследованым от базового класса object. Классы в Python поддерживают: Методы, свойства и атрибуты Множественное наследование и специализацию классов Полиморфизм Используется механизм утиной типизации Классы в Python не поддерживают: Перегрузку методов Управление доступом к данным
  • 28.
    28 Классы Синтаксис опрделения class className(base_classes): suite classclassName(object): classAttr = value def __new__(cls, *args, **kwargs): suite def __init__(self, *args, **kwargs): suite def __del__(self): suite Инициализация объекта classInstance = className(parameters) del classInstance конструктор деструктор без гарантии вызова
  • 29.
    29 Классы: использование свойств Свойство– это элемент данных объекта, доступ к которым оформляется как доступ к переменной экземпляра, но само обращение неявно обслуживается встроенными методами. class A(object): def __init__(self): self._x = None @property def x(self): return self._x @x.setter def x(self, value): self._x = value @x.deleter def x(self): del self._x
  • 30.
    30 Классы: вызов родительскихметодов осуществляется с помощью функции super([type[, object-or-type]]) class A(object): pass class B(object): pass class C(B,A): def __init__(self, *args, **kwargs): # self.__class__.__mro__ = [C, B, A, objects] super().__init__(*args, **kwargs) # super(C, self).__init__() => B.__init__(self) # super(B, self).__init__() => A.__init__(self) # super(A, self).__init__() => object.__init__(self) Вычисление метода строится на основе алгоритма определения порядка разрешения методов MRO C3
  • 31.
    31 Модули и пакеты Модульв Python – это обычный файл с расширением .ру Импортирование модулей: import importable import importablel, importable2, …, importableN import importable as preferred_name Пакет – это простой каталог, содержащий множество модулей и файл с именем __init__ .ру. Импортирование из моделуй и пакетов: from importable import object as preferred_name from importable import object1, object2, …, objectN from importable import (object1, object2, object3, …, objectN) from importable import *
  • 32.
    32 Обзор стандартной библиотеки string– содержит ряд полезных констант и классов для обработки строк re – модуль для использования регулярных выражений optparse, getopt – работа с аргументами командной строки math, cmath, random – математические библиотеки calendar, datetime, time – работа с датой и временем os – платформо независимый доступ к средствам ОС shutil – высокоуровневые функции для работы с каталогами и файлами и еще составе свыше 200 пакетов и модулей.
  • 33.
    33 Сильные стороны Python Удобныйв разработке – высокая скорость разработки – простой синтаксис – набор мощных встроенных инструментов Свободная лицензия Кросплатформенность Легко интегрируемый с другими ЯП/платформами The Zen of Python, by Tim Peters import this
  • 34.
    34 Ограничения Python Отсутствие типизации Скоростьисполнения кода GIL – Global Interpreter Lock
  • 35.
    35 Яковенко Кирилл Сергеевич kirill.yakovenko@gmail.com Омскийгосударственный университет им. Ф. М. Достоевского Факультет компьютерных наук