← 返回首页
Python3基础教程(二十四)
发表时间:2022-03-30 11:07:48
filter

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]