Discuss / Python / 试验 next 和 filter 时的一个奇怪问题

试验 next 和 filter 时的一个奇怪问题

Topic source

Chi-Chi_Z

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

Python小白,在测试 next() 和 filter连用时中发现一个奇怪的现象,无法理解,想像大家求教:

比如这样一段程序

ini = list(range(1, 6)) for i in range(2): ini.extend(ini) print(ini) g = (x for x in ini) #构造一个 1, 2, 3, 4, 5 重复出现4次的generator g_test=g

n=next(g_test) print(n) g_test=filter(lambda x: x != n, g_test) #去掉1 k=next(g_test) print(k) g_test=filter(lambda x: x != k, g_test) #去掉2 t=next(g_test) print(t) g_test=filter(lambda x: x != t, g_test) #去掉3

for i in g_test: print(i, end=' ')

结果能输出去掉了1, 2, 3 的序列: 1 2 3 4 5 4 5 4 5 4 5

但是如果把所有k和t改成n, 相当于:

ini = list(range(1, 6)) for i in range(2): ini.extend(ini) print(ini)

g = (x for x in ini) g_test=g

for i in range(3): n=next(g_test) print(n) g_test=filter(lambda x: x != n, g_test)

for i in g_test: print(i, end=' ')

输出变成了: 1 2 3 4 5 1 2 4 5 1 2 4 5 1 2 4 5

百思不得其解,初次提问,有谁能帮忙解释下么?谢谢!!

Cliymore

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

很简单!

生成器都是懒加载的 只有用的时候才会真正的调用调用算法生成。

第一种 n,k,t模式 在你最后for in的时候 他们的值分别是1,2,3 lambda表达式是3个

第二种 n模式的时候 在你最后for in的时候 n的值是3 所以lambda表达式是一个 就是过滤3 又因为你之前的for已经取得了前3个值 所以最后的for in的时候 实际是从第四个值开始过滤的 也就是过滤了第四个值开始以后的列表里的3

Chi-Chi_Z

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

哦懂了!谢谢!

Chi-Chi_Z

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

我觉得我应该还没有完全理解。之前看前面解释理解为由于延时调用,filter到最后for in in g_test 时候再调用,但是后来如果改一下程序如下列所示:

ini = list(range(1, 6)) for i in range(2): ini.extend(ini) print(ini) g_test = (x for x in ini)

for i in range(3): n=next(g) print(n) g_test = filter(lambda x: x != n+1, g_test)

for i in g_test: print(i, end=' ')

输出: 1 3 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

也就是说2 (n+1,n=1), 4(n+1,n=3) 在第一个for循环已被filter掉,那么最后又是怎么回事?是否能帮忙解释下上述程序段的计算流程。。。非常感谢!

Chi-Chi_Z

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

哦我懂了,filter不是对整个g_test在做filter,而是对每次要执行操作的的那个元素进行判断是否filter掉,所以next每读入一个元素,对该元素进行一次filter, 而最后的for in 循环依次读入generator中的剩下的元素并进行判断执行filter。

谢谢啦!


  • 1

Reply