看文字的话会很乱,和图一起看会好一点
创新互联长期为上千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为康保企业提供专业的成都做网站、成都网站制作、成都外贸网站建设,康保网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。
首先,it是个生成器(_odd_iter),并使n=3,随后,it作为一个生成器存在于filter对象中(迭代器),并使it为一个filter对象,经过循环,到达next语句,先计算it _odd_iter(生成器),生成了新的数之后,开始计算filter。第一次循环的时候第18行的代码相当于 it = filter(_not_divisible(3), it ),等号右面的it还在等待next调用生成值,生成值之后,就将它代入为lambda的x中……第二次循环的时候第18行代码变成 it = filter(_not_divisible(5), filter(_not_divisible(3), it ) ),同样等号右面的it仍然在等待next调用生成新的值
我刚看这个教程,不知道对不对。。。
对了我看见有一个人问把代码第18行改成 it = filter(lambda x: x % n 0, it)
会失去过滤功能,我觉得,lambda是一个临时函数,所以觉得像filter(div(5), filter(div(3), it))这种存在多个lambda临时函数的话是很奇怪的,
在调试时,发现filter只检测了一个n(最近被赋值的),相当于7%5,9%7这样,因此失去过滤素数功能。模拟一下,在将要输出5的时候,it = filter()的那行代码变为:
it = filter(lambda x : x % n 0 , filter (lambda x : x % n 0 , it ) ),it将值赋给x,但是,我觉得n被赋值时,会刷新其他lambda中的n,造成类似于 it = filter(lambda x : x % 5 0 , filter (lambda x : x % 5 0 , it ) )的情况
filter就是按条件筛选:
filter(bool,['spam','','ni'])
list(filter(bool,[''spam,'','ni']))
输出的结果为['spam','ni']
#按照bool型筛选,因为中间的‘’,为空,不是bool型所以过滤掉。
首先定义一个函数判断是否为素数,如果这个数能被2~它的平方根中的任一数整除的话它就不是素数,否则就是素数。用flag为0或1标记,利用filter()筛掉flag为0的非素数。
#!/usr/bin/env python
#coding:utf-8
import math
def filter_prime(n): #定义filter_prime函数
flag = 1 #设置flag,初始化为1
for i in range(2, int(math.sqrt(n)+1)): #取2至平方根的数
if n%i == 0: #判断是否是素数
flag = 0 #如果不是,flag设为0
if flag == 1: #退出循环后判断flag,若为1(素数),则返回
return n
print filter(filter_prime, range(1,101)) #filter 1-100里的非素数