1.filter
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
注意: Python2.7 返回列表,Python3.x 返回迭代器对象。
实例: 过滤出1~100中所有的素数。
# -*- coding: utf-8 -*-
# @Time : 2022/3/30 13:16
# @File : filter.py
# @Software : PyCharm
import math
def isPrime(number):
# 根据质数的定义,其必须大于0
if number == 1 or number <= 0:
return False
# 循环需要判断的次数
for i in range(2, math.floor(number ** 0.5)+1):
# 如果该数有其他的因子返回False,即不是质数
if number % i == 0:
return False
return True
print(list(filter(isPrime, range(101))))
运行结果:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
我们也可以使用埃氏筛法来筛选素数,它的算法理解起来非常简单:
1).首先,列出从2开始的所有自然数,构造一个序列: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
2).取序列的第一个数2,它一定是素数,然后用2把序列的2的倍数筛掉: 3, 5, 7, 9, 11, 13, 15, 17, 19, ...
3).取新序列的第一个数3,它一定是素数,然后用3把序列的3的倍数筛掉: 5, 7, 11, 13, 17, 19, ...
4).取新序列的第一个数5,然后用5把序列的5的倍数筛掉: 7, 11, 13, 17, 19 ...
不断筛下去,就可以得到所有的素数。
实现代码:
# -*- coding: utf-8 -*-
# @Time : 2022/3/30 13:45
# @File : isPrime.py
# @Software : PyCharm
# 构造一个从3开始的奇数序列
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
# 定义一个筛选函数
def _not_divisible(n):
return lambda x: x % n > 0
def isPrimes():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一个数
yield n
it = filter(_not_divisible(n), it) # 构造新序列
# 打印1000以内的素数:
list = []
for n in isPrimes():
if n <= 100:
list.append(n)
else:
break
print(list)
运行结果:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]