python легко и просто. Красиво решаем повседневные задачи
DESCRIPTION
Александр Семенюк Python легко и просто. Красиво решаем повседневные задачиTRANSCRIPT
![Page 1: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/1.jpg)
![Page 3: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/3.jpg)
Python делает всё, чтобы упростить вашу жизнь.
Этот язык предоставляет многообразие инструментов, позволяющих легко решать многие задачи.
![Page 4: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/4.jpg)
if len(mylist) == 0: raise Exception('Empty list is not acceptable')
![Page 5: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/5.jpg)
>>> bool( 0 ) False >>> bool( [] ) False >>> bool( {} ) False >>> bool( None ) False >>> bool( '' ) False
![Page 6: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/6.jpg)
if mylist: raise Exception('Empty list is not acceptable')
![Page 7: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/7.jpg)
class Basket(object): empty = True items = [] def __nonzero__(self): return not self.empty def __len__(self): return len(self.items) basket = Basket() print bool(basket) # False
![Page 8: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/8.jpg)
if mylist == None: do_something()
![Page 9: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/9.jpg)
if mylist == None: do_something()
if mylist is None: do_something()
![Page 10: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/10.jpg)
$ python -m timeit -s "x = None" "x is None" 10000000 loops, best of 3: 0.0329 usec per loop $ python -m timeit -s "x = None" "x == None" 10000000 loops, best of 3: 0.0607 usec per loop
![Page 11: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/11.jpg)
• Всё в Python – это объект.• Каждая переменная – ссылка на объект.• Оператор is сравнивает эти ссылки.
class A: pass a = A() b = a print a is b print id(a) print id(b)
True 33274616 33274616
![Page 12: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/12.jpg)
• В Python есть неизменяемые объекты. Их значение не меняется после создания:
• Числа - 0, 245, 10000000000000001• Строки - 'Hi people!'• Кортежи (неизменяемые списки) - (1,2, 'a')• И, конечно же, None !
![Page 13: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/13.jpg)
if mylist: raise Exception('Empty list is not acceptable')
![Page 14: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/14.jpg)
BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StandardError | +-- BufferError | +-- ArithmeticError | | +-- FloatingPointError | | +-- OverflowError | | +-- ZeroDivisionError
…
![Page 15: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/15.jpg)
class EmptyListError(Exception): pass if not mylist: raise EmptyListError('Empty list is not acceptable')
![Page 16: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/16.jpg)
try: work_with_list([]) except EmptyListError: # we know what's wrong
try: work_with_list([]) except Exception: # what to do?
![Page 17: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/17.jpg)
• Python знает, где истина.• ‘is None’ лучше, чем ‘== None’.• Всё объект!• Создавать свои собственные исключения круто.
![Page 18: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/18.jpg)
try: f = open('config.txt') line = f.readline() while line: line = line.strip(' \n') if not line: continue if line.startswith('#'): continue do_some_staff(line) line = f.readline() finally: f.close()
![Page 19: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/19.jpg)
for i in range(len(mylist)): print mylist[i]
![Page 20: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/20.jpg)
for i in range(len(mylist)): print mylist[i]
for item in mylist: print item
![Page 21: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/21.jpg)
import itertools for i in itertools.count(): print i
![Page 22: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/22.jpg)
for item in reversed(mylist): print item
![Page 23: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/23.jpg)
for item in reversed(mylist): print item
>>> mylist = [1,2,3] >>> mylist[::-1] [3, 2, 1]
![Page 24: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/24.jpg)
$ python -m timeit -s "l = [1, 2, 3]" "list(reversed(l))" 1000000 loops, best of 3: 0.995 usec per loop $ python -m timeit -s "l = [1, 2, 3]" "l[::-1]" 1000000 loops, best of 3: 0.202 usec per loop
![Page 25: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/25.jpg)
$ python -m timeit -s "l = [1, 2, 3]" "for i in reversed(l): pass" 1000000 loops, best of 3: 0.28 usec per loop $ python -m timeit -s "l = [1, 2, 3]" "for i in l[::-1]: pass" 1000000 loops, best of 3: 0.318 usec per loop
![Page 26: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/26.jpg)
heroes = ['Batman', 'Spiderman', 'Hulk', 'Invisible Woman'] colors = ['black', 'red', 'green'] for i in range(min(len(heroes), len(colors)): print list1[i], 'is', list2[i]
![Page 27: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/27.jpg)
for hero, color in zip(heroes, colors): print hero, 'is', color
![Page 28: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/28.jpg)
heroes_with_colors = dict(zip(heroes, colors)) print heroes_with_colors
{ 'Spiderman': 'red', 'Batman': 'black', 'Hulk': 'green' }
![Page 29: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/29.jpg)
from itertools import izip for hero, color in izip(heroes, colors): print hero, 'is', color
![Page 30: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/30.jpg)
>>> for i in 'python': i ... 'p' 'y' 't' 'h' 'o' 'n'
![Page 31: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/31.jpg)
>>> for i in 'python': i ... 'p' 'y' 't' 'h' 'o' 'n'
>>> for key in heroes_with_colors: key ... 'Spiderman' 'Batman' 'Hulk'
![Page 32: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/32.jpg)
>>> for i in 'python': i ... 'p' 'y' 't' 'h' 'o' 'n'
>>> for key in heroes_with_colors: key ... 'Spiderman' 'Batman' 'Hulk'
>>> import re >>> for match in re.finditer(pattern, string): ... # each match in the string ...
![Page 33: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/33.jpg)
>>> for line in myfile: ... print repr(line) # each line in a file ...
![Page 34: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/34.jpg)
f = open('config.txt') try: for line in f: line = line.strip(' \n') if not line: continue if line.startswith('#'): continue do_some_staff(line) finally: f.close()
![Page 35: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/35.jpg)
def iterate_lines(f): for line in f: line = line.strip(' \n') if not line: continue if line.startswith('#'): continue yield line
![Page 36: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/36.jpg)
f = open('config.txt') try:
for line in iterate_lines(f): do_some_staff(line)
finally: f.close()
![Page 37: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/37.jpg)
>>> mylist ['a', 'b', 'b', 'c'] >>> for index, item in enumerate(mylist): ... if item == 'b': ... del mylist[index] ... >>> mylist ['a', 'b', 'c']
![Page 38: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/38.jpg)
>>> mydict {'b': 2} >>> for key in mydict: ... if key == 'b': ... del mydict[key] ... Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: dictionary changed size during iteration
![Page 39: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/39.jpg)
>>> for key in mydict.keys(): ... if key == 'b': ... del mydict[key] ... >>> mydict {}
![Page 40: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/40.jpg)
f = open('config.txt') try:
for line in iterate_lines(f): do_some_staff(line)
finally: f.close()
![Page 41: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/41.jpg)
with EXPR as VAR: BLOCK
![Page 42: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/42.jpg)
with open('config.txt') as f: process_file(f)
![Page 43: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/43.jpg)
try: dangerous_actions() except AttributeError: pass # we don't care
![Page 44: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/44.jpg)
from contextlib import contextmanager @contextmanager def ignore_errors(*errors): try: yield except errors: pass
![Page 45: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/45.jpg)
>>> with ignore_errors(KeyError, AttributeError): ... raise KeyError ... >>>
![Page 46: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/46.jpg)
with open('config.txt') as f: for line in iterate_lines(f): do_some_staff(line)
![Page 47: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/47.jpg)
• Итерируйтесь правильно• Отделяйте административную логику от бизнес логики• Не изменяйте список, по которому итерируетесь• Контекстные менеджеры молодцы
![Page 48: Python легко и просто. Красиво решаем повседневные задачи](https://reader031.vdocuments.mx/reader031/viewer/2022020717/5588f78cd8b42aad418b4698/html5/thumbnails/48.jpg)
Большое спасибо за внимание!