
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.30] |
![]() |
|
Сообщ.
#1
,
|
|
|
Всех с наступившим 2012 годом!
Сижу простуженный, ищу метод: а как бы в 1 строку получить список простых чисел из указанного диапазона. Вариант #1, который на поверхности: ![]() ![]() def isPrime(x): for i in range(2,int(m.sqrt(x))+2): if x % i == 0: return False else: return True l = [ i for i in range(3,100,2) if isPrime(i) ] print (l) Вариант #2, недоделанный: l = [ [i, j, i%j] for i in range(3,15) for j in range(2, int(m.sqrt(i))+2 ) ] Как бы обойтись без объявления функций? Добавлено Или: ![]() ![]() l = { i for i in range(3,100,2) for j in range(2, int(m.sqrt(i))+2 ) if i%j == 0 } k = { i for i in range(3,100,2) } print ( k - l ) |
Сообщ.
#2
,
|
|
|
Цитата crawler @ Сижу простуженный, ищу метод: а как бы в 1 строку получить список простых чисел из указанного диапазона. Глупый вопрос: зачем? Почему бы не написать генератор, основанный на решете Эратосфена? Добавлено Цитата crawler @ Как бы по-питонистее? По-питонистее это кратко, но понятно. Зачем вот эта каша: Цитата crawler @ l = { i for i in range(3,100,2) for j in range(2, int(m.sqrt(i))+2 ) if i%j == 0 } k = { i for i in range(3,100,2) } Уже непонятно. |
Сообщ.
#3
,
|
|
|
Учу язык, поэтому любопытны всякие "пограничные" конструкции.
К примеру, зачем писать 100500 классов для вывода хеловорлд в c++? Я думаю ответ очевиден: в учебных целях. |
Сообщ.
#4
,
|
|
|
Цитата crawler @ Учу язык, поэтому любопытны всякие "пограничные" конструкции. Ну так используй list comprehensions там, где они применимы. Тут же очевидно, что они мешают читаемости (во втором варанте), тогда как подход с isPrime явно говорит о том, что код делает. Надо не просто учиться писать, а учиться писать правильно, а значит и уметь применять инструменты языка там, где они действительно полезны. Цитата crawler @ К примеру, зачем писать 100500 классов для вывода хеловорлд в c++? Я думаю ответ очевиден: в учебных целях. При 100500 классах получается уже не хелло ворлд ![]() |
Сообщ.
#5
,
|
|
|
Хелло ворлд в C++ обычно пишут вообще без классов.
Отдельная функция для проверки на простоту хороша тем, что ее можно вынести в отдельный модуль и долго пользоваться, а не вспоминать каждый раз "крутое" однострочное решение, которое вдобавок даже комментарием нормальным не снабдишь. Хотя работать, конечно медленнее будет. Кстати, делить лучше отдельно на 2 и потом на нечетные числа начиная с 3. Хоть какое-то ускорение. |
Сообщ.
#6
,
|
|
|
Я попробую объяснить по-другому. Это просто такая синтетическая головоломка на знание фишек языка, цель которой просто выяснить: а возможно ли? И если пример с поиском простых чисел не слишком хорош, то такой метод (если он существует) можно будет теоретически применить где-нибудь в другом месте.
Я вот, откровенно говоря, не придумал такого метода. |
Сообщ.
#7
,
|
|
|
Цитата crawler @ то такой метод Какой? Внедрение тела функции в место, где она вызывается? Ну это очень плохо сказывается на читаемости (и повторном использовании кода), а inlining не вчера изобрели: http://en.wikipedia.org/wiki/Inline_expansion |
Сообщ.
#8
,
|
|
|
Цитата Мяут-Настоящий @ Речь идет о Python'е, а там инлайнинга нет.inlining не вчера изобрели: Цитата crawler @ тогда лучше начать с простейшихтакая синтетическая головоломка на знание фишек языка На Python 3, с использованием генератора, м.б. пойдет и на Py2: ![]() ![]() def isprime(n): return n == 2 or n > 2 and n%2 != 0 and all(n%i for i in range(3, int(n**0.5)+1, 2)) |
Сообщ.
#9
,
|
|
|
А фишка оказалась в any()
![]() На 2.7 идет. Спасибо) |
Сообщ.
#10
,
|
|
|
Цитата amk @ Речь идет о Python'е, а там инлайнинга нет. Ну там он понятное дело бессмысленен. |