2016-02-10 71 views
1

我已經構建了兩個函數。第(並不重要,但相關的,因爲它是所謂的第二個),講述了一個數是否是素數:無法理解函數行爲 - isprime()

def is_prime(i): 
    if i == 1: 
     print("prime") 
    if i == 2: 
     print("not prime") 
    for d in range(2, i): 
     if i % d != 0: 
      d = d+1 
      if d == i: 
       print('prime') 
       break 
     if i % d == 0: 
      print('not prime') 
      break 

我希望能夠讓這個功能統計所有從1素數截至p。 當我要求它將它追加到列表中時,它將單獨返回一個空列表和所有值。

def prime_counting(p): 
    list_of_primes = [] 
    for n in range (p+1): 
     if is_prime(n) == "prime": 
      list_of_primes.append(n) 

Instead of putting it in the list- it maps them separately

我怎樣才能解決這個問題?

+0

**注意:** 1不是素數。 – CiaPan

+0

對不起。堆棧溢出要求我每次等待7分鐘才能接受答案! –

回答

2

(注:我沒有檢查邏輯is_prime()功能)
在你的代碼中明顯的錯誤是函數is_prime()return任何東西,它只是print秒。取決於數字是否爲素數,您希望它爲return TrueFalse。改變它這樣做。

然後你可以檢查:

if is_prime(n) == True: 
    list_of_primes.append(n) 

編輯:在評論(正確地)說,寫這種說法更 「Python化」 的方法是:

if is_prime(n): 
    list_of_primes.append(n) 

由於is_prime()將返回TrueFalse(所以沒有必要與他們比較)。

+0

我接受這個答案在7分鐘內...... –

+0

更多pythonic是'if is_prime(n):' – GingerPlusPlus

+0

如果'is_prime(n)'返回'True'或'False',你需要將它與' TRUE'?可能僅僅使用'if is_prime(n):'...就足夠了? – CiaPan

0

有代碼中的一些缺陷,但你問的是一個是:

您正在尋找的is_prime()返回值與

if is_prime(n) == "prime": 

is_prime()不包含任何回報聲明。

這裏有一個稍微修改後的版本,實際上返回從is_prime()值:

def is_prime(i): 
    if i == 1: 
     return "prime" 
    if i == 2: 
     return "not prime" 

    for d in range(2, i): 
     if i % d != 0: 
      d = d + 1 
      if d == i: 
       return "prime" 
     if i % d == 0: 
      return "not prime" 


def prime_counting(p): 
    list_of_primes = [] 
    for n in range(p+1): 
     if is_prime(n) == "prime": 
      print("added %s" % n) 
      list_of_primes.append(n) 
    return list_of_primes 


if __name__ == '__main__': 
    print(prime_counting(3)) 

如果改爲返回一個布爾值return Truereturn False你將能夠只是做:

if is_prime(n): 
    do_something() 

或者甚至使用如下的「理解」:

prime_list = [n for n in range(1, p+1) if is_prime(n)]

+1

雖然你的主要觀點是正確的,但從函數返回類似的字符串是非常糟糕的做法。這很容易出錯(爲什麼「不是總理」而不是「不是總理」或「不是總理」或「不是總理」?),而且不應該這樣做。 – Idos

+0

我明確同意,並在代碼中提到它實際上是不好的做法。儘管用完全重寫的代碼來回答問題可能會讓人感到困惑,而不是它的幫助。 – graN