zoukankan      html  css  js  c++  java
  • 求素数

    def _odd_iter():
    n = 1
    while True:
    n = n + 2
    yield n

    def _not_divisible(n):
    def aa(x):
    # pass
    return x % n > 0
    return aa
    # 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) # 构造新序列



    for n in primes():
    if n < 1000:
    print(n)
    else:
    break
    解说:
    n = next(it) # it不断的 +2 然后判断return  x % n > 0 是否是真,如果为真则保留,如果为假就再执行一次 next(it) 也就是it再 +2然后再判断return  x % n > 0 是否是真,所以不断的返回序列下一个素数;


    yield n    #不断的返回素数,

    it = filter(_not_divisible(n), it) # 构造新序列

    其中 filter(_not_divisible(n), it)

    中it 是定义的一个 开始是1 不断加2 的一个迭代器;
    n = next(it) 后n = 3 yield 返回 3

    it = filter(_not_divisible(n), it) 返回一个 aa 的函数 和 一个迭代器 it

    然后 n = next (it) 的时候才开始调用 aa 的函数 和 迭代器 it
    这个时候 it = 5 n = 3 return x % n > 0 为真保留 5

    下一次 it = 7 n = 3 和 n = 5 return x % n > 0 为真保留 7

    it 对应 aa 函数中的x

    n 对应 aa 函数中的n 
    n 等于 构造新序列素数的 it 列表,也就是不断的next (it) 获取新的 值追加到n 的列表中,因为filter()函数返回的是一个Iterator,也就是一个惰性序列,所以需要不断的next获取他的值;

    然后就是不断的循环 it + 2 然后除以 之前的 it 的列表(也就是n)的值

    -----------------------类似于下面的代码------------------------------------

    def is_odd(n):
    return n % 2 == 1

    n = (filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
    print(n)
    print (next (n))
    print (next (n))
    print (next (n))
    print (next (n))
    -------------------------------------------------------

    代码参考:

    https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431821084171d2e0f22e7cc24305ae03aa0214d0ef29000




  • 相关阅读:
    __init__ 构造行数的用法
    Android SDK下载安装及配置教程
    每条用例执行10次
    Python Json模块中dumps、loads、dump、load函数介绍
    Python接口测试实战2
    linux 下添加环境变量 和刷新
    mysql 练习题笔记
    http请求脚本排错指南
    docker命令及其常用事项
    anaconda 环境
  • 原文地址:https://www.cnblogs.com/lighthouse/p/9378415.html
Copyright © 2011-2022 走看看