5、用filter求素数

计算素数的一个方法是埃氏筛法,它的算法理解起来非常简单:

首先,列出从2开始的所有自然数,构造一个序列:

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取序列的第一个数2,它一定是素数,然后用2把序列的2的倍数筛掉:

3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取新序列的第一个数3,它一定是素数,然后用3把序列的3的倍数筛掉:

5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取新序列的第一个数5,然后用5把序列的5的倍数筛掉:

7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

不断筛下去,就可以得到所有的素数。

# -*- coding: utf-8 -*-

#构造一个从3开始的奇数序列
def _odd_iter():
    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)  # 构造新序列

# 打印100以内的素数:
for n in primes():
    if n < 100:
        print(n)
    else:
        break

  

 

posted on 2018-02-07 18:36 Hello _ world 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/zwb8848happy/p/8427994.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用filter函数和is_prime函数来统计列表中所有非素数。 具体步骤如下: 1. 定义is_prime函数,判断一个数是否为素数。 2. 使用filter函数,筛选出列表中所有非素数。 3. 使用len函数,统计非素数的个数。 示例代码如下: ```python def is_prime(n): if n < 2: return False for i in range(2, int(n ** 0.5) + 1): if n % i == 0: return False return True lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] non_primes = list(filter(lambda x: not is_prime(x), lst)) count = len(non_primes) print(non_primes) # [1, 4, 6, 8, 9, 10] print(count) # 6 ``` 输出结果为: ``` [1, 4, 6, 8, 9, 10] 6 ``` ### 回答2: 素数指的是只能被1和本身整除的正整数,例如2、3、5、7等。因此,非素数就是除了素数以外的正整数。 要使用filter函数统计列表中所有非素数,首先需要定义一个判断数字是否为素数的函数。例如,可以使用以下函数: ```python def is_prime(num): if num <= 1: return False for i in range(2, int(num ** 0.5) + 1): if num % i == 0: return False return True ``` 这个函数首先判断数字是否小于等于1,如果是,就不是素数,返回False。然后使用for循环从2到数字的平方根(加1)的范围内判断是否能整除,如果是,就不是素数,返回False。最后如果都没有返回False,就说明数字是素数,返回True。 接下来,可以使用filter函数对列表中的所有数字应用这个函数,选出所有不为素数的数字,再通过len函数统计它们的个数。 例如,假设有以下列表: ```python numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ``` 可以使用以下代码统计所有非素数的个数: ```python non_primes = list(filter(lambda x: not is_prime(x), numbers)) count = len(non_primes) print(count) ``` 这里使用了lambda表达式来简洁地定义一个只有一行的匿名函数来调用is_prime函数,选出所有不为素数的数字,然后将结果转化为列表并统计其长度,最终输出结果为6,即列表中所有非素数的个数。 ### 回答3: 要使用filter函数统计一个列表中的所有非素数,首先需要理解什么是素数素数是指只能被1和自身整除的正整数,如2、3、5、7等。所以非素数就是指除了1和自身能被其他正整数整除的数。可以通过循环判断每个数字是否为素数,但是这样比较繁琐,可以使用filter函数来简化操作。 先来看一下filter函数的用法:filter()函数可以接受一个函数和一个序列作为参数,把传入的函数依次作用于每个元素,然后根据函数返回的结果是True还是False来决定保留还是丢弃该元素。下面给出一个简单的例子: def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 3, 4, 5, 6])) 这个例子中,is_odd函数用来判断一个数是否是奇数,filter(is_odd, [1, 2, 3, 4, 5, 6])则是对列表中的每个元素都执行is_odd函数,根据返回结果True或False来决定保留还是丢弃该元素,最后返回一个新的列表[1, 3, 5],即保留了原列表中所有的奇数。 回到统计非素数的问题上,因为我们要统计非素数,所以需要定义一个函数来判断一个数字是否为素数。可以用一个for循环来遍历从2到该数字的所有整数,判断是否存在能够整除该数字的整数,如果存在,则该数字不是素数。代码如下所示: def is_not_prime(n): if n < 2: return True for i in range(2, n): if n % i == 0: return True return False 上面的函数返回True表示该数字不是素数,返回False表示该数字是素数。接下来就可以用filter函数来统计一个列表中所有的非素数了。代码如下所示: nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] non_primes = list(filter(is_not_prime, nums)) print(non_primes) 这段代码中,nums是一个包含了1~10的数字列表,is_not_prime函数用来判断数字是否为素数。然后用filter函数对nums中的每个元素执行is_not_prime函数,生成一个新的列表non_primes,其中存放了所有的非素数。最后用print函数输出non_primes,结果为[1, 4, 6, 8, 9, 10],即1~10中所有的非素数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值