Discuss / Python / 用filter求素数--的疑问

用filter求素数--的疑问

Topic source

沧海奇迹1

#1 Created at ... [Delete] [Delete and Lock User]

#定义一个筛选函数:

def _not_divisible(n):

    return lambda x: x % n > 0

哪位大神能解释一下,lambda表达式里的x变量是谁传递的啊?

long8035

#2 Created at ... [Delete] [Delete and Lock User]

返回的是一个lambda函数,return lambda x: (x % n) > 0,该lambda函数中的参数n用_not_divisible函数传入的参数n指定。

沧海奇迹1

#3 Created at ... [Delete] [Delete and Lock User]

那么x就是it传递的值了吧?但是不明白it是如何传递给变量x的?

long8035

#4 Created at ... [Delete] [Delete and Lock User]

a = _not_divisible(n); it = filter(a,it),这里it是迭代器,你可以把it看成一个无穷可数的序列(等价于生成器),每次触发fitler就在序列中索引顺序递增地寻找一个数,使得其作为位置参数

传入函数对象a计算得到True结果,如果不存在这样的数,就会不停地搜寻下去。

为简化理解实现过程,将prime()函数里面的内容展开:

it0=_odd_iter(); {n0 = next(it0); a0 = _not_divisible(n0); it1 = filter(a0,it0);  n1 = next(it1); a1 = _not_divisible(n1); it2 = filter(a1,it1); n2 = next(it2); a2 = _not_divisible(n2); it3 = filter(a2,it2); ...}

prime()里面的while循环部分是yield产生式,故而可以描述上述大括号中的无穷嵌套过程,每循环一次,就把新获得的素数加进来通过%验证后面的数是否素数。

上述展开运行后,你可验证next(it3)一定递增给出不能整除3或5或7的奇数,next(it2)一定递增给出不能整除3或5的奇数,next(it1)一定递增给出不能整除3的奇数,next(it0)一定递增给出奇数。

如果调用next(it3),则依次嵌套触发it2->it1->it0生成下一个数,如果it0当前生成的数通过filter(a0,it0)则作为it1生成的数,否则继续生成下一个数。依此类推,直至出现作为it3生成的数。

可以确信,如果素数很大,上述嵌套会导致函数栈爆仓,并且计算过程会耗时很长。如果相邻素数间距很大,上述计算过程会耗时很长。所以上述只是一种生成素数的代码简洁的方法,

但性能和风险就有待商榷了。

Gino_wang

#5 Created at ... [Delete] [Delete and Lock User]

def is_palindrome(n):

    numSource = str(n)

    antiNumSource = []

    for v in numSource:

        antiNumSource.insert(0,v)

    antiNumSource = ''.join(antiNumSource)

    #print(antiNumSource)

    if numSource == antiNumSource:

         return True

    else:

         return False

===================

def is_palindrome(n):

    LSource = list(str(n))

    LNow = []

    for v in LSource:

        LNow.insert(0,v)

    if LSource == LNow:

        return True

    else:

        return False


  • 1

Reply