Blog Trac Lyrics for music

Забытые возможности Python

У всех на слуху и часто используются такие возможности Python, как генераторы, декораторы, list comprehensions, оператор with… Но есть в Питоне и некоторые возможности, которые достаточно мало кому известны.

Например, то что в list comprehensions можно использовать “вложенные” циклы:


   >>> [a + b for a in 'abc' for b in 'de']
   ['ad', 'ae', 'bd', 'be', 'cd', 'ce']
   

Или вот другая возможность - сравнения цепочкой Питон трактует в математическом смысле, а не в программистском. То есть, x < y <= z интерпретируется как x < y and y <= z, не учитывая того, что в первом варианте y вычисляется единожды, а во втором - дважды. Примеры использования:


   >>> 'a' in 'ab' in 'abc'
   True
   >>> 5 in [5] in [[5]]
   True
   >>> 'a' in 'abcd' in ['abcd', 'adf']
   True
   >>> a = 5
   >>> a == 5 != 234
   True
   

Понятное дело, что использовать можно любые комбинации операций, как бы они неприглядно не выглядели:


   >>> 5 < 20 in (20,30)
   True
   >>> 5 > 1 < 5
   True
   >>> 5 is not None < 20
   True
   >>> 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8
   True
   

P.S.Есть ещё пару вещей, про них я чуть позже расскажу.

Add post to: Delicious Reddit Slashdot Digg Technorati Google
(already: 0) Comment post

Comments

8.12.2007 10:45 ivan-sagalaev

Странно, у меня было четкое впечатление, что возможность использования вложенных for в генераторном выражении именно в таком виде появилась только в 2.5. Сейчас посмотрел -- в 2.4 тоже работает. Спасибо за наводку :-)

Comment form for «Забытые возможности Python»

Required. 30 chars of fewer.

Required.

8.12.2007 10:45 dvska

Спасибо, про “вложенные” циклы не знал.

8.12.2007 10:45 winnie

А много вообще мест, где такое нужно? А то я навскидку ни одного не придумал.

У меня только что было :)

letters = map(chr, range(ord('a'), ord('z')+1) + range(ord('0'), ord('9')+1)) + [ '_' ]

def typo_variants(word):
    misses = [ word[:i] + word[i+1:] for i in range(len(word)) ]
    inserts = [ word[:i] + c + word[i:] for i in range(len(word) + 1) for c in letters ]
    replaces = [ word[:i] + c + word[i+1:] for i in range(len(word)) for c in letters ]
    return set(misses + inserts + replaces)

http://www.everfall.com/paste/id.php?voq98pe96bb5

Comment post