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']
埃氏筛法
计算素数(质数)的一种方法。
流程大致如下:
- 列出大于等于2的所有自然数
2,3,4,5,6,7,8,9...
- 取序列的第一个数2(一定是素数),筛掉2和2的所有倍数
3,5,7,9...
- 取新序列的第一个数3(一定是素数),筛掉3和3的所有倍数
5,7,11...
- 然后取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('测试失败!')