迭代直到函数返回True用户定义的次数

时间:2013-05-10 02:24:00

标签: python

我编写了一个函数isprime(n),如果数字为素数则返回True,否则返回false。 我能够将函数循环定义的次数;但我无法弄清楚如何迭代,直到找到x个素数。我觉得我对For和While循环有一个很好的理解,但我对如何将布尔返回值集成到循环中感到困惑。这是我当前的代码和错误:

错误结果:

input:100
Traceback (most recent call last):
File "euler7.py", line 25, in <module>
primeList += 1
TypeError: 'int' object is not iterable

代码:

def isprime(n):
    x = 2
    while x < sqrt(n):
        if n % x == 0:
            return False
        else:
            x += 1
    return True

userinput = int(raw_input('input:'))

primeList = []
primesFound = 0

while primesFound != userinput:
    i = 2
    if isprime(i):
        primeList.append(i)
        primeList += 1
        i += 1
    else:
        i += 1

编辑(包括更新和运行的代码):

from math import sqrt
def isprime(n):
    x = 2
    while x < (sqrt(n) + 1):
        if n % x == 0:
            return False
        else:
            x += 1
    return True

userinput = int(raw_input('input:'))
primeList = []
primeList.append(2)

i = 2
while len(primeList) != userinput:
    if isprime(i):
        primeList.append(i)
        i += 1
    else:
        i += 1

print 'result:', primeList[-1]

5 个答案:

答案 0 :(得分:2)

这一行:

primeList += 1

应该是:

primesFound += 1

答案 1 :(得分:2)

您无法将int添加到python list。你应该primesFound += 1来达到你想要的结果。

另外,您的isprime功能错误。对于9,它将返回True。对于while x < sqrt(n) + 1函数的while循环,您应该isprime

所以你应该:

def isprime(n):
    x=2
    while x < sqrt(n) +1:
        if n % x == 0:
            return False
        else:
            x += 1
    return True

答案 2 :(得分:1)

正如其他人所指出的那样:

  • 您应该增加primesFound,而不是primeList
  • isprime()函数有一个错误 - 并返回True为9.您需要sqrt(n) + 1

另外:

  • 您需要在i循环之外初始化while;否则,你只需建立一个2的列表。
  • 不需要primesFound。只需查看len(primeList)
  • 即可

我的宠儿:

  • 命令行程序只应在特殊情况下使用交互式用户输入。尽可能将参数作为命令行参数或选项。例如:userinput = int(sys.argv[1])

答案 3 :(得分:1)

要获得满足某些条件的n个数字,可以使用itertools.islice()函数和生成器表达式:

from itertools import count, islice

n = int(raw_input('number of primes:'))
primes = list(islice((p for p in count(2) if isprime(p)), n))

其中(p for p in count(2) if isprime(p))是一个无限期生成素数的生成器表达式(也可以写成itertools.ifilter(isprime, count(2)))。

您可以使用Sieve of Eratosthenes algorithm来获得更有效的解决方案:

def primes_upto(limit):
    """Yield prime numbers less than `limit`."""
    isprime = [True] * limit
    for n in xrange(2, limit):
        if isprime[n]:
           yield n
           for m in xrange(n*n, limit, n): # mark multiples of n as composites
               isprime[m] = False

print list(primes_upto(60))
# -> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59]

请参阅Fastest way to list all primes below N in python

注意:大约limit / (log(limit) - 1)素数小于limit

您还可以使用无限素数生成器(例如gen_primes())来获取第一个n素数:

primes = list(islice(gen_primes(), n))

请参阅How to implement an efficient infinite generator of prime numbers in Python?

答案 4 :(得分:0)

def is_prime(n):
    x=2
    while x < sqrt(n) +1:
        if n % x == 0:
            return False
            break
        else:
            x += 1
    return True