Эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.
from decimal import Decimal, getcontext
from itertools import groupby, islice, izip, takewhile, chain, imap
getcontext().prec = 3000
n = (
groupby(
enumerate(
islice(str(1 / Decimal(998001)), 2, None)
),
lambda n: n[0] // 3)
)
n = (int(''.join(n[1] for n in n[1])) for n in n)
n = chain(*takewhile(lambda n: n[1] - n[0] == 1, izip(n, n)))
print ', '.join(imap(str, n))
Кстати, для вычисления дроби с точностью до трёхтысячного знака, используется модуль decimal.from decimal import Decimal, getcontext
getcontext().prec = 3000
number, prev, out = str(1 / Decimal(998001)), -1, []
for i in xrange(2, len(number), 3):
curr = int(number[i:i+3])
if curr - prev != 1: break
prev = curr
out.append(str(curr))
print ', '.join(out)
Sergey Solyanik (profiles.google.com/jankkhvej/)
29 января 2012, 02:29
bolk (bolknote.ru)
29 января 2012, 09:35,
ответ предназначен profiles.google.com/jankkhvej/:
SowingSadness (инкогнито)
29 января 2012, 12:53
bolk (bolknote.ru)
29 января 2012, 15:13,
ответ предназначен SowingSadness
Sergey Solyanik (profiles.google.com/jankkhvej/)
29 января 2012, 17:59,
ответ предназначен bolk (bolknote.ru):
Sergey Solyanik (profiles.google.com/jankkhvej/)
29 января 2012, 18:00,
ответ предназначен bolk (bolknote.ru):
bolk (bolknote.ru)
29 января 2012, 19:07,
ответ предназначен profiles.google.com/jankkhvej/:
умеют ли существующие процессоры эффективно работать с такими языкамиПроцессоры — нет. Процессоры-то тут причём? Это всё равно раскрывается в обычные циклы с условиями, процессорам всё равно какие там конструкции.
Кстати, а почему у вас в блоге время не в моём часовом поясе, и это никак не обозначено?Я даже как-то теряюсь перед вашим вопросом. Наверное потому что это
Fulcrum (fulc.ru)
29 января 2012, 19:14,
ответ предназначен bolk (bolknote.ru):
n = (int(''.join(n[1] for n in n[1])) for n in n)Почему тут все n? :) В остальных строках кода, кстати, тоже. Во втором примере они хоть и сокращенные, но можно предположить по названиям, что они означают.
bolk (bolknote.ru)
29 января 2012, 19:53,
ответ предназначен Fulcrum (fulc.ru):
Почему тут все n? :)Ну, сначала там не «n» были, это уже для запутывания :)
Sergey Solyanik (profiles.google.com/jankkhvej/)
29 января 2012, 21:06,
ответ предназначен bolk (bolknote.ru):
bolk (bolknote.ru)
29 января 2012, 21:45,
ответ предназначен profiles.google.com/jankkhvej/:
Тем более, что везде практически так и происходит.Где, например?
Насчёт того, что неважно, какой процессор – ну как же ж?! А кто будет исполнять код-то?! Мерлин? Пушкин? ;)Процессор. Я же написал — эти конструкции всё одно будут развёрнуты в циклы и условия. Всё равно процессору что там за конструкции. Вопрос, наверное, в том насколько эффективно будут развёрнуты. Но тут вопрос реализации, сами по себе конструкции каких-то ограничений в этом смысле не несут.
Fulcrum (fulc.ru)
30 января 2012, 01:50,
ответ предназначен bolk (bolknote.ru):
string = str(1 / Decimal(99800))Ну и так далее. В сочетании с несокращенными названиями переменных получается, на мой взгляд, гораздо понятнее.
digits = islice(str(string, 2, None)
grouped_digits = groupby(enumerate(digits), lambda index, digit: index // 3)
grouped_digits = (data for grouper, data in grouped_digits)
numbers = (''.join(digit for index, digit in group) for group in grouped_digits)
bolk (bolknote.ru)
30 января 2012, 09:25,
ответ предназначен Fulcrum (fulc.ru):
Fulcrum (fulc.ru)
30 января 2012, 10:56,
ответ предназначен bolk (bolknote.ru):
Ну и использование промежуточных переменных всё ломает, так как, попытайся я встроить что-то в цепочку, мне придётся переименовывать переменныеНе очень понял. Если вставить что-то в цепочку в твоем примере, то придется (в общем случае) все равно переписывать то, что идет выше уровнем, потому что данные просто другие будут. В моем случае - в тех строчках, где данные другие, ты все равно будешь менять правую часть, ну и заодно переменные переименуешь. А с того момента, когда данные становятся такими же, все останется прежним.
и ещё убедиться, что ниже они нигде не используются.Это уже другая задача, я опять не вижу связи с ленивыми выражениями. Вот ты не боишься, что у тебя во втором коде "prev" где-то ниже будет использоваться? Вообще, если название переменной описывает ее содержание (у меня не совсем так, "grouped_digits" используется два раза, но мне было лень думать, как назвать дополнительную переменную), то вероятность двойного использования переменной снизится. Также снизится и от разделения кода на независимые функции.
Sergey Solyanik (profiles.google.com/jankkhvej/)
30 января 2012, 11:11,
ответ предназначен bolk (bolknote.ru):
Всё равно процессору что там за конструкции. Вопрос, наверное, в том насколько эффективно будут развёрнуты.Я про это и спрашивал. Наверное, как-то не очевидно. Ну да ладно, погуглю ещё сам, спасибо за интересную тему.
bolk (bolknote.ru)
1 февраля 2012, 11:35,
ответ предназначен Fulcrum (fulc.ru):
Alexey Burlakov (profiles.google.com/gaius.julius)
Очень, кстати, интересно, что есть 10 типов людей. Те, которые считают, что "there should be one-- and preferably only one --obvious way to do it" говорит о первом подходе (с итертулз, лямбдами и прочими радостями), и те, которые так же думают о "традиционном" решении (-:29 января 2012, 00:24
А я теперь определиться не могу как мне больше нравится, а это значит что PEP20 всё врёт )-: