鍍金池/ 問(wèn)答/數(shù)據(jù)分析&挖掘  Python/ Python用filter求素?cái)?shù)

Python用filter求素?cái)?shù)

廖雪峰的Python教程中關(guān)于使用filter求素?cái)?shù)的例子不太明白,

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) #疑問(wèn)
for n in primes():
    if n < 30:
        print(n)
    else:
        break

關(guān)于這句it = filter(_not_divisible(n), it),既然it是一個(gè)iterator那就是惰性計(jì)算的,那么每次運(yùn)行到這句時(shí),filter只是對(duì)it代表的無(wú)限列表的當(dāng)前yield出來(lái)的一個(gè)值進(jìn)行了過(guò)濾,那么為什么最后可以得到通過(guò)了所有篩選條件的無(wú)限列表?

回答
編輯回答
念初

filter和map是類(lèi)似的,返回的也是一個(gè)迭代器,對(duì)傳入的可迭代對(duì)象的每一項(xiàng)用指定的函數(shù)進(jìn)行篩選,轉(zhuǎn)化為list或者使用for循環(huán)就會(huì)一次性對(duì)每一項(xiàng)進(jìn)行篩選,你可以試一試這一段代碼

for x in filter(lambda x % 2 == 0, range(10)):
    print(x)
2017年1月3日 02:40
編輯回答
深記你

按照官方文檔所說(shuō)的:
filter(function, iterable)等價(jià)于(item for item in iterable if function(item))

2017年9月23日 22:03