10 скрытых особенностей Python
Что скрывает от нас Python? В этой статье вы вероятно найдёте для себя несколько нетипичных тонкостей, которые можно использовать в Python.
1. Цепочки операторов сравнения (chaining comparison):
>>> 1 < 5 < 10 True >>> 1 < 11 < 10 False >>> 1 < 11 > 10 True
Конечно, вся магия исчезнет если добавить скобки:
>>> (1 < 11) > 10 False
2. iter и два параметра
Built-in функция iter возвращает итератор для переданной последовательности. Но если передавать два параметра, то первый должен быть callable-объектом, а второй — результатом вызова первого объекта, при котором нужно прекратить итерацию. Например, читаем из файла до первой пустой строки:
with open('mydata.txt') as fp: for line in iter(fp.readline, ''): process_line(line)
3. Перечисление
Если вы примените enumerate к перечислимому типу, то на выходе получите ещё и индексы:
>>> a = ['a', 'b', 'c', 'd', 'e'] >>> for index, item in enumerate(a): print index, item ... 0 a 1 b 2 c 3 d 4 e >>>
4. contextlib
Позволяет легко и красиво пользоваться синтаксисом with EXPR as VAR для своих собственных объектов, функций и т. д. Пример из документации:
from contextlib import contextmanager @contextmanager def tag(name): print "[%s]" % name yield print "[/%s]" % name >>> with tag("h1"): ... print "foo" ... [h1] foo [/h1]
5. Отладочные скрипты в Python
Вы можете задавать точки останова (breakpoint) при помощи модуля pdb
:
import pdb pdb.set_trace()
Чтобы задать точку останова в любом месте скрипта, напишите там команду pdb.set_trace()
. В pdb
есть ещё несколько интересных штучек, описанных в документации.
6. Обмен значениями переменных
В 10-ом классе нам на уроке информатике предлагали задачку — обменять местами значения двух переменных, не используя третью. В Python это даже не вопрос:
>>> a = 10 >>> b = 5 >>> a, b (10, 5) >>> a, b = b, a >>> a, b (5, 10)
7. Разворачивание списка/строки
Быстро развернуть список можно следующим образом:
>>> a = [1,2,3,4] >>> a[::-1] [4, 3, 2, 1] # Это создаёт новый развёрнутый список. # Развернуть имеющий список: a.reverse()
То же самое можно сделать и со строкой:
>>> foo = "yasoob" >>> foo[::-1] 'boosay'
8. Вложенные list comprehensions
В list comprehensions можно использовать несколько for:
>>> l = [[1,2,3], [4,5,6]] >>> [lll * 2 for ll in l for lll in ll] [2, 4, 6, 8, 10, 12]
9. rot13, string_escape, unicode_escape кодировки
Супер секретный метод шифрования Rot13:
>>> 'Hello world!'.encode('rot13') 'Uryyb jbeyq!' >>> 'Uryyb jbeyq!'.decode('rot13') u'Hello world!'
Далее. Например, есть строка из внешнего источника, при этом в строке есть литералы \n, \t, \r и т.п. Как получить отформатированную строку (по сути, сделать безопасный eval)?
>>> s = 'Hello\\n\\rworld!' >>> s 'Hello\\n\\rworld!' >>> repr(s) "'Hello\\\\n\\\\rworld!'" >>> print s.decode('string_escape') Hello world!
unicode_escape работает аналогично, только с юникодом, а не со строками.
10. Тернарный оператор в Python
Тернарный оператор — это сокращённая форма записи условного выражения if-else. Вот пример использования:
is_fat = True state = "fat" if is_fat else "not fat"
Такой подход позволяет быстро проверить условие, а не писать несколько строчек оператора if
. Зачастую это очень удобно, поскольку позволяет писать более компактный код, сохраняя его читабельность.