10 скрытых особенностей Python

Что скрывает от нас 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. Зачастую это очень удобно, поскольку позволяет писать более компактный код, сохраняя его читабельность.

Дополнительные материалы по теме:

Комментарии

ВАКАНСИИ

Добавить вакансию
Разработчик C++
Москва, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ