Python 中内建函数filter()是一个用于过滤序列的函数,和map()类似,filter()接收一个函数和一个序列。但是filter()是把传入的函数依次作用于每一个元素,然后根据返回值是true或者false决定保留还是丢弃该元素。
例如:在一个list 中,保留奇数,删除偶数:
def is_odd(n):
return n % 2 == 0
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [2, 4, 6, 10]
把一个序列中的空字符串删掉:
def not_empty(s):
return s and s.strip()
list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))
# 结果: ['A', 'B', 'C']
注意:filter()函数返回的是一个Iterator(迭代器),也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。
用filter求素数:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def main():
for n in primes():
if n < 1000:
print(n)
else:
break
def _odd_iter():#算法:从3开始的奇数序列,这是一个生成器,并且是一个无限序列
n = 1
while True:
n = 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__':
main()
用filter求回数:
回数是指从左向右读和从右向左读都是一样的数,例如:12321,909.
#方法一:
def is_palindrome(n):
s=str(n)
l=len(s)
if l == 1:
return int(s)
else:
for i in range(int(l/2)):
if s[i] == s[l-i-1]:
return int(s)
else:
break
p = list(filter(is_palindrome,range(1000)))
print(p)
#方法二
def is_palindrome(n):
if str(n) == str(n)[::-1]:
return n
p = list(filter(is_palindrome,range(1000)))
print(p)