Python Ifilter与lambda表达式一起使用

Python Ifilter与lambda表达式一起使用,python,lambda,generator,Python,Lambda,Generator,我想知道如何将ifilter与lambda表达式正确地结合使用! 这是我的代码,目的是让素数小于1000 import itertools 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

我想知道如何将ifilter与lambda表达式正确地结合使用! 这是我的代码,目的是让素数小于1000

import itertools
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)
        #it=itertools.ifilter(_not_divisible(n),it)   #This would work
        it=itertools.ifilter(lambda x:x%n>0,it)       #This would not work

for n in primes():
    if n<1000:
        print(n)
    else:
        break
导入itertools
定义奇数iter():
n=1
尽管如此:
n=n+2
产量
定义不可除(n):
返回λx:x%n>0
def primes():
收益率2
它=_odd_iter()
尽管如此:
n=下一个(it)
#it=itertools.ifilter(_not_divisible(n),it)#这会起作用
it=itertools.ifilter(lambda x:x%n>0,it)#这不起作用
对于素数()中的n:
如果n您的
primes()
函数在循环中缺少一个
yield

要使其在不使用
\u不可除(n)
的情况下工作,需要在lambda中为
n
指定正确的范围。最简单的方法是使用默认参数,每当lambda被传递到
ifilter()
时,该参数“冻结”
n
的值

我已经减小了循环大小,以使输出更加紧凑

import itertools

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

def primes():
    yield 2
    it = _odd_iter()
    while True:
        n = next(it)
        yield n
        it = itertools.ifilter(lambda x, n=n: x%n > 0, it)       

for n in primes():
    if n < 100:
        print(n)
    else:
        break

这是上述函数的一个小变化

def _iter():
    yield 2
    n = 3
    while True:
        yield n
        n = n + 2

def primes():
    it = _iter()
    while True:
        n = next(it)
        yield n
        it = itertools.ifilter(lambda x, n=n: x%n, it)       
您的
primes()
函数在循环中缺少一个
yield

要使其在不使用
\u不可除(n)
的情况下工作,需要在lambda中为
n
指定正确的范围。最简单的方法是使用默认参数,每当lambda被传递到
ifilter()
时,该参数“冻结”
n
的值

我已经减小了循环大小,以使输出更加紧凑

import itertools

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

def primes():
    yield 2
    it = _odd_iter()
    while True:
        n = next(it)
        yield n
        it = itertools.ifilter(lambda x, n=n: x%n > 0, it)       

for n in primes():
    if n < 100:
        print(n)
    else:
        break

这是上述函数的一个小变化

def _iter():
    yield 2
    n = 3
    while True:
        yield n
        n = n + 2

def primes():
    it = _iter()
    while True:
        n = next(it)
        yield n
        it = itertools.ifilter(lambda x, n=n: x%n, it)       

“结果并不像我期望的那样”-你期望的结果是什么,你得到了什么?我想让素数小于1000,但当我用lambda表达式替换不可除(n)时,奇数小于1000。请给出一个如何在素数()中摆脱while循环的例子?无论如何,回到你原来的问题,我认为这可能与lambda函数中局部变量n的范围有关。“结果与我预期的不一样”-你预期的结果是什么,你得到的结果是什么?我希望素数小于1000,但当我替换不可除(n)时,奇数小于1000使用lambda表达式。请给出一个如何在primes()中退出while循环的例子?无论如何,回到您最初的问题,我认为它可能与lambda函数中局部变量n的范围有关。