1. 程式人生 > 實用技巧 >python 用filter求解素數

python 用filter求解素數

計算素數的一個方法是埃氏篩法,它的演算法理解起來非常簡單:

首先,列出從2開始的所有自然數,構造一個序列:

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取序列的第一個數2,它一定是素數,然後用2把序列的2的倍數篩掉:

3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取新序列的第一個數3,它一定是素數,然後用3把序列的3的倍數篩掉:

5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18

, 19, 20, ...

取新序列的第一個數5,然後用5把序列的5的倍數篩掉:

7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

不斷篩下去,就可以得到所有的素數。

用Python來實現這個演算法,可以先構造一個從3開始的奇數序列:

題解:

  1. 定義奇數生成器,思考:因為素數除了2以外的偶數均不是素數
def _odd_iter():   
    n = 1
    while True:
        n = n + 2
        yield n
  1. 設定篩選函式
def _not_divisible(n):
    return lambda x: x % n > 0
  1. 定義一個生成器,不斷返回下一個素數
def primes():
    yield 2
    it = _odd_iter() # 初始序列,已經生成一整個序列了,但是並不
    while True:
        n = next(it) # 返回序列的第一個數
        yield n
        it = filter(_not_divisible(n), it) # 構造新序列
  1. 這個生成器先返回第一個素數2,然後,利用filter()不斷產生篩選後的新的序列。

    由於primes()也是一個無限序列,所以呼叫時需要設定一個退出迴圈的條件:

# 列印1000以內的素數:
for n in primes():
    if n < 1000:
        print(n)
    else:
        break

理解匿名lambda函式

def test_lambda():
    return lambda x, y: x + y

test = test_lambda()

print(test(3, 2)) # 5

上面函式中,test_lambda函式並沒有位置引數,但是將其賦給變數test後便可以呼叫

如果,直接使用test_lambda(3, 2)將返回錯誤

def _not_divisible(n):
    return lambda x: x % n > 0

對於上面函式的理解,其實道理和test_lambda相同

f = _not_divisible(3)
print(f(5))   # True

利用變數引用函式,然後再是匿名函式的引數x=5的傳入

大概意思就是如此,表達上還有欠缺,有大佬可以指正

擴充套件:迴文整數

回數是指從左向右讀和從右向左讀都是一樣的數,例如12321909。請利用filter()篩選出回數:回數是指從左向右讀和從右向左讀都是一樣的數,例如12321909。請利用filter()篩選出回數:

def is_palindrome(n):
    k = n
    x = 0
    while(n != 0):
        x = x * 10 + (n % 10)
        n = n // 10
    if x == k:
        return True
    return False
# 測試:
output = filter(is_palindrome, range(1, 1000))
print('1~1000:', list(output))
if list(filter(is_palindrome, range(1, 200))) == [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191]:
    print('測試成功!')
else:
    print('測試失敗!')

參考: