Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
if True #{
print "true"
#}
else: #{
print "false!"
#}
import collections
d = collections.defaultdict(list)
d[t].append(a)
d[t].append(b)
Set — это метод превращения списка в контейнер с неповторяющимися элементами
list = [x for x in range(1, 10)]
dict = {a:a**2 for a in range(1, 10)}
>>> [x for x in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> (x for x in range(10))
<generator object <genexpr> at 0x403b46c0>
>>> list((x for x in range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
import copy
my_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}
my_copy_dict = copy.deepcopy(my_dict)
import __hello__
>>> sum(l, [])
import itertools
data = [[1, 2, 3], [4, 5, 6]]
list(itertools.chain.from_iterable(data))
>>> True, False = False, True
>>> True
False
>>> False
True
>>> y = foo()
>>> y.call()
first_call
>>> y.call()
normal_call
>>> y.call()
normal_call
def meow(*args, **kwargs):
print 'Meow?'
def once(predictor):
def wrapper(function):
def decorator(*args, **kwargs):
if not getattr(function, '__predictor_called', False):
predictor(*args, **kwargs)
function.__predictor_called = True
return function(*args, **kwargs)
return decorator
return wrapper
@once(meow)
def woof():
print 'Woof!'
for _ in range(3):
woof()
Meow?
Woof!
Woof!
Woof!
In [1]: True, False = False, True
In [2]: a = 1
In [3]: b = 1
In [4]: a == b
Out[4]: True
In [5]: c = a == b
In [6]: c is True
Out[6]: False
OrderedDict
(сортированном dict
), о котором узнал относительно недавно и который местами очень сильно помогает (например, при формировании REST-запросов, где важен порядок аргументов) и, кроме того, полностью совместим с dict
.>>> a = [1, 2, 3, 4, 5]
>>> a[0]
1
>>> a[~0] # эквивалентно a[-1]
5
0
и ~0
вполне себе есть связь: ~
осуществляет операцию ones' complement, которая в питоне переходит от начала списка к его концу. Не только a[~0]
даст вам последний элемент, но и a[~10]
даст вам десятый элемент (если в a
их столько есть, конечно). Более того, даже в вашем безумном примере a[~True]
срабатывает ровно потому, что True == 1
!Нет. a[~10]
даст мне 11 элемент с конца списка.
Ой ли?И это отличный пример того, что лучше так не делать; приходится считать, чему равен обратный код от 10.То есть при простом обращении вас не напрягает, что
a[10]
даёт не 10й элемент, а 11й, а при обращении a[~10]
эта же путаница вам аж спать не даёт?~
и/или -
…a[10]
даёт мне десятый элемент с начала, a[~10]
— десятый с конца, вы можете называть a[10]
одиннадцатым элементом с начала, а a[~10]
— одиннадцатым с конца, но сути это не меняет: операция ~
«перебрасывает» вас из начала в конец списка и обратно, операция -
не только «перебрасывает» вас из начала в конец, но ещё и сдвигает нумерацию на единицу. Честное слово — мне проще пользоваться операцией, которая делает одно действие, а не два.Чего ради? Слишком много лишних знаний для трех символов кода. Можно просто написать -11.Вот прямо даже так? Написать при «отражении» алгоритма
a[-11]
вместо a[0]
или a[-N-1]
вместо a[N]
вам «проще и понятнее»?a[0]
, к последнему через a[~0]
, к десятому (для вас — к одиннадцатому) с начала через a[10]
, к десятом (для вас — к одиннадцатому) с конца через a[~10]
выглядит куда как проще и логичнее, чем ситуация когда у вас элементы нумеруются с нуля при заходе «слева», но почему-то с единицы при заходе «справа».Можно просто написать -11
a[i], a[j], a[k], a[m]
a[-i - 1], a[-j - 1], a[-k - 1], a[-m - 1]
a[~i], a[~j], a[~k], a[~m]
>>> a = [1, 2, 3, 4, 5]
>>> [a[i] for i in range(5)]
[1, 2, 3, 4, 5]
>>> [a[~i] for i in range(5)]
[5, 4, 3, 2, 1]
>>> [a[-i - 1] for i in range(5)]
[5, 4, 3, 2, 1]
>>> [a[-(i + 1)] for i in range(5)]
[5, 4, 3, 2, 1]
Важно понимать, что без метода set эти операции работать не будут.
from collections import Counter
Counter('habrahabr') # Counter({'a': 3, 'h': 2, 'r': 2, 'b': 2})
class Worm:
def creep(self):
print("i am creeping")
class Butterfly:
def fly(self):
print("i am flying")
creature = Worm()
creature.creep()
creature.__class__ = Butterfly
creature.fly()
# 1.
a, (b, c) = c, (a, b)
# 2.
for x, (y, z) in enumerate(zip('ab', 'cd')):
print(x, y, z) # python 3
>>> 0 a c
>>> 1 b d
def dict_copy(d):
"""
much, much faster than deepcopy, for a dict of the simple python types.
"""
out = d.copy()
for k, v in d.iteritems():
if isinstance(v, dict):
out[k] = dict_copy(v)
elif isinstance(v, list):
out[k] = v[:]
return out
... if x is None:
... x = []
... x = x or []
None
, False
и даже 0
. Хотя это может быть не очень важно в конкретном случае, конечно, но заставляет для понимания достаточно простой, теоретически, конструкции привлекать разнообразное знание из других частей программы.object.__nonzero__()
(object.__bool__()
для Python 3) возвращает False либо (если __nonzero__/__bool__ не определён) object.__len__()
возвращает 0. В общем случае может оказаться, что для вычисления истинности нужны сложные (и длительные) вычисления, хотя это и маловероятно. Выражение x is None
же — просто сравнение двух целых чисел (адресов объектов в памяти) на равенство.x = [] if x is None else x
set([1, 2, 3]) == {1, 2, 3}
set((i*2 for i in range(10))) == {i*2 for i in range(10)}
Все три (set literals, set comprehension, dict comprehension) возможности появились в версиях 2.7 и 3.0.>>> [i for i in xrange(10) if i % 2]
[1, 3, 5, 7, 9]
[1,2,3,4,5,6,7,8,9][0::2]
Python: вещи, которых вы могли не знать