48

Python легко и просто. Красиво решаем повседневные задачи

Embed Size (px)

DESCRIPTION

Александр Семенюк Python легко и просто. Красиво решаем повседневные задачи

Citation preview

Page 1: Python легко и просто. Красиво решаем повседневные задачи
Page 2: Python легко и просто. Красиво решаем повседневные задачи

Python: легко и просто. Красиво решаем повседневные задачи.

Александр Семенюк[email protected]

Page 3: Python легко и просто. Красиво решаем повседневные задачи

Python делает всё, чтобы упростить вашу жизнь.

Этот язык предоставляет многообразие инструментов, позволяющих легко решать многие задачи.

Page 4: Python легко и просто. Красиво решаем повседневные задачи

if len(mylist) == 0: raise Exception('Empty list is not acceptable')

Page 5: Python легко и просто. Красиво решаем повседневные задачи

>>> bool( 0 ) False >>> bool( [] ) False >>> bool( {} ) False >>> bool( None ) False >>> bool( '' ) False

Page 6: Python легко и просто. Красиво решаем повседневные задачи

if mylist: raise Exception('Empty list is not acceptable')

Page 7: Python легко и просто. Красиво решаем повседневные задачи

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 легко и просто. Красиво решаем повседневные задачи

if mylist == None: do_something()

Page 9: Python легко и просто. Красиво решаем повседневные задачи

if mylist == None: do_something()

if mylist is None: do_something()

Page 10: Python легко и просто. Красиво решаем повседневные задачи

$ 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 легко и просто. Красиво решаем повседневные задачи

• Всё в 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 легко и просто. Красиво решаем повседневные задачи

• В Python есть неизменяемые объекты. Их значение не меняется после создания:

• Числа - 0, 245, 10000000000000001• Строки - 'Hi people!'• Кортежи (неизменяемые списки) - (1,2, 'a')• И, конечно же, None !

Page 13: Python легко и просто. Красиво решаем повседневные задачи

if mylist: raise Exception('Empty list is not acceptable')

Page 14: Python легко и просто. Красиво решаем повседневные задачи

BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StandardError | +-- BufferError | +-- ArithmeticError | | +-- FloatingPointError | | +-- OverflowError | | +-- ZeroDivisionError

Page 15: Python легко и просто. Красиво решаем повседневные задачи

class EmptyListError(Exception): pass if not mylist: raise EmptyListError('Empty list is not acceptable')

Page 16: Python легко и просто. Красиво решаем повседневные задачи

try: work_with_list([]) except EmptyListError: # we know what's wrong

try: work_with_list([]) except Exception: # what to do?

Page 17: Python легко и просто. Красиво решаем повседневные задачи

• Python знает, где истина.• ‘is None’ лучше, чем ‘== None’.• Всё объект!• Создавать свои собственные исключения круто.

Page 18: Python легко и просто. Красиво решаем повседневные задачи

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 легко и просто. Красиво решаем повседневные задачи

for i in range(len(mylist)): print mylist[i]

Page 20: Python легко и просто. Красиво решаем повседневные задачи

for i in range(len(mylist)): print mylist[i]

for item in mylist: print item

Page 21: Python легко и просто. Красиво решаем повседневные задачи

import itertools for i in itertools.count(): print i

Page 22: Python легко и просто. Красиво решаем повседневные задачи

for item in reversed(mylist): print item

Page 23: Python легко и просто. Красиво решаем повседневные задачи

for item in reversed(mylist): print item

>>> mylist = [1,2,3] >>> mylist[::-1] [3, 2, 1]

Page 24: Python легко и просто. Красиво решаем повседневные задачи

$ 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 легко и просто. Красиво решаем повседневные задачи

$ 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 легко и просто. Красиво решаем повседневные задачи

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 легко и просто. Красиво решаем повседневные задачи

for hero, color in zip(heroes, colors): print hero, 'is', color

Page 28: Python легко и просто. Красиво решаем повседневные задачи

heroes_with_colors = dict(zip(heroes, colors)) print heroes_with_colors

{ 'Spiderman': 'red', 'Batman': 'black', 'Hulk': 'green' }

Page 29: Python легко и просто. Красиво решаем повседневные задачи

from itertools import izip for hero, color in izip(heroes, colors): print hero, 'is', color

Page 30: Python легко и просто. Красиво решаем повседневные задачи

>>> for i in 'python': i ... 'p' 'y' 't' 'h' 'o' 'n'

Page 31: Python легко и просто. Красиво решаем повседневные задачи

>>> for i in 'python': i ... 'p' 'y' 't' 'h' 'o' 'n'

>>> for key in heroes_with_colors: key ... 'Spiderman' 'Batman' 'Hulk'

Page 32: Python легко и просто. Красиво решаем повседневные задачи

>>> 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 легко и просто. Красиво решаем повседневные задачи

>>> for line in myfile: ... print repr(line) # each line in a file ...

Page 34: Python легко и просто. Красиво решаем повседневные задачи

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 легко и просто. Красиво решаем повседневные задачи

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 легко и просто. Красиво решаем повседневные задачи

f = open('config.txt') try:

for line in iterate_lines(f): do_some_staff(line)

finally: f.close()

Page 37: Python легко и просто. Красиво решаем повседневные задачи

>>> mylist ['a', 'b', 'b', 'c'] >>> for index, item in enumerate(mylist): ... if item == 'b': ... del mylist[index] ... >>> mylist ['a', 'b', 'c']

Page 38: Python легко и просто. Красиво решаем повседневные задачи

>>> 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 легко и просто. Красиво решаем повседневные задачи

>>> for key in mydict.keys(): ... if key == 'b': ... del mydict[key] ... >>> mydict {}

Page 40: Python легко и просто. Красиво решаем повседневные задачи

f = open('config.txt') try:

for line in iterate_lines(f): do_some_staff(line)

finally: f.close()

Page 41: Python легко и просто. Красиво решаем повседневные задачи

with EXPR as VAR: BLOCK

Page 42: Python легко и просто. Красиво решаем повседневные задачи

with open('config.txt') as f: process_file(f)

Page 43: Python легко и просто. Красиво решаем повседневные задачи

try: dangerous_actions() except AttributeError: pass # we don't care

Page 44: Python легко и просто. Красиво решаем повседневные задачи

from contextlib import contextmanager @contextmanager def ignore_errors(*errors): try: yield except errors: pass

Page 45: Python легко и просто. Красиво решаем повседневные задачи

>>> with ignore_errors(KeyError, AttributeError): ... raise KeyError ... >>>

Page 46: Python легко и просто. Красиво решаем повседневные задачи

with open('config.txt') as f: for line in iterate_lines(f): do_some_staff(line)

Page 47: Python легко и просто. Красиво решаем повседневные задачи

• Итерируйтесь правильно• Отделяйте административную логику от бизнес логики• Не изменяйте список, по которому итерируетесь• Контекстные менеджеры молодцы

Page 48: Python легко и просто. Красиво решаем повседневные задачи

Большое спасибо за внимание!