Почему моя простая программа для перечисления простых чисел говорит мне, что объект «builtin_function_or_method» не может быть подписан? - PullRequest
0 голосов
/ 25 декабря 2018

Программа застревает в строке 7 и печатает сообщение об ошибке

"'builtin_function_or_method' объект не может быть подписан"

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

i = 3
primes = [2]
remainder = []
while i <= 20:
    for x in primes:
        remainder.append[i%x]
    if all(remainder!= 0) == True:
        primes.append(i)
    i += 1
    remainder.clear()
print(primes)

Что я хочу, чтобы код делал, так это перебирал числа от 3 до 20, каждый раз проверяя, является ли я простым, делением на всеизвестные простые числа, если это простое число, я хочу, чтобы код добавил его в список известных простых чисел, чтобы его можно было использовать при проверке простоты дальнейших значений i.

Ответы [ 4 ]

0 голосов
/ 25 декабря 2018

Альтернативная реализация может быть:

def is_prime(n):
    """
    Check whether the given number is prime or not.
    """
    # we dont need to check all the range of numbers
    # from [2, n). We need to check in the set [2, n/2]
    # Note: there is an even better approximation
    for num in range(2, n/2 + 1):
        if n % num == 0:
            return False
    else:
        return True

def all_primes(limit):
    """
    Find all prime numbers in the range [2, limit)
    """
    primes = []

    for num in range(2, limit):
        if is_prime(num):
            primes.append(num)

    return primes

print all_primes(20)
0 голосов
/ 25 декабря 2018

Обмен append[i%x] с append(i%x).append - это встроенный метод.Квадратные скобки [] используются для поднабора / индексации.Вместо этого вызовите функцию, используя скобки ().

Так, например, будет работать следующий код:

primes = [2]
remainder = []
for i in range(3, 21): # range slightly more often used than while loops

    for x in primes:
        remainder.append(i%x)

    if all(remainder): # note: no reason to add "== True". See PEP8.
        primes.append(i)

    remainder.clear()
print(primes)
0 голосов
/ 25 декабря 2018

Проблема в утверждении remainder.append[i%x].Чтобы добавить что-то в список, это нужно сделать так: remainder.append(i%x).

Правильный код:

i = 3
primes = [2]
remainder = []
while i <= 20:
    for x in primes:
        remainder.append(i%x)
    if all([item !=0 for item in remainder]) == True:
        primes.append(i)
    i += 1
    remainder.clear()
print(primes)
0 голосов
/ 25 декабря 2018

Есть две проблемы с вашим кодом прямо сейчас.

Сначала необходимо заменить [] на (), поскольку append - это функция.

Во-вторых, в вашей текущей реализации вы получите TypeError: 'bool' object is not iterable при проверке all().Вы можете просто сделать all(remainder), как предложено @ShadowRanger.

i = 3
primes = [2]
remainder = []
while i <= 20:
    for x in primes:
        remainder.append(i%x)
    if all(remainder) == True:
        primes.append(i)
    i += 1
    remainder.clear()
print(primes)
# [2, 3, 5, 7, 11, 13, 17, 19]

Другая альтернатива, как предложено снова в комментариях, это использовать

all(rem != 0 for rem in remainder) 

, где выиспользуйте проверку цикла for для каждого элемента в вашем списке remainder.rem != 0 даст вам True / False в зависимости от того, выполнено условие или нет.all просто проверит, все ли записи истинны, и в этом случае он вернет True иначе False, если хотя бы одна запись будет ложной.

Если вы хотите почувствовать, как all()здесь работает, поставьте оператор print со следующим выводом.Как видите, выходное значение равно False только для тех случаев, когда существует даже один 0 и True, где нет 0.

print (remainder, all(remainder))

[1] True
[0, 1] False
[1, 2] True
[0, 0, 1] False
[1, 1, 2] True
[0, 2, 3, 1] False
[1, 0, 4, 2] False
[0, 1, 0, 3] False
[1, 2, 1, 4] True
[0, 0, 2, 5, 1] False
[1, 1, 3, 6, 2] True
[0, 2, 4, 0, 3, 1] False
[1, 0, 0, 1, 4, 2] False
[0, 1, 1, 2, 5, 3] False
[1, 2, 2, 3, 6, 4] True
[0, 0, 3, 4, 7, 5, 1] False
[1, 1, 4, 5, 8, 6, 2] True
[0, 2, 0, 6, 9, 7, 3, 1] False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...