Pull to refresh

Comments 30

такое ощущение, что все эти трюки сделали для того, что бы не путаться с отступами :-)
В 3.2 для значений не повтор .items(), а .values()
Спасибо, занес в избранное. Еще пару статей — распечатаю и подошью :)
Спасибо за any, all & enumerate — как-то пропустил.
reduce убрали в 3 питоне из глобального пространства имен. Имхо правильно: лучше лишнию строку написать, чем при чтении задумываться.
Cапасибо за Ваши статьи.
Как раз начал изучать Python…
Set по-русски это множество. Математически не совсем точно, но все же.
«Это чуть менее читабельно, чем строгие генераторы списков, но я считаю, что это лучше, чем большой цикл for.»

лучше чем?
Чем большой цикл for.
Так то!
Большое спасибо, изучать тонкости питона по Вашим статьям намного интереснее, чем по книгам))
Продолжение следует.

Вот это радует, да! :)
И спасибо Вам.
Не отказался бы почитать про lambda-функции поподробнее, ну и про «накоротко замкнутые» выражения.
Иначе сам напишу =)
а в 3 есть нормальные Dictionary Comprehensions {i: chr(65+i) for i in range(4)}
reduce() ушел в модуль functools
xrange() стал просто range()
dict.keys(), dict.items(), dict.values() теперь возвращают не список, а (???)вид (view).

И вообще, когда мир решит, что стоит писать «гайды» уже для python 3.*?
UFO just landed and posted this here
Хотя, похоже, меня ввели в заблуждение коммиты из djagno-trunk.
Спасибо за «3.1 Создание словаря с помощью именованных аргументов»
А вот reduce для пустого элемента вернет ошибку, что не очень удобно. Если бы он мог принимать помимо лямбды и собственно массива еще «значение» по умолчанию, такой проблемы бы не было. Жду следующей статьи.
Пока для себя уяснил, что ruby хоть и медленней, но такие вещи как any, all, проход по массиву, reduce сделаны гораздо красивее.
Гвидо ФП не очень жалует, хотел из py3k чуть ли не map выкинуть, т.к. считает, что практически все эти трюки скорее снижают понятность кода, а не повышают ее. Из-за этого же лямбды такие урезанные, чтобы разработчики писали не «крутой» код, а понятный код.

Пописал месяц на js, где ФП-составляющая не урезанная, захотелось после этого попробовать ruby. Но вместе с тем осознаю, что в питоне из-за всех этих ограничений код и правда проще/понятнее получается, в них, определенно, есть смысл.
а я вот зашел на docs.python.org и прочитал про reduce:
reduce(function, iterable[, initializer])
...If the optional initializer is present, it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty…

Что означает: Если не обязательный параметр initializer присутствует, то он подставляется в вычислениях перед элементами iterable, а также служит значением по умолчанию, если iterable пуст
Ну собственно трюки довольно знакомые среднестатистическому питонщику, однако спасибо, что выложили всё это в одном месте.
А у меня завтра собеседование по поводу python-разработки! Прочитал, немного порадовался с той стороны, что всё это знаю, а с другой огорчился, что не знаю как сделать более глубокое погружение в язык.
Спасибо за статью, я как то all и any упустил.
Я бы добавил, что в enumerate появился параметр start, так что первый индекс может отличаться от нуля.
И, думаю, раз уже начали рассказывать разные вкусности по работе со списками, то следует затронуть модуль itertools
может кого-то спасёт:

использование iteritems/itervalues/iterkeys (вместо их неитерационных аналогов) могут значительно ускорить работу в CPython.

использование items/values/keys порождает новые структуры и (часто) увеличивает ref counts на элементы материнского словарика. В результате может образоваться плохо воспроизводимое замедление, у меня бывало замедление более 10раз.
Имитируя dictionary comprehensions более эффективно использовать tuple вместо list для определения пары (key, value).

Т.е. вместо:

dict([name, '.com' in email] for name, email in emails.iteritems())

надо:

dict((name, '.com' in email) for name, email in emails.iteritems())

А ещё нагляднее:

dict((name, '.com' in email) for (name, email) in emails.iteritems())
Лучший tip, trick and hack – забыть этот вполне заменимый язык:

result = reduce(lambda a,b: a*b, numbers)
vs
result = numbers.inject :*

for index, string in enumerate(strings): print index, string,
vs
puts strings.each_with_index.to_a.join " "

len(numbers) == len(set(numbers))
vs
!numbers.dup.uniq!

BONUS:

" ".join(reversed(sentence.split()))
vs
sentence.split.reverse.join ' '

while True:
stuff()
if fail_condition:
break
or
stuff()
while not fail_condition:
stuff()
vs
begin stuff while not fail_condition

etc. etc. etc.
UFO just landed and posted this here
Sign up to leave a comment.

Articles