3、filter

  filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。相当于一个过滤器作用。例如,在一个list中,删掉偶数,只保留奇数,可以这么写:

def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]

  这个filter的关键在于实现一个正确的筛选函数。

  练习:回数是指从左向右读和从右向左读都是一样的数,例如12321909。请利用filter()筛选出回数。

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Date    : 2018-05-24 12:51:30
 4 # @Author  : Chen Jing (cjvaely@foxmail.com)
 5 # @Link    : https://github.com/Cjvaely
 6 # @Version : $Id$
 7 
 8 # 练习: 回数是指从左向右读和从右向左读都是一样的数,例如12321,909。
 9 # 请利用filter()筛选出回数:
10 
11 
12 def exchange(num):
13     count = len(str(num)) - 1  # 数字位数3214 -> 4123
14     sum = 0
15     m = 0
16     while num != 0:
17         sum = sum + (num // (10 ** count)) * \
18             (10 ** m)  # sum = 3   23  123   4123
19         num = num % (10 ** count)  # num = 214  14  4
20         count = count - 1  # 2  1   0
21         m = m + 1  # 1  2   3
22     return sum
23 
24 
25 def is_palindrome(n):
26     count = len(str(n))  # 数字位数
27     if count == 1:
28         return True
29     elif count % 2 == 0:  # 位数为偶数
30         half1 = n // 10 ** (count // 2)  # 数字前半部分
31         half2 = n % 10 ** (count // 2)  # 数字后半部分
32         if half1 == exchange(half2):
33             return True
34     else:  # 位数非1 且为奇数
35         half1 = n // 10 ** ((count + 1) // 2)  # 数字前半部分
36         half2 = n % 10 ** ((count - 1) // 2)  # 数字后半部分
37         if half1 == exchange(half2):
38             return True
39 
40 
41 # 借鉴切片: return str(n) == str(n)[::-1]
42 # 测试:
43 output = filter(is_palindrome, range(1, 1000))
44 print('1~1000:', list(output))
45 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]:
46     print('测试成功!')
47 else:
48     print('测试失败!')

 

posted on 2018-07-16 17:19  Cjv  阅读(163)  评论(0编辑  收藏  举报