【问题标题】:How to find the prime numbers in python?如何在python中找到素数?
【发布时间】:2019-08-15 16:54:35
【问题描述】:

我是python的初学者。但我不明白为什么我仍然收到错误。我以前在 MATLAB 工作,现在我需要学习 python 来实习。有人可以帮我解决这个问题吗?

下面是我查找素数个数的代码

def prime_number(num):
    myprime = []
    for x in range(2,num):
        prime = True
        if x == 2:
            myprime.append(x)
        else:
            for y in prime:
                if x%y == 0:
                    prime = False
                    break;
            if prime:
                myprime.append(x)

    return myprime

这是我的错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-87-cd2bf40e6117> in <module>
----> 1 prime_number(100)

<ipython-input-86-169e0a64e50a> in prime_number(num)
     13         else:
     14 
---> 15             for y in prime:
     16 
     17                 if x%y == 0:

TypeError: 'bool' object is not iterable

你能告诉我如何修复缩进或了解更多关于 python 中的缩进。我知道python中的标识非常重要。我使用的是 python 3 版本。

【问题讨论】:

  • 您将素数设置为 True 然后尝试使用 for y in prime: 遍历 prime 您无法遍历布尔值 (True),因为没有什么可以遍历
  • prime 是布尔类型。要使用 for 循环,您需要像列表这样的可迭代对象。你想迭代myprime也许
  • 您不能遍历 boolean。您希望变量 prime 中包含什么?
  • 您的意思是for y in myprime:

标签: python formatting primes


【解决方案1】:

您对过于简短的变量感到困惑。去过那里,做到了……

        for y in prime:

应该是

        for y in myprime:

您想遍历已找到的素数列表。我建议全局更改变量名:

prime => is_prime
my_prime => prime_list

您将在学习编程的同时了解自己的命名风格。

对于一般算法,如果您在浏览器中搜索“Python 查找素数”,您会找到比我们在此处管理的更能解释这一点的参考资料。

【讨论】:

    【解决方案2】:

    在一些帮助下更正了 =)

       def prime_number(num):
        myprime = []
        for x in range(1, num):
            if x == 2:
                myprime.append(x)
                continue
            prime = True
            for y in myprime:
                if y <= 1:
                    continue
                if x <= 2:
                    continue
                if x%y == 0:
                    prime = False
                    continue
            if prime:
                myprime.append(x)
        return myprime
    

    【讨论】:

    • 哦,我明白我做了什么。这只会找到所有奇数 + 2 =)
    【解决方案3】:

    这可能有点高级,但它是我最喜欢的简洁性、代码清晰性和速度低于大约 10 亿的组合。除此之外,C++ 是你的朋友。

    感谢@Robert William Hanks 出色的筛分功能。只有底部的驱动代码是我的。

    #!/usr/bin/python -Wall
    import sys
    def rwh_primes1(n):
        # https://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes- 
        #     below-n-in-python/3035188#3035188
        """ Returns  a list of primes < n """
        sieve = [True] * (n/2)
        for i in xrange(3,int(n**0.5)+1,2):
            if sieve[i/2]:
                sieve[i*i/2::i] = [False] * ((n-i*i-1)/(2*i)+1)
        return [2] + [2*i+1 for i in xrange(1,n/2) if sieve[i]]
    
    if len(sys.argv) > 1:
        N = int(float(sys.argv[1]))
    else:
        N = 10000000    # default: 1e7 10,000,000
    
    p = rwh_primes1(N)
    print len(p), "primes found <", N
    if N < 1000:
        print p
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 2022-12-29
      • 2017-05-06
      • 2010-12-10
      • 2019-10-30
      相关资源
      最近更新 更多