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的关键在于实现一个正确的筛选函数。
练习:回数是指从左向右读和从右向左读都是一样的数,例如12321
,909
。请利用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('测试失败!')