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

5,269 views

Published on

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

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,269
On SlideShare
0
From Embeds
0
Number of Embeds
2,144
Actions
Shares
0
Downloads
74
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

  1. 1. Python: легко и просто.Красиво решаем повседневные задачи.Александр Семенюкa_semianiuk@wargaming.net
  2. 2. Python делает всё, чтобы упростить вашу жизнь.Этот язык предоставляет многообразие инструментов,позволяющих легко решать многие задачи.
  3. 3. if len(mylist) == 0:raise Exception(Empty list is not acceptable)
  4. 4. >>> bool( 0 )False>>> bool( [] )False>>> bool( {} )False>>> bool( None )False>>> bool( )False
  5. 5. if mylist:raise Exception(Empty list is not acceptable)
  6. 6. class Basket(object):empty = Trueitems = []def __nonzero__(self):return not self.emptydef __len__(self):return len(self.items)basket = Basket()print bool(basket) # False
  7. 7. if mylist == None:do_something()
  8. 8. if mylist == None:do_something()if mylist is None:do_something()
  9. 9. $ 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
  10. 10. • Всё в Python – это объект.• Каждая переменная – ссылка на объект.• Оператор is сравнивает эти ссылки.class A:passa = A()b = aprint a is bprint id(a)print id(b)True3327461633274616
  11. 11. • В Python есть неизменяемые объекты. Их значение не меняетсяпосле создания:• Числа - 0, 245, 10000000000000001• Строки - Hi people!• Кортежи (неизменяемые списки) - (1,2, a)• И, конечно же, None !
  12. 12. if mylist:raise Exception(Empty list is not acceptable)
  13. 13. BaseException+-- SystemExit+-- KeyboardInterrupt+-- GeneratorExit+-- Exception+-- StopIteration+-- StandardError| +-- BufferError| +-- ArithmeticError| | +-- FloatingPointError| | +-- OverflowError| | +-- ZeroDivisionError…
  14. 14. class EmptyListError(Exception):passif not mylist:raise EmptyListError(Empty list is not acceptable)
  15. 15. try:work_with_list([])except EmptyListError:# we know whats wrongtry:work_with_list([])except Exception:# what to do?
  16. 16. • Python знает, где истина.• ‘is None’ лучше, чем ‘== None’.• Всё объект!• Создавать свои собственные исключения круто.
  17. 17. try:f = open(config.txt)line = f.readline()while line:line = line.strip( n)if not line:continueif line.startswith(#):continuedo_some_staff(line)line = f.readline()finally:f.close()
  18. 18. for i in range(len(mylist)):print mylist[i]
  19. 19. for i in range(len(mylist)):print mylist[i]for item in mylist:print item
  20. 20. import itertoolsfor i in itertools.count():print i
  21. 21. for item in reversed(mylist):print item
  22. 22. for item in reversed(mylist):print item>>> mylist = [1,2,3]>>> mylist[::-1][3, 2, 1]
  23. 23. $ 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
  24. 24. $ 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
  25. 25. 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]
  26. 26. for hero, color in zip(heroes, colors):print hero, is, color
  27. 27. heroes_with_colors = dict(zip(heroes, colors))print heroes_with_colors{Spiderman: red,Batman: black,Hulk: green}
  28. 28. from itertools import izipfor hero, color in izip(heroes, colors):print hero, is, color
  29. 29. >>> for i in python: i...python
  30. 30. >>> for i in python: i...python>>> for key in heroes_with_colors: key...SpidermanBatmanHulk
  31. 31. >>> for i in python: i...python>>> for key in heroes_with_colors: key...SpidermanBatmanHulk>>> import re>>> for match in re.finditer(pattern, string):... # each match in the string...
  32. 32. >>> for line in myfile:... print repr(line) # each line in a file...
  33. 33. f = open(config.txt)try:for line in f:line = line.strip( n)if not line:continueif line.startswith(#):continuedo_some_staff(line)finally:f.close()
  34. 34. def iterate_lines(f):for line in f:line = line.strip( n)if not line:continueif line.startswith(#):continueyield line
  35. 35. f = open(config.txt)try:for line in iterate_lines(f):do_some_staff(line)finally:f.close()
  36. 36. >>> mylist[a, b, b, c]>>> for index, item in enumerate(mylist):... if item == b:... del mylist[index]...>>> mylist[a, b, c]
  37. 37. >>> 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
  38. 38. >>> for key in mydict.keys():... if key == b:... del mydict[key]...>>> mydict{}
  39. 39. f = open(config.txt)try:for line in iterate_lines(f):do_some_staff(line)finally:f.close()
  40. 40. with EXPR as VAR:BLOCK
  41. 41. with open(config.txt) as f:process_file(f)
  42. 42. try:dangerous_actions()except AttributeError:pass # we dont care
  43. 43. from contextlib import contextmanager@contextmanagerdef ignore_errors(*errors):try:yieldexcept errors:pass
  44. 44. >>> with ignore_errors(KeyError, AttributeError):... raise KeyError...>>>
  45. 45. with open(config.txt) as f:for line in iterate_lines(f):do_some_staff(line)
  46. 46. • Итерируйтесь правильно• Отделяйте административную логику от бизнес логики• Не изменяйте список, по которому итерируетесь• Контекстные менеджеры молодцы
  47. 47. Большое спасибо за внимание!

×