filter:埃氏筛法,回数判断is_palindrome

作者: 世外大帝 | 来源:发表于2017-11-24 14:01 被阅读10次

python内建的filter用于过滤序列,也可以接收函数。

和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2017/11/24 0024
# @Author  : TaoYuan (1876665310@qq.com)
# @Link    : http://blog.csdn.net/lftaoyuan  Python互助学习qq群:315857408
# @Version : V1.0.0

L1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
L2 = ['A', 'B', 'c', None, '  ']


def is_odd(n):  # 是否奇数
    return n % 2 == 1


def not_empty(s):  # 不为空
    return s and s.strip()


if __name__ == '__main__':

    print(list(filter(is_odd, L1)))  # [1, 3, 5, 7, 9]
    print(list(filter(not_empty, L2)))  # ['A', 'B', 'c']


埃氏筛法

计算素数(质数)的一种方法。
流程大致如下:

  1. 列出大于等于2的所有自然数2,3,4,5,6,7,8,9...
  2. 取序列的第一个数2(一定是素数),筛掉2和2的所有倍数3,5,7,9...
  3. 取新序列的第一个数3(一定是素数),筛掉3和3的所有倍数5,7,11...
  4. 然后取5...不断筛下去,就可以得到所有的素数。
def odd_iter():  # 奇数生成器
    n = 1
    while True:
        n += 2
        yield n


def not_divisible(n):  # 筛选函数
    return lambda x: x % n > 0


def primes():  # 生成素数列表
    yield 2
    it = odd_iter()  # 初始序列
    while True:
        n = next(it)  # 返回序列的第一个数
        yield n
        it = filter(not_divisible(n), it)  # 构造新序列


if __name__ == '__main__':
    # 打印100以内的素数:
    for n in primes():
        if n < 100:
            print(n)
        else:
            break

回数

回数是指从左向右读和从右向左读都是一样的数,例如12321,909。

先去百科一下“回数”,发现它的解法也比较简单:

数学中有一个著名的回数猜想至今没有解决回数猜想的内容是你任取一个自然数把这个数倒过来并将这两个数相加然后把这个和数再倒过来与原来的和数相加重复这个过程一定能获得一个回数

举个例子比如68按上述法进行计算

68+86=154
154+451=605
605+506=1111

只需三步就可以得到一个回文数

请利用filter()筛选出回数:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2017/11/24 0024
# @Author  : TaoYuan (1876665310@qq.com)
# @Link    : http://blog.csdn.net/lftaoyuan  Python互助学习qq群:315857408
# @Version : V1.0.0
# @des     : 判断是否为回数


def is_palindrome(n):
    return str(n) == str(n)[::-1]  # 字符串倒过来如果==字符串,则为回数


if __name__ == '__main__':
    # 测试:
    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('测试失败!')

相关文章

  • filter:埃氏筛法,回数判断is_palindrome

    python内建的filter用于过滤序列,也可以接收函数。 和map()不同的是,filter()把传入的函数依...

  • 判断素数-埃氏筛法的详解

    埃氏筛法 一个判断素数的高效算法 关于埃氏筛法的百度百科解释在这里埃拉托斯特尼筛法,当然我不可能给个百度百科的解释...

  • 素数相关问题练习 C++

    辗转相除 素数判定 埃氏筛法

  • 质因子分解(素数埃氏筛法)[PAT A1059]

    埃氏筛法原理质因子分解结论

  • 埃氏筛法

    计算素数的一个方法:埃氏筛法 1.构造一个从3开始的奇数列 def _odd_iter(): n=1 whil...

  • 埃氏筛法

    首先,列出从2开始的所有自然数,构造一个序列: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1...

  • 求小于等于n的质数个数

    埃氏筛法(Eratosthenes筛选法)算法基本思想:要得到自然数n以内的全部素数,必须把不大于n1/2的所有素...

  • 质数判断与埃氏筛

    质数判断 我们来看这么一道问题: 给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内)...

  • 埃氏筛

    埃拉托斯特尼筛法,简称埃氏筛,一种古老且简单的用来找出一定范围内所有的质数的算法。公元前250年由希腊数学家埃拉托...

  • 204. Count Primes

    n以内素数的个数。 参考:埃拉托斯特尼筛法和素数判断 代码:

网友评论

    本文标题:filter:埃氏筛法,回数判断is_palindrome

    本文链接:https://www.haomeiwen.com/subject/lozxbxtx.html