3. Кому он нужен ?Кому он нужен ?
IT — компании, использующие Python3
4. О типах и структурах...О типах и структурах...
объекты Python
атомарные
(int, long, complex)
ссылочные
изменяемые
(mutable)
неизменяемые
(immutable)
Типы и структуры Python
str "Hello, world!" immutable [2:6], find(), replace(),split(), encode(), startswith() и т.п.
list [1,2,3,4,5] mutable len(), in, not in, +, *, i[i] =m, append(x), count(x), extends, pop()
dict {'a':1, 'b':2} mutable Len(), h1.update(h3),
tuple (1,2,3,4,5) immutable count(), index()
a,b,c,d,e = 1,2,3,4,5
t = 1,2,4
4
5. Базовый синтаксисБазовый синтаксис
list = [1, 2, 3, 'Вася Пупкин', 5]
dict = {'a':1, 'meaning':42}
tuple = ('spam', 42, 1337)
startWord = 'spam'
meaningOfLife = 42
a, b = 2, 42
присваивание
list = [1,2,3,4,5]
for x in list:
print x
Цикл for
tuple = ('a', 'b', 'c', 'd')
if 'a' in tuple:
print ' "a" in tuple'
else: print ' "b" not in tuple'
условие
Базовый синтаксис
L = [x**2 for x in range(10)]
L1 = [x**2 for x in range(10) if x%2 != 0]
List comprehensions
s = [1,2,3,4,6]
s1 = s[:]
s2 = s[1:]
s3 = s[:-2] # последние 2 элемента
s4 = s[1:4:2] # элементы 1-4 с шагом 2
for i, x in enumerate(range(1,10,2)):
print i, x
Распаковка кортежа
for (ip, port) in connections:
if port < 1024:
print 'Connected to %s on %s' % (ip, port)
Цикл for со
счетчиком i
«Слайсирование»
ingredients = ['bacon', 'sausages', 'spam', 'spam']
print 'Ingredients are: %s.' % ', '.join(ingredients)
Вывод списка
5
6. Duck TypingDuck Typing
«Если это выглядит как утка, плавает как утка и крякает как утка, то,
вероятно, это утка».
def IsMappingType(obj, require_set=False):
if require_set and not hasattr(obj, '__setitem__'):
return False
if hasattr(obj, 'keys') and hasattr(obj, '__getitem__'):
return True
else:
return False
def IsSequenceType(obj, require_set=False):
if require_set and not hasattr(obj, '__setitem__'):
return False
if (not hasattr(obj, 'keys')) and hasattr(obj, '__getitem__'):
return True
else:
return False
Утиная типизация
list = [2,2,2,2,3]
string = "Hello, i'm a simple strring"
dict = {'a':1,'b':2,'c':3}
print IsMappingType(dict, require_set=True)
print IsSequenceType(list, require_set=True)
print IsSequenceType(string)
True
True
True
f = open(filename)
for char in f.read():
process(char)
6
7. try:
import ololo
except ImportError as e:
print "cannot import rquired module, exception message is: %s" % e.message
ИсключенияИсключения
Исключения в Python
try:
import urllib
except ImportError:
import urllib2
try:
f = open('somefile')
s = f.readline()
i = int(s.strip())
except IOError as e:
print "Ошибка ввод/вывода", e
except ValueError:
print "Не удается преобразовать данные к целому типу"
except:
print "Внезапная неизвестная ошибка"
raise
7
8. Функция в PythonФункция в Python
def dummyFunct():
pass
def sumOfSquares(a, b):
"""calculates a sum of two squares"""
return a**2 + b**2
docstring
def gcd(a, b):
"""evaluates a gcd"""
while a != 0:
a,b = b%a,a
return b
Парное определение
myGCD = gcd(1878, 689334) #6
print gcd.__doc__ # evaluate a gcd
def spam(a, b, c = 0):
return a + b + c
c задан по умолчанию
Функция в Python8
9. Функция в Python. Position и keyword аргументы
Position и keywordPosition и keyword аргументыаргументы
def calculateSumOfArgs(*args):
sum = 0
for arg in args:
sum += arg
return sum
print calculateSumOfArgs(42,444,555,666,32)
position аргумент
def listArgs(farg, *args):
print "formal arg:", farg
for arg in args:
print "position arg:", arg
listArgs (1,2,3,4)
def listArgs(farg, *args):
print "formal arg:", farg
for i, arg in enumerate(args):
print "position arg %i: %s" % (i, arg)
listArgs (1,2,3,4)
>>>
formal arg: 1
another arg: 2
another arg: 3
another arg: 4
>>>
formal arg: 1
position arg 0: 2
position arg 1: 3
position arg 2: 4
9
10. def generateInsertStatement(table, **kwargs):
"""Generates Database insert statement"""
cols = []
vals = []
for col, val in kwargs.items():
cols.append(col.replace("'", r"'"))
vals.append("'%s'" % (str(val)).replace('"', r'"'))
cols = ", ".join(cols)
vals = ", ".join(vals)
return 'INSERT INTO %s(%s) VALUES(%s);' % (
table, cols, vals)
keyword аргумент
print generateInsertStatement("Person", name="John", surname= "Smith", career = "agent")
params = {"name": "Thomas", "surname" :"Anderson", "career": "hacker"}
print generateInsertStatement("workers", **params)
>>>
INSERT INTO Person(career, surname, name) VALUES('agent', 'Smith', 'John')
INSERT INTO workers(career, surname, name) VALUES('hacker', 'Anderson', 'Thomas')
Функция в Python. Position и keyword аргументы
Position и keywordPosition и keyword аргументыаргументы
10
11. Функция в Python — объект 1 классаФункция в Python — объект 1 класса
Функция в Python — объект 1 класса
def testSort(lst):
if lst: return testSort([elem for elem in lst[1:] if elem<lst[0]]) + lst[0:1] + testSort([elem for elem in lst[1:] if elem>=lst[0]])
return []
- может быть сохранен в переменной или структурах данных
- может быть передан в функцию как аргумент
- может быть возвращен из функции как результат
- может быть создан во время выполнения программы
- внутренне самоидентифицируем (независим от именования)
func = testSort
lst = [1, 2, 33, 3, 4, 6, 7, 788, 9, 5, 33, 222]
sortedList = func(lst)
print sortedList
>>>
[1, 2, 3, 4, 5, 6, 7, 9, 33, 33, 222, 788]
теперь func — функция сортировки
11
12. Передача функции в качестве аргументаПередача функции в качестве аргумента
def fibRec(n):
if n == 0:
return 0
elif n < 3:
return 1
return fibRec(n-1) + fibRec(n-2)
def fibIter(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
Передача функции в качестве аргумента12
13. Передача функции в качестве аргументаПередача функции в качестве аргумента
import time
def timeLogging(func, *args, **kwargs):
t = time.time()
ret = func(*args, **kwargs)
print 'Calling: %s, returned %r elapsed time %f'
% (func.__name__, res, time.time()-t)
return ret
функция-параметр
timeLogging(fibRec, 45)
timeLogging(fibIter, 45)
передается сама функция, а не результат ее работы
Передача функции в качестве аргумента
>>
Calling: fibRec, returned 102334155 elapsed time 28.392000
Calling: fibIter, returned 102334155 elapsed time 0.000120
13
14. Возврат функции в качестве результатаВозврат функции в качестве результата
def fSelector(selector):
if selector < 0:
def fSqr(x):
return x * x
return fSqr
else:
def fCube(x):
return x * x * x
return fCube
def operate(L, function):
res = [function (elem) for elem in L]
return res
L = [1, 2, 3, 100]
print operate(L, fSelector(1))
>>>
[1, 8, 27, 1000000]
Возврат функции в качестве результата
возврат самой функции
14
15. Определение функции с помощью lambda-выраженияОпределение функции с помощью lambda-выражения
Функция в Python
print (lambda x: x * x)(5)
def fSelector(selector):
if selector < 0:
return lambda(x): x * x
else:
return lambda(x): x * x * x
функцию можно вызвать сразу после определения
def operate(L, function):
res = [function (elem) for elem in L]
return res
>>>
[1, 4, 9, 10000]
L = [1, 2, 3, 100]
print operate(L, fSelector(-1))
15
19. @ декораторы@ декораторы
Декораторы Python
import time
def timeLogger(function):
def decor(*args, **kwargs):
t = time.time()
res = function(*args, **kwargs)
print u'Returned %r elapsed time %f' % (res, time.time()-t)
return res
return decor
@timeLogger
def factorial(n):
return reduce(lambda x,y:x*y,[1]+range(1,n+1))
factorial(38)
>>>
Returned 523022617466601111760007224100074291200000000L elapsed time 0.000020
19
20. import threading
class Thread(threading.Thread):
def __init__(self, f):
threading.Thread.__init__(self)
self.run = f
@ декораторы@ декораторы
Декораторы Python
@Thread
def runOnOtherwiseThread():
# do something...
#
runOnOtherwiseThread.start()
20
21. Классы в PythonКлассы в Python
ООП в Python. Классы
class Dummy(object):
"""
This is the class example
"""
def __init__(self, arg):
self._arg = arg
def method(self, x):
pass
def _privatemethod(self, x):
pass
@staticmethod
def static(arg1, arg2, *args, **kwargs):
pass
@classmethod
def classmethod(cls, arg1, arg2, *args, **kwargs):
pass
конструктор
метод
приватный метод
статический метод
метод класса
myinstance = Dummy(4)
21
22. Классы в PythonКлассы в Python
ООП в Python. Классы
class Employee(object):
"""
Common Employee
"""
empCount = 0
def __init__(self, id, name, salary):
self.id = id
self.name = name
self._salary = salary
Employee.empCount += 1
@property
def salary(self):
return self._salary
@salary.setter
def salary(self, value):
self._salary = value
@staticmethod
def getCount():
return Employee.empCount
def __str__(self):
return u"id = " + unicode(self.id) + u", Name : " + unicode(self.name) + u", Salary: " + unicode(self.salary)
emp1 = Employee(1, "Thomas Anderson", 250)
emp1.salary = 1000
emp2 = Employee(2, "John Smith", 2500)
print emp1
print emp2
print "Total Employee %d" % Employee.getCount()
свойство
вызов метода str
вызов статического метода
>>>
id = 1, Name : Thomas Anderson, Salary: 1000
id = 2, Name : John Smith, Salary: 2500
Total Employee 2
22
23. НаследованиеНаследование
ООП в Python. Наследование
class Manager(Employee):
def __init__(self, id, name, salary, inferiorsCount = 0):
super(Manager, self).__init__(id, name, salary)
self.__inferiorsCount = inferiorsCount
inferiors = property(lambda self: self.__inferiorsCount)
@inferiors.setter
def inferiors(self, value):
self.__inferiorsCount = value
def __str__(self):
return u"id = %d, Name : %s, Salary: %.2f and has %d inferiors" % (self.id, self.name, self.salary, self.inferiors)
manager = Manager(3, "Trinity Ololo", 1150)
manager.salary = 2000
manager.inferiors = 2
print manager
print "Total Employee %d" % Employee.getCount()
>>>
id = 3, Name : Trinity Ololo, Salary: 2000.00 and has 2 inferiors
Total Employee 3
23
24. ПолиморфизмПолиморфизм
class Parent(object):
def whoAmI(self) : return 'parent'
class Child(Parent):
def whoAmI(self): return 'child'
x = Parent()
print x.whoAmI()
y = Child()
print y.whoAmI()
y.__class__ = Parent
print y.whoAmI()
ООП в Python. Полиморфизм
>>>
parent
child
parent
24
25. class Abstract(object):
def abstractMethod(self):
raise NotImplementedError('Method is pure virtual')
Абстрактные методыАбстрактные методы
a = Abstract()
a.abstractMethod()
>>>
raise NotImplementedError('Method is pure virtual')
NotImplementedError: Method is pure virtual
ООП в Python. Абстрактные методы25
26. ИтераторыИтераторы
Итераторы Python
list = [1, 2, 3]
for i in list :
print(i)
it = iter(sequence)
while True:
try:
value = it.next()
except StopIteration:
break
print value
26
27. ИтераторыИтераторы
Итераторы Python
class Reverse(object):
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def next(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
rev = Reverse("Test")
rev.next() # t
rev.next() # s
for x in Reverse("string"):
print x
возвращает ссылку на
итерируемый объект
возвращает ссылку на
следующий элемент или
StopIteration
27
28. ГенераторыГенераторы
Генераторы Python
def gGenerator():
lst = range(20)
for elem in lst:
yield elem * elem
generator = gGenerator()
print generator
<generator object gGenerator at 0x024BCB48>
возвращает объект-
генератор
PEP 255
for sqm in generator:
print sqm
28
29. ГенераторыГенераторы
Генераторы Python
def aCube(n):
return n * n * n
def genMap(func, iterable):
for item in iterable:
yield func(item)
def mymap(func, iterable):
return list(genMap(func, iterable))
lst = [1,2,2,3,4]
l = mymap(iterable=lst, func=aCube)
def fibonacci():
a, b = 0, 1
while 1:
yield a
a, b = b, a + b
29
30. Класс — это объектКласс — это объект
ООП в Python. Класс — это объект
- можно присвоить переменной
- можно скопировать
- можно добавить к нему атрибут
- можно передать функции в качестве аргумента
class ObjectCreator(object):
pass
myObject = ObjectCreator()
print myObject
<<<
<__main__.ObjectCreator object at 0x01EAC910>
<class '__main__.ObjectCreator'>
MyObject
сам может создавать
объекты (экземпляры), а значит
сам является классом
print type(myObject)
30
31. Динамическое создание классаДинамическое создание класса
ООП в Python. Динамическое создание класса
def classSelector(className):
if className == 'spam':
class Spam(object):
pass
return Spam
else:
class Sausage(object):
pass
return Sausage
Selected = classSelector('spam')
pieceOfSpam = Selected()
>>>
<class '__main__.Spam'>
<__main__.Spam object at 0x01FCE5B0>
возвращает сам
класс, а не экземпляр
31
32. Динамическое создание классаДинамическое создание класса
ООП в Python. Динамическое создание класса
def echo(self):
print self.attribute
Spam = type('Spam', (), {'attribute': True, 'echo':echo})
spamObject = Spam()
print spamObject
spamObject.echo()
>>>
<__main__.Spam object at 0x020BE730>
True
32
33. МетаклассыМетаклассы
ООП в Python. Метаклассы
Метакласс — это то, что создает объекты - классы
class someClass(object):
__metaclass__ = ...
class Child(Base):
pass
Есть ли у класса Child
атрибут __metaclass__ ?
Есть ли у класса Base
атрибут __metaclass__ ?
true создание объекта -
класса Child
true
создание объекта -
класса Child
Поиск __metaclass__
в модуле
создание объекта -
класса Child
true
Использование type()
создание объекта -
класса Child
33
35. class Singleton(object):
obj = None
def __new__(cls,*args,**kwargs):
if cls.obj is None:
cls.obj = object.__new__(cls,*args,**kwargs)
return cls.obj
МетаклассыМетаклассы
ООП в Python. Метаклассы
o1 = Singleton()
o2 = Singleton()
print o1 is o2
>>True
35
36. Пару слов о менеджерах контекстаПару слов о менеджерах контекста
Менеджеры контекста
with open("infile.txt", "r") as file:
print file.read() # в случае исключения произойдет закрытие файла
def __enter__(self):
return self
def __exit__(self, type, value, tb):
self.stream.close()
with DatabaseConnection() as mydbconn:
# что-то делаем с БД
36
37. «Батарейки в комплекте»«Батарейки в комплекте»
Matplotlib — визуализация данных двумерной (2D) и трехмерной (3D) графикой
Django — фреймворк для веб-приложений
PyBrain — библиотека для работы с нейронными сетями и ИИ
NumPy — библиотека высокоуровневых математических функций
SciPy — открытая библиотека высококачественных научных инструментов
PyGame — набор модулей, предназначенный для написания компьютерных игр
PyQt — набор «привязок» графического фреймворка Qt
веб — urllib2, httplib, cookielib...
алгоритмы — collections, re, difflib, itertools, queue, heap …
ОC — windows , posix, argparse, macOS, logging..
тестирование и отладка — unittest, doctest, pdb, ipdb, hotshot...
Модули и библиотеки Python37
38. Редакторы / IDEРедакторы / IDE
Редакторы и IDE для Python
PyCharm $99
(30 days trial)
PyScripter Free
Sublime Text 2 $70/ Free
Ninja IDE Opensource
38