На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD
  
    > [Python] Простые числа, генератор , Как бы по-питонистее?
      Всех с наступившим 2012 годом!

      Сижу простуженный, ищу метод: а как бы в 1 строку получить список простых чисел из указанного диапазона.

      Вариант #1, который на поверхности:
      ExpandedWrap disabled
        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 ) ]

      Как бы обойтись без объявления функций?

      Добавлено
      Или:

      ExpandedWrap disabled
        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 )
        Цитата 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) }

        Уже непонятно.
          Учу язык, поэтому любопытны всякие "пограничные" конструкции.
          К примеру, зачем писать 100500 классов для вывода хеловорлд в c++? Я думаю ответ очевиден: в учебных целях.
            Цитата crawler @
            Учу язык, поэтому любопытны всякие "пограничные" конструкции.

            Ну так используй list comprehensions там, где они применимы. Тут же очевидно, что они мешают читаемости (во втором варанте), тогда как подход с isPrime явно говорит о том, что код делает. Надо не просто учиться писать, а учиться писать правильно, а значит и уметь применять инструменты языка там, где они действительно полезны.

            Цитата crawler @
            К примеру, зачем писать 100500 классов для вывода хеловорлд в c++? Я думаю ответ очевиден: в учебных целях.

            При 100500 классах получается уже не хелло ворлд :)
            Сообщение отредактировано: Мяут-Настоящий -
              Хелло ворлд в C++ обычно пишут вообще без классов.

              Отдельная функция для проверки на простоту хороша тем, что ее можно вынести в отдельный модуль и долго пользоваться, а не вспоминать каждый раз "крутое" однострочное решение, которое вдобавок даже комментарием нормальным не снабдишь. Хотя работать, конечно медленнее будет.

              Кстати, делить лучше отдельно на 2 и потом на нечетные числа начиная с 3. Хоть какое-то ускорение.
                Я попробую объяснить по-другому. Это просто такая синтетическая головоломка на знание фишек языка, цель которой просто выяснить: а возможно ли? И если пример с поиском простых чисел не слишком хорош, то такой метод (если он существует) можно будет теоретически применить где-нибудь в другом месте.

                Я вот, откровенно говоря, не придумал такого метода.
                  Цитата crawler @
                  то такой метод

                  Какой? Внедрение тела функции в место, где она вызывается? Ну это очень плохо сказывается на читаемости (и повторном использовании кода), а inlining не вчера изобрели: http://en.wikipedia.org/wiki/Inline_expansion
                    Цитата Мяут-Настоящий @
                    inlining не вчера изобрели:
                    Речь идет о Python'е, а там инлайнинга нет.

                    Цитата crawler @
                    такая синтетическая головоломка на знание фишек языка
                    тогда лучше начать с простейших
                    На Python 3, с использованием генератора, м.б. пойдет и на Py2:
                    ExpandedWrap disabled
                      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))
                    Сообщение отредактировано: amk -
                      А фишка оказалась в any() :)
                      На 2.7 идет. Спасибо)
                        Цитата amk @
                        Речь идет о Python'е, а там инлайнинга нет.

                        Ну там он понятное дело бессмысленен.
                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0344 ]   [ 14 queries used ]   [ Generated: 18.07.25, 04:35 GMT ]