Python для обеспечения географических исследований Лекция 2 Сегодня на повестке дня: Базовые понятия python: операторы, инструкции, переменные, выражения Простой ввод и вывод Типы данных Начнём, собственно, программировать! 2 Из чего состоит простая программа на Python? Это всегда набор инструкций. Инструкции бывают простые и составные. Пока рассматриваем только простые, «дискретные инструкции», то есть одна строка – одно конкретное указание интерпретатору – что делать. Файл test1.py 2+2 print 3+3 a=3 b=4 print a * b 3 Простая инструкция может быть: Оператором Ключевым словом Вызовом функции / процедуры Выражением … И всё 4 Операторов и ключевых слов совсем немного. Мы их будем понемногу рассматривать. Это некоторые «встроенные» в язык инструменты, но которых, по большому счету, строится всё остальное. Операторы – это не вещи в себе. Операторы применяются одновременно с функциями и выражениями. 5 Самый важный оператор – оператор присваивания. Общая форма его записи такая: <имя переменной> = <выражение> a=3 University = ‘SPSU’ b = 5 ** 32 C = b – math.sin(a) + 244.5 6 Он присваивает переменной, имя которой находится в левой части, выражение, содержащееся в правой части. При этом в правой части может быть выражение любой сложности, содержащее функции, другие переменные и т.д. 7 Стойте, стойте… Что такое выражение? А переменная? Аааа! Спокойно! Выражение – это любая комбинация операндов или элементов данных (чисел, констант, переменных, функций и других операндов) и знаков операций, в конце концов приводимое к одному конкретному значению. Операнды – любые объекты (чаще всего переменные) 8 Примеры выражений: 2+2 a/b*c+3 Sin(54) * pi() / sqrt(d) ‘vasya’ + ‘olya’ A>B 35 <= (d*e) (A > B) AND (A > C) … 9 В выражениях, в зависимости от типа требуемого результата, мы можем соединять переменные, функции и константы операциями следующих видов: - Арифметические операции - Логические операции - Операции отношений 10 Арифметические операции + СЛОЖЕНИЕ - ВЫЧИТАНИЕ / ДЕЛЕНИЕ * УМНОЖЕНИЕ ** ВОЗВЕДЕНИЕ В СТЕПЕНЬ % ДЕЛЕНИЕ ПО МОДУЛЮ print 2 + 2 print 5 - 3 print 6 / 3 print 6 * 3 print 7 ** 7 print 8 % 3 11 Операции отношений > БОЛЬШЕ < МЕНЬШЕ >= БОЛЬШЕ ЛИБО РАВНО <= МЕНЬШЕ ЛИБО РАВНО <> НЕ РАВНО != НЕ РАВНО == РАВНО In СОДЕРЖИТСЯ В not in НЕ СОДЕРЖИТСЯ В 12 Использование операций отношений автоматически означает, что наше выражение – логическое, то есть в конце концов принимает одно из двух значений: ЛОЖЬ (FALSE) или ИСТИНА (TRUE) 2>3 (4 * 3) <= (7 + 5) 4 == 3 print 2 > 3 print (4*3) <= (7+5) print (4 == 3) 13 Логические операции and Логическое И or Логическое ИЛИ not Логическое НЕ Предназначение логических операций – связать в одном выражении разные операции сравнений, составляя комплексные сравнения and «вернет» значение ИСТИНА, если истинны все связанные им операнды, иначе ЛОЖЬ or «вернет» значение ИСТИНА, если истинен любой один связанный им операнд, Иначе ЛОЖЬ not всегда вернет значение, обратное значению логического операнда 14 (2 > 3) or (4 < 5) (a < b) and (a < c) not (a > b) то же самое что (a <= b) Предназначение логических операций – связать в одном выражении разные операции сравнений, составляя комплексные сравнения Один логический оператор связывает два соседних выражения, составленных с помощью оператора сравнений. (A > B) and (A > C) or (A > D) 15 Возникает справедливый вопрос про порядок выполнения A+B/C Что раньше – сложение или деление? (A > B) and (A > C) or (A > D) Что сначала, сравнение and или сравнение or? Есть конкретный порядок и приоритеты, и они достаточно естественны. Но запоминать их не очень умно. Ведь можно всегда пользовать скобочками, как в математике! (A + B) / C ( (A>B) and (A>C) ) or (A > D) 16 Часто логические выражения используют сразу все виды операций. Но кроме операций важны ещё функции и переменные. Кратко о функциях. Функция – это особая подпрограмма, своеобразный инструмент, который производит операции над пользовательскими данными. Мы будем программировать всё на сплошных функциях. Обычно функция получает набор параметров, и, производя манипуляции над ними, возвращает пользователю результат либо совершает требуемое действие. Все хорошо знают функции в реальной жизни в математике Функция СИНУСА (SIN). Получает на вход значение угла, возвращает безразмерное значение от -1 до 1. 17 Когда вы запрашиваете штраф на сайте в ГАИ, вы используете функцию. Она получает на вход ваши паспортные данные, и возвращает размер штрафа. Функция вызывается так: ИМЯ ФУНКЦИИ (ПЕРЕДАВАЕМЫЕ ПАРАМЕТРЫ) math.sin(45) Когда классическая функция отрабатывает, она подставляет «вместо себя» вычисленное на основе входных параметров значение. import math print math.sin(14) 18 Поэтому когда в выражении встречается функция, сначала вычисляется её значение, а потом уже выражение считается дальше. Пусть есть функция power4, которая просто возводит число в четвертую степень. т.е. Power4(число) = число^4 Выражение: ( 2 + power4(3) ) / 2 Сначала преобразуется в ( 2 + 81 ) / 2 И окажется равным 41.5 19 Функции бывают самые разные. Они обрабатывают массивы чисел, строки, изображения, файлы и т.д. Мы скоро будем делать свои функции, которые будут выполнять всё, что нам нужно. Иногда функция ничего «не возвращает», а выполняет набор каких-то операций. Например, рисует цветочек на экране в координатах экрана x и y. Flower(x,y) Т.е. выражение 2 + 4 + flower (45,11) Не будет осмысленным. Скорее всего вы получите ошибку. Такие функции принято называть процедурами 20 Как уже говорилось ранее, для python написано огромное количество функций, которые можно невозбранно использовать. Наборы готовых функций обычно называются «библиотеками» или модулями. Например, вместе с Python всегда поставляется библиотека math, которая содержит все основные математические функции (тригонометрические, логарифмы и т.п.) и основые мат. Константы (например, число ПИ). Чтобы подключить библиотеку, используется ключевое слово import import <имя библиотеки> import <путь до файла python с функциями> import math Позже мы будем создавать свои наборы функций, и подключать их как библиотеки. 21 Функции из подключенных библиотек обычно нужно вызывать, указывая имя этой самой библиотеки. import math print math.sin(45) sqrt(x) Квадратный корень. Использование: sqrt(x) pow(a, b) Возведение в степень, возвращает ab. Использование: pow(a,b) exp(x) Экспонента, возвращает ex. Использование: exp(x) log(x) Натуральный логарифм. При вызове в виде log(x, b) возвращает логарифм по основанию b. log10(x) Десятичный логарифм e Основание натуральных логарифмов e271828. 22 sin(x) cos(x) tan(x) asin(x) acos(x) atan(x) atan2(y, x) Синус угла, задаваемого в радианах Косинус угла, задаваемого в радианах Тангенс угла, задаваемого в радианах Арксинус, возвращает значение в радианах Арккосинус, возвращает значение в радианах Арктангенс, возвращает значение в радианах Полярный угол (в радианах) точки с координатами (x, y). hypot(a, b) Длина гипотенузы прямоугольного треугольника с катетами a и b. degrees(x) Преобразует угол, заданный в радианах, в градусы. radians(x) pi Преобразует угол, заданный в градусах, в радианы. Константа π Округляет число до ближайшего целого. Если дробная часть числа равна 0.5, то число округляется до ближайшего четного числа. Округляет число x до n знаков после точки. Это стандартная функция, для ее использования не нужно подключать модуль math. Округляет число вниз (“пол”), при этом floor(1.5) == 1, floor(1.5) == -2 Округляет число вверх (“потолок”), при этом ceil(1.5) == 2, ceil(1.5) == -1 Округление в сторону нуля (так же, как функция int). Модуль (абсолютная величина). Это - стандартная функция. round(x) round(x, n) floor(x) ceil(x) trunc(x) abs(x) 23 Посмотреть, какие функции есть в конкретной библиотеки, что они получают на вход и что возвращают, всегда можно в документации. И это нужно уметь делать! 24 Просто выражения, пусть даже и с функциями, мало интересны. Ведь хочется где-то хранить их результаты, передавать их и т.д. И вообще нам нужны какие-то объекты, с которыми мы могли бы развлекаться всячески. Хотим управлять информацией! Здесь возникает ещё одно ключевое понятие в любом ЯП: переменные. Переменная – это именованная область памяти, в которой хранятся те или иные данные. В Python с переменными полный бардак, который одновременно очень удобен и нет. 25 Нормальный язык: int apples; // Объявляем целочисленную переменную apples int oranges; // Объявляем целочисленную переменную oranges string MyName; // Объявляем строковую переменную MyName MyName = ‘Vasya’ // Присваиваем переменной MyName значение «Vasya» apples = ‘ЯБЛОКО’ ERROR: type mistmatch Т.е. сначала мы задаем конкретный тип переменной – это число, строка, массив или ещё что-то. И работаем с переменной строго в парадигме заданного типа. 26 PYTHON: A=4 B = ‘Some Text’ B = 5.1 L=5/2 M = 5.0 / 2 C = [1,4,67,7,3] A = [‘monday’,’sunday’] Переменные объявляются в любом месте и совершенно без указания типа. Он пытается сориентироваться сам по виду выражения в правой части. Переход между типами никак не ограничен. Управление памятью осуществляется неочевидными механизмами. 27 Типы данных в PYTHON: Целочисленный тип. Обычно называется Integer. Хранит целые числа со знаком. В Python по размеру фактически не ограничен. a = 352384293842938429385629385623985 b = 283238742384729385693856932856293856 print (a - b) Если в правой части при присвоении новой переменной выражение с только целыми числами, переменная будет целой: A=5 B = 7 / 3 # тоже будет целым b=7/3 print b 28 Типы данных в PYTHON: Вещественный тип. Обычно называется Float или Double. Хранит вещественные числа со знаком. В Python по размеру ограничен 15-16ю десятичными знаками. A = 15.3 B = 11.4 C=4 D=B/C # Целое # Вещественное, так как справа есть вещественное Если в правой части при присвоении новой переменной выражение содержит хотя бы один вещественный операнд, переменная будет вещественной 29 Типы данных в PYTHON: Строковый тип. Обычно называется String. Хранит упорядоченные последовательности символов, используемые для хранения и представления текстовой информации, поэтому с помощью строк можно работать со всем, что может быть представлено в текстовой форме. По размеру в python практически не ограничены. Можно хранить в одной переменной целые главы книг. Строки в выражениях участвуют как символы в кавычках. И задаются вообще всегда и везде в кавычках. S = ‘Python’ Важно! Что A=2 И A = ‘2’ Это совершенно разные сущности. Первое хранит число, а второе – символ 2 30 В строках могут участвовать комбинации символов, интерпретируемые по-особенному: \n Перевод строки \a Звонок \b Забой \f Перевод страницы \r Возврат каретки \t Горизонтальная табуляция \v Вертикальная табуляция s = 'Hello,\nWorld!' print s 31 К отдельному символу строки можно обратиться по индексу: s = ‘Hello’ s[0] == ‘H’ s[4] == ‘o’ Сразу обратите внимание, что все нумерации любых списков в python начинаются с 0. Правда, изменять строки таким образом нельзя: s = ‘spsu' s[2] = 'F' print s 32 Строки можно складывать: S1 = ‘Hello’ S2 = ‘World’ S1 + S2 == ‘HelloWorld’ Существует огромное число функций для обработки строк. Длина строки len (): len('spam') 4 Перевести все символы в верхний регистр <переменная>.upper(): S = ‘hello’ print S.upper() -> HELLO 33 Очень интересная возможность – обращение по срезу, при помощи символа : в индексе S = ‘And Nothing Else Matters’ S[2] == ‘d’ S[:2] == ‘An’ # Первые 2 символа S[2:] == ‘d Nothing Else Matters’ # Все символы после 2го S[5:9] == ‘othi’ # Все символы с 5го по 9й Также важная возможность – задавать многострочные переменные через тройной апостроф: s = ‘’’ asdasfdas Asfasfasf Asfasfaf Afsaf’’’ Вместо бесконечных \n 34 Типы данных в PYTHON: Списки. В других языках обычно называются массивами. Это упорядоченные изменяемые коллекции объектов произвольных типов. Students = [‘Vasya’, ‘Kolya’, ‘Jack’] Students [1] == ‘Kolya’ Хранить в списках можно всё, что угодно, в том числе объекты и другие списки Matrix = [[1,2,3],[4,5,6],[7,8,9]] К вложенным спискам можно обращаться по двойному индексу m = [[1,2,3],[3,4,5],[6,7,8]] print m[1][1] 35 Список задается литерой [], элементы перечисляются через запятые. Синтаксис типов данных сохраняется: [1,4,7] - список целых чисел [5.3,1.2,6.8] – список вещественных чисел [‘as’,’be’,’cq’] – список строк a = ['spam', 'eggs', 100, 1234.1] - комбинированный список 36 Списки – ключевой, чрезвычайно важный тип данных, так как его длиной можно динамически управлять, хранить в нём сколько угодно данных. Это станет очевидно несколько позднее. Подобно индексам в строках, индексы списков начинаются с нуля, списки могут быть срезаны, объединены (конкатенированы) и так далее: >>> a[0] 'spam' a = ['spam', 'eggs', 100, 1234.1] print len(a) >>> a[3] 1234 >>> a[-2] 100 >>> a[1:-1] ['eggs', 100] >>> 3*a[:3] + ['Boo!'] ['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boo!'] 37 Для управления и обработки списков также существует множество библиотек. В стандартной библиотеке (которая есть по умолчанию), тоже есть много интересного. list.append(x) Добавляет элемент в конец списка list.extend(L) Расширяет список list, добавляя в конец все элементы списка L list.insert(i, x) list.remove(x) Вставляет на i-ый элемент значение x Удаляет первый элемент в списке, имеющий значение x Удаляет i-ый элемент и возвращает его. Если индекс не указан, удаляется последний элемент Возвращает положение первого элемента от start до end со значением x Возвращает количество элементов со значением x list.pop([i]) list.index(x, [start [, end]]) list.count(x) list.sort([key = функция]) list.reverse() Сортирует список на основе функции Разворачивает список 38 Типы данных в PYTHON: Словари. Редко используемый, но интересный тип данных. Это неупорядоченные коллекции произвольных объектов с доступом по ключу. Их иногда ещё называют ассоциативными массивами или хеш-таблицами. Лучше всего воспринимать словарь как неупорядоченный набор пар ключ: значение с требованием, чтобы ключи были уникальны (в пределах одного словаря). Пара скобок создает пустой словарь: {}. Указывая разделённый запятыми список пар-ключ: значение внутри скобок, вы поочерёдно добавляете эти пары в словарь; таким же способом словарь пишется в вывод. Главные операции над словарём — сохранение значения с каким-либо ключом и извлечение значения по указанному ключу. indexes = {'Saint-Petersburg': 78, 'Moscow': 77, 'Chelyabinsk': 74} 39 indexes = {'Saint-Petersburg': 78, 'Moscow': 77, 'Chelyabinsk': 74} print indexes['Moscow'] Уместен редко. Но иногда выручает. 40 Два слова про преобразование типов. Иногда бывает полезно целое число записать, как строку. И, наоборот, если строка состоит из цифр, то полезно эту строку представить в виде числа, чтобы дальше можно было выполнять арифметические операции с ней. Для этого используются функции, одноименные с именем типа, то есть int, float, str. Например, int('123') вернет целое число 123, а str(123) вернет строку '123'. A = 45 B = ‘41’ C = A + int(B) C == 86 String = ‘We have ’ + str(A) + ‘ tables of … and ’ + B + ‘ of …’ 41 Отдельные важные сущности. Функция print () Мы ей постоянно пользуемся, но что это вообще? Эта функция просто честно выводит выражение любой сложности и любого типа, которое расположено в правой части (не обязательно в скобочках). Числовое выражение: напечатается число Логическое выражение: напечатается True или False Интереснее всего со строками. Можно собирать строку из разных мест с помощью операции + Name = ‘Alexander’ Surname = ‘Berlyant’ print (Name + ‘ ‘ + SurName + ‘ is good at cartography’) Хотя предварительно можно было тоже самое сделать со строковой переменной и 42 вывести просто её! Отдельные важные сущности. Функция input () Инициирует ввод данных пользователем с клавиатуры, результат записывает в переменную, которой присвоена эта функция: A = input() Тип распознает автоматически по введенной строке. Если введено много элементов через запятую – создает список Это самый примитивный способ ввода данных в программу 43 a = input() print a 44 Самый обычный сценарий простых программ. С помощью print выводим строку, приглашающую ввести значение, затем используем input. Так собираем все необходимые данные. Производим вычисления, выводим их снова с помощью print import math print ('Enter 1 leg of triangle:') a = input() print ('Enter 2 leg of triangle:') b = input() hyp = math.sqrt(a*a+b*b) print ('hypotenuse: ' + str(hyp)) 45 Спасибо за внимание! e.kazakov@spbu.ru ekazakov.info/students 46