Определить метод класса:
class Foo(object):
bar = 1
@classmethod
def bah(cls):
print cls.bar
Теперь, если bah()
должен быть методом экземпляра (т. е. иметь доступ к self), вы все равно можете напрямую обращаться к переменной класса.
class Foo(object):
bar = 1
def bah(self):
print self.bar
Понятия списка более компактны и быстрее, чем явный цикл for
, создающий список:
def slower():
result = []
for elem in some_iterable:
result.append(elem)
return result
def faster():
return [elem for elem in some_iterable]
Это связано с тем, что вызов .append()
на list
заставляет объект списка расти (в кусках), чтобы сделать пространство для новых элементов индивидуально, в то время как понимание списка собирает все элементы перед созданием list
, чтобы соответствовать элементам за один раз:
>>> some_iterable = range(1000)
>>> import timeit
>>> timeit.timeit('f()', 'from __main__ import slower as f', number=10000)
1.4456570148468018
>>> timeit.timeit('f()', 'from __main__ import faster as f', number=10000)
0.49323201179504395
Однако это не значит, что вы должны начинать пользоваться списками для всего! Постижение списка все равно построит объект списка ; если вы используете понимание списка только потому, что оно дает вам однострочный цикл, подумайте еще раз. Вероятно, вы тратите впустую циклы, создавая объект списка, который вы затем отбрасываете. Просто придерживайтесь нормального цикла for
в этом случае.