來看這一種判斷素數(質數)的函數:
form math import sart
def is_prime(n):
if n==1:
return False
for i in range(2, int(sqrt(n) + 1)):
if n % i == 0:
return False
return True
看起來,這是一種比較優秀的方法了,因為通過sqrt()函數減少了開方級的計算量。
再來看:
def is_prime(number):
if number > 1:
if number == 2:
return True
if number % 2 == 0:
return False
for current in range(3, int(math.sqrt(number) + 1), 2):
if number % current == 0:
return False
return True
return False
咋一看,這一次的代碼看起來更多。但是,計算量卻又在原來的基礎上又幾乎減少一半。高明之處就在這一句:if number % 2 == 0:
,其實這一句就一部將2以及所有合數因子給排除掉了,所以在這一句range(3, int(math.sqrt(number) + 1), 2)
中,直接從3起步,步長為2.在range()函數產生的序列是[3,5,7,9,...]
,比原來由range(2, int(sqrt(n) + 1))
產生的[2,3,4,5,6,...]
少了合數的部分。