Концепции языков программирования Лекции 6-7. Язык Python (основы) Глухих Михаил Игоревич, к.т.н., доц. mailto: glukhikh@mail.ru Беляев Михаил Анатольевич, асп. Литература Изучаем Python – М. Лутц 3-е издание, Символ-Плюс, 2009 Python 2.5 Dive Into Python – М. Пилгрим http://diveinto.python.ru/toc.html Официальный сайт http://python.org http://docs.python.org (документация) Концепции языков программирования 2 Основные свойства открытый исходный код развивающийся язык сценариев интерпретируемый динамическая типизация строгая типизация (???) стиль чистый объектно-ориентированный все есть объекты функциональный Концепции языков программирования 3 Строгая типизация любой объект имеет строго определенный, неизменный тип допускается присваивание переменной только значения строго того же типа, что и переменная операция (функция) требует параметров строго определенного типа не допускаются неявные преобразования типов Концепции языков программирования 4 Особенности Достоинства кроссплатформенность высокая скорость разработки удобный синтаксис мощная библиотека Недостатки низкое быстродействие сравнительно низкая скорость отладки Концепции языков программирования 5 Философия (Дзэн) Красивое лучше, чем уродливое. Явное лучше, чем неявное. Простое лучше, чем сложное. Сложное лучше, чем запутанное. Плоское лучше, чем вложенное. Разреженное лучше, чем плотное. Читаемость имеет значение. Особые случаи не настолько особые, чтобы нарушать правила. При этом практичность важнее безупречности. Ошибки никогда не должны замалчиваться. Если не замалчиваются явно. Концепции языков программирования 6 Философия (Дзэн) Встретив двусмысленность, отбрось искушение угадать. Должен существовать один — и, желательно, только один — очевидный способ сделать это. Хотя он поначалу может быть и не очевиден, если вы не голландец. Сейчас лучше, чем никогда. Хотя никогда зачастую лучше, чем прямо сейчас. Если реализацию сложно объяснить — идея плоха. Если реализацию легко объяснить — идея, возможно, хороша. Пространства имён — отличная штука! Будем делать их побольше! Концепции языков программирования 7 История развития Версия 0.9 – 1991 (Гвидо ван Россум) Python 1.0 – 1994 Python 1.4 – 1997 именованные параметры комплексные числа Python 1.6/2.0 – 2000 генераторы списков (Haskell) сборка мусора Python 2.1 – 2001 Python Software Foundation вложенные пространства имен Концепции языков программирования 8 История развития Python 2.2 – 2001 общая иерархия типов функции-генераторы Python 2.3 – 2003 множества, логический тип кодировка для исходного кода Python 2.4 – 2005 встроенный тип для множеств выражения-генераторы механизм подстановки строк Концепции языков программирования 9 История развития Python 2.5 – 2006 условные выражения комбинация try/except/finally Python 2.6 – 2008 конструкция with улучшенное форматирование строк Python 2.7 – 2010 Python 3.0 – 2008 нет обратной совместимости (например, убрали оператор print) все строки в Unicode Концепции языков программирования 10 Установка Язык + библиотеки + интерпретатор: с официального сайта python.exe – командная оболочка python скрипты *.py – запускаются из терминала Среда разработки IDLE NetBeans и плагин Python Концепции языков программирования 11 "Hello, world" на Python # -*- coding: utf-8 -*if __name__ == "__main__": print "Hello, world!" # __name__ – имя модуля при использовании # или __main__ при запуске # print – оператор вывода Концепции языков программирования 12 Отступление о синтаксисе if (c1) { st1; } else if (c2) { st2; } else { st3; } if c1 st1; elif c2 st2; else st3; fi Концепции языков программирования if c1: st1 elif c2: st2 else: st3 13 Комментарии # -*- coding: utf-8 -*# это была первая строка файла # это просто комментарий def func(x, y): ''' Это документирующая строка x – первый, y - второй ''' pass Концепции языков программирования 14 Имена первый символ – латинская буква или знак подчеркивания остальные символы – латинские буквы, цифры или знаки подчеркивания строчные и прописные буквы различаются общепринятые соглашения ClassName method_name variable_name CONSTANT_NAME Концепции языков программирования 15 Система типов Все является объектами! в том числе примитивные значения в том числе функции в том числе описания типов Свойства объектов identity, тип, значение атрибуты (поля, члены-данные) методы (члены-функции) наследование Концепции языков программирования 16 Объекты и переменные Объекты после создания имеют строго определенный и неизменный тип (type(obj)) также имеют определенный identity (id(obj), o1 is o2, o1 is not o2) значение: mutable, immutable (зависит от типа) Переменные не имеют специального определения определяются в ходе выполнения работают как ссылочные (по факту примитивные типы реализованы как значения) тип и значения могут изменяться Концепции языков программирования 17 Численные типы int: 23, -34 (>=32 бита, sys.maxint, C long) long: 345L неограниченный размер float: 1.4e+40 (>=64 бита, C double) complex: 1+2j (z.real, z.imag, abs(z), два float) bool: True, False n = 23 # Никаких int n !!! val = 3456789L x = 1.4e+40 c = 1+2j flag = True Концепции языков программирования 18 Числовые операции + - * / стандартная арифметика % взятие остатка // деление нацело ** возведение в степень << >> сдвиги | & ^ ~ побитовые операции == >= <= < > != <> сравнения a < b < c эквивалентно a < b and b < c a < b != c эквивалентно a < b and b != c Концепции языков программирования 19 Условия Любой объект python имеет связанное логическое значение False: 0, None, "", (), [], {} True: все остальные Поэтому любой объект может быть использован в условии if a + b: # если сумма не равна 0 pass Концепции языков программирования 20 "Логические" операции # Если a ложно, то a, иначе b a and b # Если a истинно, то a, иначе b a or b # Настоящее НЕ not a # Условная конструкция a if cond else b Концепции языков программирования 21 "Логические" операции a # # # and b or c (a and b) or c если a ложно, то a or c, то есть c если a истинно, то b or c # # # # # a Если a истинно, то a, иначе если b ложно, то b, иначе если c истинно, то c, иначе d Справедливо при a or (b and (c or d)) На самом деле (a or (b and c)) or d or b and c or d Концепции языков программирования 22 Последовательности Индексированные списки len(seq) – длина последовательности seq[i] – элемент с индексом i 0 первый индекс, 1 второй... -1 это последний индекс, -2 предпоследний... seq[i:j] – подпоследовательность от i до j-1 seq[i:] – подпоследовательность от i до конца seq[:j] – подпоследовательность от начала до j-1 s1 + s2 – сумма последовательностей s1 * n – повторение последовательности not in seq, in seq – проверка вхождения for elem in seq: # перебор элементов Концепции языков программирования 23 Последовательности Immutable str: 'Hello' или "Hello" или '''Hello''' s.split(str), s.join(strseq), s.find(str), s.replace(sa, sb) unicode: u'Hello' или u"Hello" tuple: (23, 'Hello', 4.5, 1+2j) пустая () t.index(elem) Mutable bytearray: bytearray((25, 36)) list: [23, 'Hello', 4.5, 1+2j] range(4) range(5, 9) l.append(elem), l.extend(list), l.insert(pos, elem) l.remove(elem), l.pop(), l.pop(pos) l.sort(), l.reverse() Концепции языков программирования 24 Форматированные строки # Похоже на printf/fprintf/sprintf # В отличие от C, # контролирует типы аргументов "hello %s" % w # w --> %s "%d + %d = %d" % (a, b, a+b) "%6.3f" % x # Вывод полей объекта name и type "%s(name) %s(type)" % obj Концепции языков программирования 25 Словари и множества Словарь diсt: { k1: v1, k2: v2, k3: v3 } d[k1], d.get(k1, default), d.has_key(k1) d.keys(), d.values(), d.items(), len(d) d.pop_key(k1), d.update(d2) Множество set: {k1, k2, k3} итерируемо in s, len(s) s.add(elem), s.remove(elem) union(s1, s2), intersection(s1, s2), difference(s1, s2) >= > <= < Ключи – immutable Концепции языков программирования 26 Файлы Встроенный тип, обеспечивающий ввод-вывод f=open(name, mode) s=read(), s=read(num) s=readline() list=readlines() for s in f: write(s) writelines(list) close() flush() seek(pos), tell() name, mode # # # # # # # # # # # Концепции языков программирования аналог fopen чтение символов чтение строки чтение списка перебор строк запись строки запись списка закрытие сброс буфера навигация атрибуты 27 Конструкции Python if – elif – else # каскадный if # switch отсутствует while – else # цикл с предусловием # do-while отсутствует for – in – else # цикл for-each # блок обработки исключений try – except – else – finally with – as # короткие имена def # определение функции class # определение класса Концепции языков программирования 28 while – else while condition: # statements if condition2: break # if condition3: continue # statements else: # statements пока условие верно выйти из while-else следующая итерация если условие неверно Концепции языков программирования 29 for – in – else for elem in seq: # statements if condition2: break # if condition3: continue # statements else: # statements пока условие верно выйти из for-in-else следующая итерация если условие неверно Концепции языков программирования 30 Типовые заголовки for for for for for for i in i in i in elem k, v range(10): range(2,100): range(3,101,2): in list: in dict.items(): # Пример для цикла for Концепции языков программирования 31 Функции def sumfunc(arg1, arg2): return arg1+arg2 # Примеры вызова c=sumfunc(a, b) x=sumfunc(arg2=2.6, arg1=1.3) list=[a, b] c=sumfunc(*list) dict={"arg1": 2.6, "arg2": 1.3} x=sumfunc(**dict) Концепции языков программирования 32 Пример (из dive into python) def buildConnectionString(params): """Build a connection string from a dictionary of parameters. Returns string.""" return ";".join(["%s=%s" % (k, v) for k, v in params.items()]) if __name__ == "__main__": myParams = {"server":"mpilgrim", \ "database":"master", \ "uid":"sa", \ "pwd":"secret"} print buildConnectionString(myParams) Концепции языков программирования 33 Лямбда-функции и ФП f = lambda a, b: a+b f(2.6, 1.3) # Вызов # Применить к каждому элементу списка list=map(lambda x: x**2, range(10)) # Оставить в списке элементы, # удовлетворяющие условию list=filter(lambda x: x%2, list) # Свернуть список n=reduce(lambda a, b: a+b, list) Концепции языков программирования 34 Генераторы списков [expr for elem in list if cond] # Новый список состоит из # заданного выражения expr # для каждого элемента elem # из заданного списка list, # для которого верно условие cond # Пример генератора Концепции языков программирования 35 Генератор последовательности def simplegen(n): for m in range(2, n): for d in range(2, m): if not m % d: break else: yield m if __name__ == "__main__": for simp in simplegen(1000): print simp Концепции языков программирования 36 Обработка исключений try: f = open("/notthere") try: # Комбинировать все вместе можно в Python >= 2.5 g = open("/here") except IOError as err: print "No such file, %s" % err else: print "File is here" close(g) finally: close(f) except IOError: print "The file does not exist, exiting" Концепции языков программирования 37 Формирование исключений raise expr # сформировать исключение raise expr, data # доп. данные # AssertionError при неверном условии assert cond, expr Концепции языков программирования 38 Классы Python class Value: "Очень полезный класс" def __init__(self, val=0): self.val=val def get(self): return self.val if __name__ == "__main__": v1 = Value() v2 = Value(3) print v1.get() + v2.val Концепции языков программирования 39 Наследование class SqrValue(Value): "Не менее полезный класс" def __init__(self, val=0): Value.__init__(self, val ** 2) Концепции языков программирования 40 Важные особенности В нестатических функциях self всегда должно быть первым аргументом хотя не является ключевым словом Нет определения полей (атрибутов) все получившее значение через self.field считается полями Все поля и методы открыты Явный вызов конструктора базового класса Сборка мусора Концепции языков программирования 41 Специальные методы Перегрузка операторов __add__ __sub__ __mul__ __div__ Строковое представление __repr__ Сравнение __cmp__ Длина __len__ Доступ к атрибутам __getitem__ __setitem__ Концепции языков программирования 42 Пример fileinfo.py Концепции языков программирования 43 Далее Особенности языка Python интроспекция пространства имен и области видимости стандартная библиотека ... Концепции языков программирования 44