Discuss / Python / 问个问题

问个问题

Topic source

第一个例子是这样的

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

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))

这时是把list中的每一项当做n输入进is_odd函数中进行运算

第二个例子是这样的

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

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

def out():
	yield 2
	f = odd()
	while True:
		n = next(f)
		yield n
		f = filter(not_odd(n), f)

这时确是把list里的每一项当做not_odd里的x进行运算

如何确认每一项会被代入到哪里?还是见缝插针?

可能我的意思表达不清楚,学的晕晕乎乎的。

雨鸢梦

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

按照廖雪峰老师的思路,

while True:
        n=next(it)
        yield n
        it=filter(not_divisible(n),it)

此时it的第一个数字是3,3是素数,输出后,此时n是3,再根据

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

这个函数进行筛选,满足lambda x: x%n>0,也就是不能被整除,才是True,不会在筛选时被剔除。筛选用的是filter,此时把it中所有3的倍数(包括3,因为3一开始就输出过了)都删去,然后开始下一个循环。下一个循环的开始,it中的第一个数字是5,yield会输出5,接着删去5的倍数,不断循环,最后剩下的都是素数了。

emmm不知道我的思路对不对

filter()把传入的函数依次作用于每个元素

我的理解是:

第一个例子,filter的第一个参数直接写了函数名,没有写这个函数需要的参数,filter就会用这个函数名对应的函数进行筛选,把迭代器的每个元素作为参数传入函数

第二个例子,filter的第一个参数的函数名加了参数,filter就不会用not_odd这个函数进行筛选,而是用这个函数里面的匿名函数,并把迭代器的每个元素作为这个匿名函数的参数进行筛选

我也是猜的,不过这样对于我来说似乎比较好理解且合理

f是剩下被筛选的序列filter直接筛选出一个新序列,并不是一个一个筛选的


  • 1

Reply