Лекция 1. Лекция python и его место среди языков программирования
Скачать 1.35 Mb.
|
ЛЕКЦИЯ Python и его место среди языков программирования Запуск Python программ Python • Python - интерпретируемый, объектно-ориентированный высокоуровневый язык программирования с динамической семантикой. • Встроенные высокоуровневые структуры данных в сочетании с динамической типизацией и связыванием делают язык привлекательным для быстрой разработки приложений. Кроме того, его можно использовать в качестве сценарного языка для связи программных компонентов. • Синтаксис Python прост в изучении, в нем придается особое значение читаемости кода, а это сокращает затраты на сопровождение программных продуктов. • Python поддерживает модули и пакеты, поощряя модульность и повторное использование кода. • Интерпретатор Python и большая стандартная библиотека доступны бесплатно в виде исходных и исполняемых кодов для всех основных платформ и могут свободно распространяться. • https://www.python.org/ Ресурсы в сети Internet Официальный сайт языка Python https://www.python.org/ Здесь находятся: • Официальная документация по языку и стандартной библиотеке отличный справочный материал, не столько для изучения, скорее для поиска ответа на любой вопрос • Документы PEP (Python Enhancement Proposals) фактически это изложение стандарта языка • Инсталляционные пакеты для Windows, Mac OS X и Linux Версии языка Python Версия 1 уже давно не используется Версия 2 Все еще используется в ряде проектов, но официально не поддерживается с 2020 года, рекомендуется использовать 3-ю версию Версия 3, изменения: • Эффективная работа с большими объемами данных • Строгая реализация работы с Unicode Последовательности байт выделены в отдельный тип данных • инструкция print заменена функцией print() Увеличена гибкость операции вывода на консоль В версию 2 введен модуль future для обеспечения обратной совместимости История • Создание Python было начато Гвидо ван Россумом (Guido van Rossum) в 1991 году, когда он работал над распределенной ОС Амеба. Ему требовался расширяемый язык, который бы обеспечил поддержку системных вызовов. За основу были взяты ABC и Модула-3. • В качестве названия он выбрал Python в честь комедийных серий BBC "Летающий цирк Монти-Пайтона", а вовсе не по названию змеи. Python это открытое программное обеспечение • Интерпретатор Собственная лицензия, совместимая с GPL Нет ограничений на интеграцию с коммерческими продуктами. Сделанные изменения не обязательно должны иметь открытую лицензию • Программы Реализация программы, как интерпретируемого текста препятствует ее "закрытию" Есть возможность распространения программ в виде байт-кода или в виде монолитного исполняемого файла, однако такой подход встречается достаточно редко • Открытое и бесплатное программное обеспечение это не одно и то же Почему Python ? • Используется в CERN наличие стандартных библиотек, ориентированных на научные вычисления комплексный тип данных, как один из базовых числовых типов • Используется в Google Google App Engine решение ряда внутренних инженерных задач • Фактический стандарт интерпретируемого языка программирования в Linux, постепенно заменяет собой Perl • Высокая производительность труда программиста • Программы [почти] независимы от платформы исполнения • Один из наиболее востребованных на рынке труда интерпретируемый язык программирования Недостатки Python • медленнее чем C/C++ • распараллеливание программ сильно затруднено параллельные процессы достаточно эффективны мультитредовые приложения ограничены GIL (Global Interpreter Lock) • много возможностей, необходимость самодисциплины • часть ошибок выявляется только на этапе исполнения, это общий недостаток интерпретируемых языков юнит-тестирование приобретает особую важность непрерывная интеграция позволяет обнаруживать ошибки на ранних этапах разработки Среда разработки • Любой текстовый редактор • PyCharm от JetBrains https://www.jetbrains.com/pycharm/ бесплатно по почте в зоне edu.ru https://www.jetbrains.com/student/ Терминология • Программа на Питоне это последовательность инструкций • Инструкция это инструкция управления, например цикл или условие инструкция присваивания: переменная = выражение одиночное выражение записанное в строке текста программы, в том числе элементарное выражение • Оператор - символ операции допустимой в выражении. • Вызов функции является оператором • Выражение это последовательность операндов соединенных операторами. Выражение не может содержать инструкций. • Операнд это выражение, в том числе элементарное выражение • Элементарное выражение это литерал или переменная • Литерал это буквальная запись данных, например число или строка • Следует различать строку текста программы (line) и строку-литерал (string) Особенности синтаксиса и терминологии • Строка текста программы это инструкция • Отступы это часть синтаксиса • Составная конструкция языка состоит из заголовка и блока Заголовок это строка, завершающаяся двоеточием Блок это последовательность строк, отступ которых на единицу больше, чем у строки-заголовка if apples > pears: eat_apples(apples - pears) print('We ate extra apples') get_more_fruits() • Массив это list, неизменяемый массив это tuple (кортеж) • Хеш или map (ассоциативный массив) это dict (словарь) • Язык поддерживает тип данных set (множество) к которому применимы теоретико-множественные операции Функция print() • Начиная с версии 3 в языке Python инструкция print заменена функцией print() • Большинство объектов имеют свойство "быть напечатанным", то есть быть преобразованным в текстовую строку • Функция print() воспринимает любое количество аргументов и "печатает" их последовательно в стандартный вывод разделяя пробелом и завершая символом новой строки • Именованные аргументы позволяют настроить поведение функции print() аргумент sep позволяет заменить разделитель аргумент end позволяет заменить конец строки аргумент file позволяет направить вывод в файл Пример замены разделителя: print(1, 2, 3) # => 1 2 3 print(1, 2, 3, sep='->') # => 1->2->3 Литерал строки • Литерал строки это последовательность символов, заключенных в одинарные или двойные кавычки • Литералы в одинарных кавычках и литералы в двойных кавычках эквивалентны и интерпретируются одинаково • Литералы ограниченные тремя символами кавычек могут занимать несколько строк текста программы, при этом символы переноса строки входят в состав литерала как символ \n (10) • Внутри строк интерпретируются C Esc-последовательности • Переменные внутри строк не интерпретируются. • Для "внедрения" в строку значения переменной существует оператор % и синтаксис аналогичный функции printf() языка C Пример: s = '%2d часов\t%02d минут' % (16, 30) print(s) Комментарии Символ комментария #. • Сам символ и все символы справа от него и до конца строки игнорируются • Для комментирования большого фрагмента текста можно использовать строки в тройных кавычках • Строка это элементарное выражение, а выражение это инструкция, то есть синтаксически корректная конструкция Примеры: a = 1 a = a * 2 # здесь a увеличивается вдвое a = a * 2 # здесь a увеличивается вдвое еще раз a = a * 2 # и еще раз """ a = a * 2 # и еще раз a = a * 2 # и еще раз a = a * 2 # и еще раз """ # После всех вычислений переменная a примет значение 8 Объект Объект это композитная конструкция включающая в себя именованные элементы • Элементы в составе объекта называют атрибутами • Атрибуты могут быть объектами, функциями или данными элементарных типов • Для атрибутов-функций введен специальный термин метод • Для обращения к атрибуту (методу) используется оператор точка a.data = a.add(2) Метод имеет доступ к атрибутам и методам своего объекта используя аргумент self result = self.data + value Тип объекта хранится внутри объекта, атрибут __class__ Объекты, классы типы • Почти все, что есть в языке Питон это объекты • Объект это воплощение (конкретная реализация) класса • Kласс это набор свойств, передаваемый объекту при его создании В Питоне тип объекта и его класс фактически синонимы Создавая новый класс мы вводим новый тип данных с именем созданного класса Встроенные в язык типы данных и типы данных введенные стандартной библиотекой реализованы соответствующими классами • Класс это тоже объект (!), атрибут объекта __class__ это ссылка на объект, являющийся его классом • Питон поддерживает как процедурный, так и объектно- ориентированный стили программирования • Внутри интерпретатора программа представлена в виде ориентированного графа, исполнение программы это обход графа Три фундаментальных конструкции В основе реализации языка Python лежат три фундаментальных конструкции: Присваивание Присваивание это придание имени объекту. Присваивание является реализацией целого ряда операций языка. Обращение к атрибуту Обращение к атрибуту это возможность получить доступ к отдельной части составного объекта Выражение Важно понимать как и из чего можно составить выражение, как выражение вычисляется, и где выражение можно использовать Знание этих конструкций критически важно для понимания языка Файл, модуль, объект • Файл с текстом программы на Питоне называют модулем • Файл переданный интерпретатору для исполнения называют главным модулем. Имя главного модуля __main__ • Модуль это объект. Определенные в модуле глобальные переменные это его атрибуты, а функции это его методы. Имена функций также являются глобальными переменными. • При использовании конструкции вида from math import sin, cos, tan в текущем модуле создаются глобальные переменные sin, cos и tan, которые ссылаются на соответствующие функции из модуля math • Строго говоря, "глобальная" переменная это переменная уровня модуля. Получить доступ к такой переменной можно только явным использованием импорта. ЛЕКЦИЯ Типы данных и операции в языке Python Строки, байты и байтовые массивы Свойства типа данных Объект имеющий определенный тип обладает набором свойств. Часто для простоты говорят тип данных имеет свойство. Свойства объектов: • свойство быть изменяемым (mutable) или неизменяемым (immutable) • свойство быть перечислимым (enumerable), также используется термин "итерируемый тип" • свойство быть упорядоченным (sequence) или, другими словами, свойство быть последовательностью последовательность это итерируемый тип, дополнительно обладающий свойством упорядоченности Категории типов данных Встроенные типы данных • Встроенные типы данных не нужно импортировать явно • Среди встроенных типов данных есть как простые, так и композитные Типы данных определяемые пользователем (user-defined) • Класс созданный программистом становится типом данных для производимых от него объектов • Вместе с интерпретатором поставляется стандартная библиотека языка Типы данных включенные в стандартную библиотеку можно рассматривать как типы данных определенные пользователем Встроенные типы данных Простые типы данных • Числа • Логический тип bool со значениями True и False • Тип NoneType имеющий единственное значение None None используется как индикатор отсутствия информации. Аналогичен указателю NULL в языке C. • Композитные типы данных Композитные типы данных • Коллекции это композитные типы, которые можно рассматривать как совокупность объектов • Последовательности символов или байт Строки (неизменяемые последовательности символов) Байты (неизменяемые последовательности байт) Байтовые массивы (изменяемые последовательности байт) Все элементы последовательности символов или байт имеют один и тот же тип • Другие встроенные коллекции Списки (в других языках это массивы), литерал [ ] Кортежи (неизменяемые списки), литерал ( ) Словари и множества (в других языках словарь это ассоциативный массив, хэш или map), литерал { } Списки, кортежи, словари и множества могут содержать элементы разных типов Объекты имеющие тип класса созданного пользователем также могут быть коллекциями Литералы • Литерал это "буквальная" запись содержимого объекта oЧисловые литералы аналогичны литералам языка C: Десятичные 45 Шестнадцатеричные 0x45 Восьмеричные 0o45 (в языке C 045) Двоичные 0b1101 (в языке C начиная со стандарта C++14) o Текстовые литералы (строки): 'abc\ndef' # литерал в одинарных кавычках "abc\ndef" # литерал в двойных кавычках литерал в трех кавычках допускает перенос строки: """abc '''abc # Четыре литерала-строки на этом слайде содержат def""" def''' # одинаковые последовательности символов литералы в одинарных кавычках и литералы в двойных кавычках имеют одинаковые свойства Числа • Целые числа, разрядность не ограничена • Числа с плавающей запятой • Числа с фиксированной запятой (класс Decimal) • Рациональные числа или дроби (класс Fraction) • Комплексные числа • Встроенные функции (built-in call) позволяют осуществлять преобразование к нужному типу: a = 25 + int("28") => 53 b = str(25) + "28" => "2528" c = 3 + int(2.8) # => 5 • Примеры числовых литералов: 123, 0x123, 0o123, 0b1101 1.23, 12., .12, 1.2e3, 1.2+3.4j, 3.4J Операторы и операции • Инструкция это одно из элементарных действий, последовательность которых составляет программу • Операция это действие над объектами или объектом, совершаемое при вычислении выражения • Оператор это символ или зарезервированное слово для обозначения операции • Большая часть операторов языка двуместные: a + b # сложение, коммутативная операция a - b # вычитание, некоммутативная операция • Одноместные операторы, например: -x # унарный минус • Трехместный оператор x if y else z аналогичен оператору ?: языка C значение_если_да if вопрос else значение_если_нет # Питон вопрос ? значение_если_да : значение_если_нет # Язык C Операции над числами • операнды приводятся к наиболее длинному типу (как в языке C) • сложение: оператор + • вычитание: оператор – • умножение: оператор * • деление: оператор / • остаток от деления: оператор % • деление с округлением вниз: оператор // результат округляется до ближайшего меньшего целого тип результата сохраняется для классического округления есть встроенная функция round() • возведение в степень: оператор ** или функция pow(x, y) • Модуль math содержит базовый набор математических функций: sin(), cos(), sqrt() и др. Строки, байты и байтовые массивы • Строка, тип str последовательность символов объекты неизменяемы • Байты, тип bytes последовательность байт объекты неизменяемы • Байтовый массив, тип bytearray последовательность байт объекты изменяемы • Все три типа можно считать коллекциями • Все три типа обладают свойством упорядоченности • Объекты создаются вызовом функции, имя которой совпадает с именем типа: str() bytes() и bytearray(). Эти же функции служат для преобразования объекта к нужному типу. Литералы-строки и литералы-байты Литералы-байты имеют тот же синтаксис что и литералы-строки, но: • имеют префикс b перед открывающей кавычкой • могут содержать только символы ASCII или числовые коды от 0 до 255 в виде Esc- последовательностей языка C Примеры: # Литералы-строки # Литералы-байты s = 'abcdef' а = b'abcdef' s = "abcdef" а = b"abcdef" s = '''Line 1 a = b '''Line 1 Line 2 Line 2 Line 3 Line 3 ''' ''' s = """Line 1 a = b"""Line 1 Line 2 Line 2 Line 3 Line 3 """ """ Произвольный символ в литерале • В литерал-строку или литерал-байты можно вставить произвольный символ Unicode • Для вставки в строку произвольного символа Unicode его шестнадцатеричное численное значение записывается после специального префикса \x - для однобайтового символа \u - для двухбайтового символа \U - для четырехбайтового символа Примеры для строк: '\xac', '\u20ac', '\U0001800a' # три строки по одному символу '\xac\u20ac\U0001800a' # строка из трех символов • Для литералов-байт допустим только префикс \x Пары символов \u и \U специального значения не имеют и интерпретируются "как есть" Строки и символы • В Питоне нет типа символ. Вместо единичного символа используется текстовая строка, содержащая один символ. • В Питоне есть ряд функций и методов для работы с символами аналогичных функциям языка C. Большая часть этих функций вместо действия для одного символа совершает действие для всех символов строки. • Функция ord() преобразует символ в его числовое значение в таблице Unicode. Для символов ASCII это числа от 0 до 127. Функция ord() применима только к строкам единичной длины, при более длинной строке происходит ошибка ord('я') # => 1103 ord('яя') # => Ошибка • Функция chr() преобразует число в строку с одним символом, код которого в таблице Unicode равен этому числу chr(1103) # => 'я' Оператор [ ] • Оператор [ ] служит для обращения к единичному элементу или фрагменту последовательности • Выбранный элемент или фрагмент может находиться в левой части инструкции присваивания, в этом случае происходит его модификация • Выбор элемента по индексу, индексация начинается с нуля. Отрицательный индекс означает отсчет элементов с конца. os[0], s[-1] # первый и последний элементы последовательности os[a:b] # фрагмент от символа с индексом a (включительно) до символа с индексом b (ИСКЛЮЧИТЕЛЬНО !) os[a:b:c] # c - шаг перебора символов умолчания: а = 0, b : до конца последовательности oc = s[:] # Вся последовательность, создается копия последовательности s Оператор [ ], примеры Выборка элемента: s = 'abcdef' s[2] => 'c' s[-2] => 'е' Модификация, к типам str и bytes неприменима: a = bytearray(b'abcdef') a[2] = ord(b'x') # => b'abxdef' a[2:] = b'123' # => b'ab123' # Размер заменяющего и заменяемого a[:-2] = b'98' # => b'9823' # фрагмента могут не совпадать a[:] = b'newtext' # => b'newtext' # Если указан шаг, совпадение a[::2] = b'1234' # => b'1e2t3x4' # размеров фрагментов обязательно Выборка фрагмента: s[2:] => 'cdef' s[:-2] # => 'abcd' s[:] # => 'abcdef' s[::2] # => 'ace' Операторы + и * Строки, байты и байтовые массивы можно "складывать". Результатом будет новый объект, являющийся соединением (конкатенацией) оригинальных объектов в порядке их следования. Тип результата это тип левого объекта. Примеры: s = 'Long' + 'Name' # => LongName a1 = bytearray(b'Long') + b'Name' # => bytearray(b'LongName') a2 = b'Long' + bytearray(b'Name') # => b'LongName' Строки байты и байтовые массивы можно "умножать" на целое число. При умножении на N результатом будет новый объект, в котором содержимое оригинального объекта повторено N раз. Операция коммутативна. Примеры: s = 'Abc' * 6 # => AbcAbcAbcAbcAbcAbc s = 72 * '=' # => Строка из семидесяти двух символов '=' Создание объектов строк или байт • Объект может быть определен литералом • Объект может быть создан вызовом встроенной функции имя которой совпадает с именем класса объекта • Объект может быть скопирован выделением фрагмента включающего оригинальный объект целиком • Класс bytearray имеет метод copy() • Объект может быть считан из файла # Байты x1 = b'abcdef' x2 = bytes(x1) x3 = x2[:] нет # Байтовые массивы нет a2 = bytearray(x1) a3 = a2[:] a4 = a3.copy() # Строки s1 = 'abcdef' s2 = str(s1) s3 = s2[:] нет |