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

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('测试失败!')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值