Comments 83
> к которой можно отнести и создание новых списков, и модификацию существующих.
Как, используя list comprehension, модифицировать существующий список?
Как, используя list comprehension, модифицировать существующий список?
От условия в цикле можно избавиться используя defaultdict(int).
Есть еще замечательная штука generator expressions, похож на list comprehension, только создается не список, а его элементы. :) Памяти ест намного меньше. Как-то так. :)
Так и называется, потому что создается генератор элементов :)
Генераторы вообще отличная штука.
Генераторы вообще отличная штука.
List comprehension - это и есть генератор, пропущеный через функцию list() путём помещения в квадратные скобки. А вот если всё так не упрощать, можно получить всякие замечательные штуки, например, объект, генерирующий бесконечную последовательность, элемент за элементом.
Понятно, конечно, что xrange в первом примере статьи использовался как пример к последующему материалу, но применение range для создания списка нечетных числе выглядит более очевидным, да и работает быстрее. Впрочем, в Python 3000, если не ошибаюсь, range приобретет поведение xrange, а последний исчезнет.
Спасибо за статьи!
Спасибо за статьи!
dic.has_key(x) не быстрее x in dic ??
Вызов метода происходит дольше. И вообще, метод has_key, вроде, устаревшим уже считается.
именно. :) мне пришлось переучиваться.
кстати, open вроде тоже depricated... надо пользовать file.
кстати, open вроде тоже depricated... надо пользовать file.
По крайней мере для 2.5 документация рекомендует для открытия файлов использовать именно
open
, а file
оставить как тип. Поменялось ли что-то по этому поводу в 3.0, не помню.http://docs.python.org/lib/bltin-file-ob…
или я что-то неправильно понял?
или я что-то неправильно понял?
То, что
file
новее open
и идентичен ему, не значит, что старая функция стала deprecated. Раздел built-in functions рекомендует семантическое разделение, которое я полностью поддерживаю.for line in file читается лучше, чем for line in open.
"list comprehensions" часто переводят, как "генераторы списков"
фак май брайн!
А питон, я на него смогу перейти с php?
А питон, я на него смогу перейти с php?
Раз уж проскочила lamda, дальше лучше про функциональное программирование. За статьи спасибо. Давно хотел почитать, но было лень, а тут все готовое :)
Спасибо за статью. Примеры достаточно интересные, вроде бы и раньше про это знал, однако на практике часто забываю.
"# 2 заполняем словарь" можно чуток сократить
rmp = {}
for ip, traffic in raw:
rmp[ip] = rmp.get(ip, 0) + int(traffic)
"# 2 заполняем словарь" можно чуток сократить
rmp = {}
for ip, traffic in raw:
rmp[ip] = rmp.get(ip, 0) + int(traffic)
можно. я пытался не запутать все совсем окончательно :)
from collections import defaultdict
rmp = defaultdict(int)
for ip, bytes in raw:
rmp[ip] += int(bytes)
Так гораздо приятнее, по-моему :)
rmp = defaultdict(int)
for ip, bytes in raw:
rmp[ip] += int(bytes)
Так гораздо приятнее, по-моему :)
вариант не мой, но внушает :)
свернуть по вкусу.
l = (lambda f:
(lambda l: l.sort(reverse = True, key = lambda (k, v): v) or l)(
(lambda m, f:
filter(
lambda (i, t):
m.__setitem__(i, m.get(i, 0) + int(t)),
[j.split(' ') for j in file(f, 'r').readlines()]
) or m.items()
)({}, f)
)
)('in.txt')
print '\n'.join('%s = %d' % (i, t) for (i, t) in l)
свернуть по вкусу.
на счет дельнеших уроков - я за ООП.. ибо питон сам по себе ООП язык - он на это больше их ориентирован
Присоединяюсь! Хотелось бы почитать о «new-style» классах.
class MyClass:
# old-style class
pass
class MyClass(object):
# new-style class
pass
Как-то так (:
# old-style class
pass
class MyClass(object):
# new-style class
pass
Как-то так (:
ага, только еше super, mro и метапрограммирование.
ага, только еще super, mro и метапрограммирование.
Ну, это-то я знаю... Хотелось бы почитать про идеологические различия и про то, почему в Python 3000 все классы станут «new-style».
Раз уш использовали xrange то и вместо for name, salary in dic.items() лучше for name, salary in dic.iteritems() :)
А вообще спасибо) давайте продолжим ООП?)
А вообще спасибо) давайте продолжим ООП?)
Вы бы добавили про разницу range и xrange...
range создает список, а затем по нему проходит. Если список очень большой, то он будет жить в памяти и сожрет много ресурсов.
xrange возвращает "xrange object". Каждый элемент поочередно создается и передается, затем память освобождается.
Например, x = range(0,10) создаст list и передаст его переменной x.
>>> print x
[1, 2, 3, 4, 5, 6, 7, 8, 9]
С xrange такой фокус не прокатит:
>>> x = xrange(0,10)
>>> print x
xrange(10)
range создает список, а затем по нему проходит. Если список очень большой, то он будет жить в памяти и сожрет много ресурсов.
xrange возвращает "xrange object". Каждый элемент поочередно создается и передается, затем память освобождается.
Например, x = range(0,10) создаст list и передаст его переменной x.
>>> print x
[1, 2, 3, 4, 5, 6, 7, 8, 9]
С xrange такой фокус не прокатит:
>>> x = xrange(0,10)
>>> print x
xrange(10)
Спасибо, очень интересно и практично. Не оторвано от реально жизни...
Как по мне, так ООП и так мейн стрим, найти инфу, что про него, что про ООП в питоне ю не так уж и сложно.
А вот с функциональным, все гораздо печальней. Найти материал, для чего функциональное программирование может быть полезным, не математику да еще и в питоне, не такто легко.
Так что обеими руками за функциональное программирование.
Как по мне, так ООП и так мейн стрим, найти инфу, что про него, что про ООП в питоне ю не так уж и сложно.
А вот с функциональным, все гораздо печальней. Найти материал, для чего функциональное программирование может быть полезным, не математику да еще и в питоне, не такто легко.
Так что обеими руками за функциональное программирование.
http://www.developers.org.ua/archives/ad…
вот неплохая статья "зачем" :) а "как" - постараюсь вскоре рассказать :)
вот неплохая статья "зачем" :) а "как" - постараюсь вскоре рассказать :)
Спасибо за ссылку! Кажется даже читал в свое время :)
Но опять же, даже эта статья не дает простых, чётких примеров. Она интригует и манит, обещая невероятные чудеса... но не показывает их :)
Хотя думаю на деле все проще, и разница примерно как между Windows vs Linux. Фанаты спорят до хрипоты, а разумные так или иначе используют и то и другое. :)
Поэтому очень хочется увидеть в примерах, как это может упростит наш тяжелы, бессмысленный труд :)
PS - чую, что как человеку разрабатывающему на JavaScript, многие вещи окажутся очень знакомыми. Я же правильно понимаю, что анонимные ф-ции, замыкания и map reduce это все из ф-циональной оперы?
Но опять же, даже эта статья не дает простых, чётких примеров. Она интригует и манит, обещая невероятные чудеса... но не показывает их :)
Хотя думаю на деле все проще, и разница примерно как между Windows vs Linux. Фанаты спорят до хрипоты, а разумные так или иначе используют и то и другое. :)
Поэтому очень хочется увидеть в примерах, как это может упростит наш тяжелы, бессмысленный труд :)
PS - чую, что как человеку разрабатывающему на JavaScript, многие вещи окажутся очень знакомыми. Я же правильно понимаю, что анонимные ф-ции, замыкания и map reduce это все из ф-циональной оперы?
в общем - по всем пунктам вы правы. даже и добавить нечего :)
нет, функции высшего порядка, замыкания и свёртки не являются прерогативой фп. лексические замыкания, например, появились первыми в императивных языках, потом их подхватили функциональные, потом императивные позаимствовали у функциональных функции высшего порядка и свёртки.
list comprehension => списковое включение (?)
возможно. не могу спорить, но мне этот термин почему-то кажется каким-то громоздким и непонятным. ъотя омжет я не прав.
Общепринятого перевода нет, насколько я знаю, даже для соответствующего теоретико-множественного понятия, от которого и пошёл английский термин. Все равно тащить математические истоки не получится, ZF-нотация будет звучать совсем дико. Списковые включения, списковые выделения…
>print "\n".join(["%s = %d" % (name, salary) for name, salary in dic.items()])
моожно так print "\n".join("%s = %d" % (name, salary) for name, salary in dic.items())
Ваш вариант генерит список и он отдаётся дойну, второй вариант создаёт генератор на пододе xrange.
А вообще продолжайте в том же духе, пусть народ пишет на питон "правильно" :)
моожно так print "\n".join("%s = %d" % (name, salary) for name, salary in dic.items())
Ваш вариант генерит список и он отдаётся дойну, второй вариант создаёт генератор на пододе xrange.
А вообще продолжайте в том же духе, пусть народ пишет на питон "правильно" :)
if ip in rmp: rmp[ip] += int(traffic)
else: rmp[ip] = int(traffic)
ужос. так нельзя?
if ip in rmp: rmp[ip] = ( rmp[ip] || 0 ) + int(traffic)
else: rmp[ip] = int(traffic)
ужос. так нельзя?
if ip in rmp: rmp[ip] = ( rmp[ip] || 0 ) + int(traffic)
А на хабре никак нельзя использовать подсветку кода? Ну или хотя бы форматирование что бы сохраняло - удобнее читать. А то через строчку - неудобно, да и преимущество форматирования табами - не так заметно.
Ну и стоило сказать,что не надо увлекаться подобного рода сахаром в явный ужерб читабельности :)
Ну и стоило сказать,что не надо увлекаться подобного рода сахаром в явный ужерб читабельности :)
Скажите, а продолжение будет?
И не подскажите где можно найти разнообразных задачек?
И не подскажите где можно найти разнообразных задачек?
спасибо за хороший цикл статей, надеюсь, что напишите-таки продолжение.
и просьба-совет — было бы очень удобно, если бы в начале давались ссылки на остальные статьи этого цикла.
и просьба-совет — было бы очень удобно, если бы в начале давались ссылки на остальные статьи этого цикла.
Действительно отличный цикл статей для людей, который вообще с пайтоном не знакомы (как я :)).
Но последний пример можно реализовать в 8 строк читаемого кода на PHP (в примере я насчитал 10):
Но последний пример можно реализовать в 8 строк читаемого кода на PHP (в примере я насчитал 10):
Sign up to leave a comment.
Основы Python — кратко. Часть 4. Генераторы списков