根据python中的前一个函数打印出素数

时间:2017-03-07 20:18:39

标签: python arrays list primes

我在python中有一个名为prime_sieve(N)的函数,如果它不是素数,则此函数将0分配给数字,如果它是素数,则此函数分配1 - 它被称为掩码。此功能正常工作。问题出现在prime_sieve(N)代码下面的第二个函数中,代码是:

import numpy as np

def prime_sieve(N):
   nums = np.arange(2, N + 2, 1)
   mask = 1 + np.zeroes(N, dtype = int)
   for n in nums:
     for i in np.arange(2 * n - 2, N, n):
         mask[i] = 0

   return nums, mask  

numbers, mask = prime_sieve(8)
print(numbers) #prints out the actual numbers starting at 2
print(mask) #prints out the 0s and 1s assigned to the values if they are a prime or not.

我必须在名为primes_list(N)的函数中使用上述函数来打印出列表中的素数。 primes_list(N)的代码是:

def primes_list(N):

  for i in range (0, N, 1):

    if mask[i] == 1:
       return prime_sieve(numbers[i])

print(primes_list(8))

我从prime_sieve(N)函数收到的输出是:

  

[2,3,4,5,6,7,8,9]

     

[1,1,0,1,0,1,0,0]

我从primes_list(N)函数收到的输出是:

  

预期产出:[2,3,5,7]

     

我的输出:(array([2,3]),array([1,1]))

任何建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

您的primes_list没有意义:

def primes_list(N):
  for i in range (0, N, 1):
    if mask[i] == 1:
       return prime_sieve(numbers[i])

mask未定义,即使您使用之前的掩码,2也会如此,然后调用prime_sieve(numbers[2]) {{1}也是未定义的。如果我们进一步接受全球numbers,则会向我们numbers提供prime_sieve[3],无论他们放置什么NN >= 3)。 prime_sieve[3]的结果是元组:([2, 3], [1, 1])

尝试:

def primes_list(N):
  nums, mask = prime_sieve(N)
  return [nums[i] for i in range(len(nums)) if mask[i]]

这将获取prime_sieve的结果,并仅返回素数的数字:(其中mask[i] == True

结果:[2, 3, 5, 7]

答案 1 :(得分:-2)

return会立即退出该函数,并为您提供该点的任何值。

试试,例如,

def f():
    for i in (1, 2, 3):
        return i
print(f())

这只打印1。

您需要返回所需内容的元组,例如

def f():
    return (1, 2, 3)

print(f())

或使用yield语句,例如

def f():
    for i in (1, 2, 3):
        yield i

for thing in f():
    print(thing)