zoukankan      html  css  js  c++  java
  • 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('测试失败!')
    

    参考:

  • 相关阅读:
    You are not late! You are not early!
    在同一个服务器(同一个IP)为不同域名绑定的免费SSL证书
    Vue.js Is Good, but Is It Better Than Angular or React?
    It was not possible to find any compatible framework version
    VS增加插件 Supercharger破解教程
    Git使用ssh key
    Disconnected: No supported authentication methods available (server sent: publickey)
    VS 2013打开.edmx文件时报类型转换异常
    asp.net MVC4 框架揭秘 读书笔记系列3
    asp.net MVC4 框架揭秘 读书笔记系列2
  • 原文地址:https://www.cnblogs.com/zgqcn/p/13786450.html
Copyright © 2011-2022 走看看