Простой главный генератор в Python

Я смог сделать это, используя функцию сортировки вместо порядка, используя поле: title на контроллере статей.

def index
  @articles = Article.sort(:title)
end
33
задан Ashish Ahuja 12 June 2017 в 13:38
поделиться

9 ответов

Существуют некоторые проблемы:

  • , Почему Вы распечатываете количество, когда оно не разделилось на x? Это не означает, что это является главным, это означает только, что этот конкретный x не делит его
  • continue перемещения к следующему повторению цикла - но Вы действительно хотите остановиться, это с помощью break

Вот код с несколькими мерами, это распечатывает только начала:

import math

def main():
    count = 3
    
    while True:
        isprime = True
        
        for x in range(2, int(math.sqrt(count) + 1)):
            if count % x == 0: 
                isprime = False
                break
        
        if isprime:
            print count
        
        count += 1

Для намного более эффективного главного поколения, посмотрите Решето Erastothenes, как другие предположили. Вот хорошая, оптимизированная реализация со многими комментариями:

# Sieve of Eratosthenes
# Code by David Eppstein, UC Irvine, 28 Feb 2002
# http://code.activestate.com/recipes/117119/

def gen_primes():
    """ Generate an infinite sequence of prime numbers.
    """
    # Maps composites to primes witnessing their compositeness.
    # This is memory efficient, as the sieve is not "run forward"
    # indefinitely, but only as long as required by the current
    # number being tested.
    #
    D = {}
    
    # The running integer that's checked for primeness
    q = 2
    
    while True:
        if q not in D:
            # q is a new prime.
            # Yield it and mark its first multiple that isn't
            # already marked in previous iterations
            # 
            yield q
            D[q * q] = [q]
        else:
            # q is composite. D[q] is the list of primes that
            # divide it. Since we've reached q, we no longer
            # need it in the map, but we'll mark the next 
            # multiples of its witnesses to prepare for larger
            # numbers
            # 
            for p in D[q]:
                D.setdefault(p + q, []).append(p)
            del D[q]
        
        q += 1

Примечание, что это возвращает генератор.

147
ответ дан 27 November 2019 в 17:21
поделиться

Можно создать список начал с помощью пониманий списка довольно изящным способом. Взятый от здесь:

>>> noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]
>>> primes = [x for x in range(2, 50) if x not in noprimes]
>>> print primes
>>> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
0
ответ дан 27 November 2019 в 17:21
поделиться

Вот то, что я имею:

def is_prime(num):
    if num < 2:         return False
    elif num < 4:       return True
    elif not num % 2:   return False
    elif num < 9:       return True
    elif not num % 3:   return False
    else:
        for n in range(5, int(math.sqrt(num) + 1), 6):
            if not num % n:
                return False
            elif not num % (n + 2):
                return False

    return True

Это довольно быстро для больших количеств, поскольку это только проверяет по уже простым числам для делителей числа.

Теперь, если Вы хотите генерировать список начал, можно сделать:

# primes up to 'max'
def primes_max(max):
    yield 2
    for n in range(3, max, 2):
        if is_prime(n):
            yield n

# the first 'count' primes
def primes_count(count):
    counter = 0
    num = 3

    yield 2

    while counter < count:
        if is_prime(num):
            yield num
            counter += 1
        num += 2

генераторы использования здесь могли бы быть желаемы для эффективности.

И только для ссылки, вместо высказывания:

one = 1
while one == 1:
    # do stuff

можно просто сказать:

while 1:
    #do stuff
0
ответ дан 27 November 2019 в 17:21
поделиться

Необходимо удостовериться, что все возможные делители равномерно не делят число, которое Вы проверяете. В этом случае Вы распечатаете число, Вы проверяете любое время только, один из возможных делителей равномерно не делит число.

Также Вы не хотите использовать продолжать оператор, потому что продолжение просто заставит его проверять следующий возможный делитель, когда Вы уже узнали, что число не является началом.

0
ответ дан 27 November 2019 в 17:21
поделиться

Это кажется домашней-работой-y, таким образом, я дам подсказку, а не подробное объяснение. Исправьте меня, если я принял неправильно.

Вы в порядке до помощи, когда Вы видите ровный делитель.

, Но Вы печатаете 'количество', как только Вы видите даже один число, которое не делится на него. 2, например, не делится равномерно на 9. Но это не делает 9 начало. Вы могли бы хотеть продолжать идти, пока Вы не уверены никакой число в соответствиях диапазона.

(поскольку другие ответили, Решето является намного более эффективным способом пойти... просто пытаясь помочь Вам понять, почему этот определенный код не делает то, что Вы хотите)

1
ответ дан 27 November 2019 в 17:21
поделиться
def is_prime(num):
    """Returns True if the number is prime
    else False."""
    if num == 0 or num == 1:
        return False
    for x in range(2, num):
        if num % x == 0:
            return False
    else:
        return True

>> filter(is_prime, range(1, 20))
  [2, 3, 5, 7, 11, 13, 17, 19]

Мы получим все простые числа до 20 в списке. Я, возможно, использовал Решето Эратосфена, но Вы сказали желание чего-то очень простого. ;)

14
ответ дан 27 November 2019 в 17:21
поделиться
  • продолжать оператор смотрит неправильно.

  • Вы хотите запуститься в 2, потому что 2 первое простое число.

  • можно записать "в то время как Верный": получить бесконечный цикл.

0
ответ дан 27 November 2019 в 17:21
поделиться

Вот простое (Python 2.6.2) решение ... которое соответствует исходному запросу OP (теперь уже шесть месяцев назад); и должно быть вполне приемлемым решением в любом курсе "программирование 101" ... Отсюда и этот пост.

import math

def isPrime(n):
    for i in range(2, int(math.sqrt(n)+1)):
        if n % i == 0: 
            return False;
    return n>1;

print 2
for n in range(3, 50):
    if isPrime(n):
        print n

Этот простой метод "грубой силы" "достаточно быстр" для чисел примерно до 16, 000 на современных ПК (на моем компьютере с частотой 2 ГГц это заняло около 8 секунд).

Очевидно, это можно было бы сделать гораздо эффективнее, если бы не пересчитывать простоту каждого четного числа или каждого кратного 3, 5, 7 и т. Д. Для каждое отдельное число ... См. Сито Эратосфена (см. реализацию eliben выше) или даже Сито Аткина , если вы чувствуете себя особенно храбрым и / или сумасшедшим.

Caveat Emptor: я нуб питон. Пожалуйста, не принимайте все, что я говорю, как Евангелие.

или даже Сито Аткина , если вы чувствуете себя особенно храбрым и / или сумасшедшим.

Caveat Emptor: Я нуб питон. Пожалуйста, не принимайте все, что я говорю, как Евангелие.

или даже Сито Аткина , если вы чувствуете себя особенно храбрым и / или сумасшедшим.

Caveat Emptor: Я нуб питон. Пожалуйста, не принимайте все, что я говорю, как Евангелие.

3
ответ дан 27 November 2019 в 17:21
поделиться
print [x for x in range(2,100) if not [t for t in range(2,x) if not x%t]]
8
ответ дан 27 November 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: