Python:基于生成器和filter实现惰性求值 - 以筛法质数计算为例

函数式编程值得称道的是惰性计算概念的引入,以Haskell实现埃氏筛法计算质数的代码作为代表:

primes = filterPrime [2..]
  where filterPrime (p:xs) =
          p : filterPrime [x | x <- xs, x `mod` p /= 0]

在Python中通过生成器实现类似的功能。首先我们实现一个从2开始生成自然数的generator来对标[2..]

def count_from_2():
    return itertools.count(start=2)

然后定义一个筛选函数作为filter的参数,对标x mod p /= 0. 这里我们用一个高阶函数来定义,作为模板:

def _not_divisible_by(n):
    return lambda x: x % n > 0

接下来照搬定义filterPrimeprimes

def filter_prime(nums):
    while True:
        p = next(nums)
        yield p
        nums = filter(_not_divisible_by(p), nums)

def primes():
    return filter_prime(count_from_2())

进行测试:

if __name__ == '__main__':
    for i in itertools.takewhile(lambda n: n < 100, primes()):
        print(i, end=' ')
    print()
% python main.py
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 

完整代码:

import itertools

def count_from_2():
    return itertools.count(start=2)

def _not_divisible_by(n):
    return lambda x: x % n > 0

def filter_prime(nums):
    while True:
        p = next(nums)
        yield p
        nums = filter(_not_divisible_by(p), nums)

def primes():
    return filter_prime(count_from_2())

if __name__ == '__main__':
    for i in itertools.takewhile(lambda n: n < 100, primes()):
        print(i, end=' ')
    print()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值