Вопрос-Ответ

Hidden features of Python [closed]

Скрытые возможности Python [закрыты]



Каковы менее известные, но полезные функции языка программирования Python?


  • Постарайтесь ограничить ответы ядром Python.

  • По одной функции на каждый ответ.

  • Приведите пример и краткое описание функции, а не просто ссылку на документацию.

  • Обозначьте функцию, используя заголовок в качестве первой строки.

Быстрые ссылки на ответы:

Переведено автоматически
Ответ 1

Операторы сравнения цепочек:

>>> x = 5
>>> 1 < x < 10
True
>>> 10 < x < 20
False
>>> x < 10 < x*10 < 100
True
>>> 10 > x <= 9
True
>>> 5 == x > 4
True

Если вы думаете, что он выполняет 1 < x, что получается как True, а затем сравнивает True < 10, что тоже True, то нет, на самом деле это не то, что происходит (см. Последний пример.) Это действительно переводится в 1 < x and x < 10, и x < 10 and 10 < x * 10 and x*10 < 100, но с меньшим количеством типов ввода, и каждый термин вычисляется только один раз.

Ответ 2

Получите дерево синтаксического анализа регулярных выражений python для отладки вашего регулярного выражения.

Регулярные выражения - отличная функция python, но их отладка может быть сложной задачей, и слишком легко получить неправильное регулярное выражение.

К счастью, python может печатать дерево синтаксического анализа регулярных выражений, передавая недокументированный, экспериментальный, скрытый флаг re.DEBUG (фактически, 128) в re.compile.

>>> re.compile("^\[font(?:=(?P<size>[-+][0-9]{1,2}))?\](.*?)[/font]",
re.DEBUG)
at at_beginning
literal 91
literal 102
literal 111
literal 110
literal 116
max_repeat 0 1
subpattern None
literal 61
subpattern 1
in
literal 45
literal 43
max_repeat 1 2
in
range (48, 57)
literal 93
subpattern 2
min_repeat 0 65535
any None
in
literal 47
literal 102
literal 111
literal 110
literal 116

Как только вы поймете синтаксис, вы сможете определить свои ошибки. Здесь мы видим, что я забыл экранировать [] в [/font].

Конечно, вы можете комбинировать его с любыми флагами, которые вы хотите, например, с регулярными выражениями с комментариями:

>>> re.compile("""
^ # start of a line
\[font # the font tag
(?:=(?P<size> # optional [font=+size]
[-+][0-9]{1,2} # size specification
))?
\] # end of tag
(.*?) # text between the tags
\[/font\] # end of the tag
"""
, re.DEBUG|re.VERBOSE|re.DOTALL)
Ответ 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

Создание объектов-генераторов

Если вы напишете

x=(n for n in foo if bar(n))

вы можете извлечь генератор и назначить его x . Теперь это означает, что вы можете сделать

for n in x:

Преимущество этого в том, что вам не нужно промежуточное хранилище, которое вам понадобилось бы, если бы вы это сделали

x = [n for n in foo if bar(n)]

В некоторых случаях это может привести к значительному ускорению.

Вы можете добавить множество операторов if в конец генератора, в основном копируя вложенные циклы for:

>>> n = ((a,b) for a in range(0,2) for b in range(4,6))
>>> for i in n:
... print i

(0, 4)
(0, 5)
(1, 4)
(1, 5)
python