使用lambda与yield时遇TypeError:'filter'对象不可迭代的解决问询
问题分析与修复
问题原因
正常情况下,Python 3 中filter()函数返回的是迭代器对象,本身是可迭代的,完全可以用yield from直接迭代。你遇到的TypeError: 'filter' object is not iterable报错,大概率是你的代码环境中filter被重定义成了非迭代类型的对象——比如之前的代码里不小心把filter作为变量名赋值(比如filter = [1,2,3]),或者自定义了一个名为filter的函数,覆盖了内置的filter函数。
你提到转成列表也没解决问题,这进一步验证了这个猜测:如果filter被重定义,那filter(...)返回的根本不是内置的filter迭代器,转列表自然也无法正常工作。
修复方案
方案1:检查并移除对filter的重定义
全局搜索你的代码,找到所有把filter当作变量名或自定义函数名的地方,将其改名(比如改成my_filter),恢复内置filter函数的正常功能。
方案2:直接用生成器表达式替代filter
避开可能被污染的filter,直接用生成器表达式实现筛选逻辑,代码更直观且不受环境影响:
def generate_even_numbers(n): yield from (x for x in range(n) if x % 2 == 0) for num in generate_even_numbers(10): print(num)
方案3:显式调用内置filter函数
如果确实无法修改重定义的filter,可以通过builtins模块(Python3)调用原生的filter:
import builtins def generate_even_numbers(n): even_numbers = builtins.filter(lambda x: x % 2 == 0, range(n)) yield from even_numbers for num in generate_even_numbers(10): print(num)
验证效果
修复后运行代码,会输出0到8之间的所有偶数:
0 2 4 6 8
内容的提问来源于stack exchange,提问作者scissors127
相关产品推荐
相关产品推荐

