Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Ellipsis. На самом деле слишком поверхностная заметка, есть куда более интересная Стиль кода в языке python via. http://habrahabr.ru/post/76738/>>Обратите внимание что вы можете использовать выражение if...else в любом выражение.
Это тоже врядли добавит читабельности
(func1 if y == 1 else func2)(arg1, arg2) выглядит вполне прилично и, что гораздо важнее, естественно. Обычно в таких ситуациях надо писать вилку из условий или делегировать выбор вызываемой функции в другую функцию. Если первое вполне ничего (и в большинстве случаев, конечно, так и надо писать), то второе и нужно редко, и читать неудобно (и незачем плодить сущности, кроме того).# coding: utf-8
from collections import defaultdict
def trydict():
freqs = {}
for c in "abracadabra":
try:
freqs[c] += 1
except:
freqs[c] = 1
def getdict():
freqs = {}
for c in "abracadabra":
freqs[c] = freqs.get(c, 0) + 1
def defdict():
freqs = defaultdict(int)
for c in "abracadabra":
freqs[c] += 1
def indict():
freqs = {}
for c in "abracadabra":
freqs[c] = freqs[c] + 1 if c in freqs else 1
if __name__ == '__main__':
from timeit import Timer
t = Timer("trydict()", "from __main__ import trydict")
print t.timeit()
t = Timer("getdict()", "from __main__ import getdict")
print t.timeit()
t = Timer("defdict()", "from __main__ import defdict")
print t.timeit()
t = Timer("indict()", "from __main__ import indict")
print t.timeit()
c = Counter("abracadabra")
➜ ~ time python dict_speed.py
6.94295406342
4.35391998291
4.43011784554
3.0556640625
python dict_speed.py 18,81s user 0,02s system 99% cpu 18,828 total
➜ ~ time pypy dict_speed.py
0.70256114006
0.649827003479
0.807382106781
0.672923088074
pypy dict_speed.py 2,87s user 0,02s system 99% cpu 2,893 total
def mydict():
freqs = {}
for c in "abracadabra":
if freqs.has_key(c):
freqs[c]+=1
else:
freqs[c]=1
num % 2, а num & 1. Решил протестировать на интерпретаторе Python 2.7.3. Скорость выполнения моего вариант с & оказался чуточку быстрее, чем %. Написал я два скрипта следующих:# odd1.py
numbers = range(30000000)
numbers = [num for num in numbers if not num & 1]
# odd2.py
numbers = range(30000000)
numbers = [num for num in numbers if not num % 2]
time python odd1.py
real 0m4.704s
user 0m4.228s
sys 0m0.388s
time python odd2.py
real 0m5.122s
user 0m4.708s
sys 0m0.376s
x.reverse() есть одна опасность, которая по невнимательности может насолить. reverse() является методом списка и изменяет сам список, а не только возвращает перевёрнутую копию.Частный случай x[::-1] является средством выражения x.reverse()
Существует ряд других магических методов.кто-нибудь объясните, почему
>>> from datetime import date, timedelta
>>> 1 + 1
2
>>> date(2012, 01, 01) + timedelta(days=1)
datetime.date(2012, 1, 2)
>>> range(0, 3, 1)
[0, 1, 2]
>>> range(date(2012,01,01), date(2012,01,03), timedelta(days=1))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: range() integer end argument expected, got datetime.date.def range_(from_, to_, step):
while from_ < to_:
yield from_
from_ += step
>>> from datetime import date, timedelta
>>> min(date(2012,01,01), date(2012, 01, 02))
datetime.date(2012, 1, 1)
>>> min(timedelta(days=3), timedelta(days=2))
datetime.timedelta(2)
Вещи, о которых следует помнить, программируя на Python