为什么我列出素数的简单程序告诉我“ builtin_function_or_method”对象不可下标?

时间:2018-12-25 17:36:13

标签: python list

程序在第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 :(得分:2)

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)

答案 1 :(得分:0)

您的代码目前有两个问题。

首先,由于[]是一个函数,因此需要用()替换append

第二,在您当前的实现中,您在检查TypeError: 'bool' object is not iterable时将得到一个all()。您可以按照@ShadowRanger的建议进行all(remainder)

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) 

在其中对remainder列表中的每个元素使用for循环检查。 rem != 0会根据条件是否满足为您提供对/错。 all只会检查所有输入是否为True,在这种情况下,即使单个输入为False,它也会返回True,否则返回False

如果您想了解all()在这里的工作方式,请在打印声明中添加以下输出。如您所见,仅对于仅存在一个0的情况和False不存在0的情况,输出为True

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

答案 2 :(得分:0)

问题是语句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)

答案 3 :(得分:0)

另一种实现方式可以是:

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)