Забытые возможности 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.Есть ещё пару вещей, про них я чуть позже расскажу.
Comments
Странно, у меня было четкое впечатление, что возможность использования вложенных for в генераторном выражении именно в таком виде появилась только в 2.5. Сейчас посмотрел -- в 2.4 тоже работает. Спасибо за наводку :-)
Спасибо, про “вложенные” циклы не знал.
Comment form for «Забытые возможности Python»
У меня только что было :)
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