Comments 30
такое ощущение, что все эти трюки сделали для того, что бы не путаться с отступами :-)
-18
В 3.2 для значений не повтор .items(), а .values()
+2
Спасибо, занес в избранное. Еще пару статей — распечатаю и подошью :)
+3
Спасибо за any, all & enumerate — как-то пропустил.
+6
reduce убрали в 3 питоне из глобального пространства имен. Имхо правильно: лучше лишнию строку написать, чем при чтении задумываться.
0
Cапасибо за Ваши статьи.
Как раз начал изучать Python…
Как раз начал изучать Python…
+1
Set по-русски это множество. Математически не совсем точно, но все же.
+2
«Это чуть менее читабельно, чем строгие генераторы списков, но я считаю, что это лучше, чем большой цикл for.»
лучше чем?
лучше чем?
0
Большое спасибо, изучать тонкости питона по Вашим статьям намного интереснее, чем по книгам))
-2
Продолжение следует.
Вот это радует, да! :)
И спасибо Вам.
+1
а в 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.*?
reduce() ушел в модуль functools
xrange() стал просто range()
dict.keys(), dict.items(), dict.values() теперь возвращают не список, а (???)вид (view).
И вообще, когда мир решит, что стоит писать «гайды» уже для python 3.*?
+2
UFO just landed and posted this here
Если верить истории коммитов, разработка ведётся довольно активно.
0
С PyGTK тоже все не весело — https://bugzilla.gnome.org/show_bug.cgi?id=566641, хотя Qt4 есть для 3.1
0
Спасибо за «3.1 Создание словаря с помощью именованных аргументов»
0
А вот reduce для пустого элемента вернет ошибку, что не очень удобно. Если бы он мог принимать помимо лямбды и собственно массива еще «значение» по умолчанию, такой проблемы бы не было. Жду следующей статьи.
Пока для себя уяснил, что ruby хоть и медленней, но такие вещи как any, all, проход по массиву, reduce сделаны гораздо красивее.
Пока для себя уяснил, что ruby хоть и медленней, но такие вещи как any, all, проход по массиву, reduce сделаны гораздо красивее.
0
Гвидо ФП не очень жалует, хотел из py3k чуть ли не map выкинуть, т.к. считает, что практически все эти трюки скорее снижают понятность кода, а не повышают ее. Из-за этого же лямбды такие урезанные, чтобы разработчики писали не «крутой» код, а понятный код.
Пописал месяц на js, где ФП-составляющая не урезанная, захотелось после этого попробовать ruby. Но вместе с тем осознаю, что в питоне из-за всех этих ограничений код и правда проще/понятнее получается, в них, определенно, есть смысл.
Пописал месяц на js, где ФП-составляющая не урезанная, захотелось после этого попробовать ruby. Но вместе с тем осознаю, что в питоне из-за всех этих ограничений код и правда проще/понятнее получается, в них, определенно, есть смысл.
0
а я вот зашел на 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 пуст
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 пуст
+1
Ну собственно трюки довольно знакомые среднестатистическому питонщику, однако спасибо, что выложили всё это в одном месте.
0
А у меня завтра собеседование по поводу python-разработки! Прочитал, немного порадовался с той стороны, что всё это знаю, а с другой огорчился, что не знаю как сделать более глубокое погружение в язык.
+1
А Вы уже смотрели эту статью?
+1
Спасибо за статью, я как то all и any упустил.
Я бы добавил, что в enumerate появился параметр start, так что первый индекс может отличаться от нуля.
И, думаю, раз уже начали рассказывать разные вкусности по работе со списками, то следует затронуть модуль itertools
Я бы добавил, что в enumerate появился параметр start, так что первый индекс может отличаться от нуля.
И, думаю, раз уже начали рассказывать разные вкусности по работе со списками, то следует затронуть модуль itertools
0
может кого-то спасёт:
использование iteritems/itervalues/iterkeys (вместо их неитерационных аналогов) могут значительно ускорить работу в CPython.
использование items/values/keys порождает новые структуры и (часто) увеличивает ref counts на элементы материнского словарика. В результате может образоваться плохо воспроизводимое замедление, у меня бывало замедление более 10раз.
использование iteritems/itervalues/iterkeys (вместо их неитерационных аналогов) могут значительно ускорить работу в CPython.
использование items/values/keys порождает новые структуры и (часто) увеличивает ref counts на элементы материнского словарика. В результате может образоваться плохо воспроизводимое замедление, у меня бывало замедление более 10раз.
0
Имитируя 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())
Т.е. вместо:
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())
0
Лучший 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.
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.
0
Sign up to leave a comment.
Articles
Change theme settings
Python Tips, Tricks, and Hacks (часть 2)