Python 正在写入filter()函数但获取typeError

Python 正在写入filter()函数但获取typeError,python,python-3.x,filter,Python,Python 3.x,Filter,我的代码包括重新创建函数“filter()”并将其与一个函数一起使用,以过滤长度超过5个字符的单词。顺便说一句,我使用的是Python3+ def filter1(fn, a): i = 0 while i != len(a): u = i - 1 a[i] = fn(a[i], a[u]) i += 1 return a def filter_long_words(l): if len[l] > 5:

我的代码包括重新创建函数“filter()”并将其与一个函数一起使用,以过滤长度超过5个字符的单词。顺便说一句,我使用的是Python3+

def filter1(fn, a):
    i = 0
    while i != len(a):
        u = i - 1
        a[i] = fn(a[i], a[u])
        i += 1
    return a


def filter_long_words(l):
    if len[l] > 5:
        return [l]

listered = ['blue', 'hdfdhsf', 'dsfjbdsf', 'jole']
print(list(filter1(filter_long_words, listered)))
获取错误

TypeError: filter_long_words() takes 1 positional argument but 2 were given

您正在将两个参数传递给
fn
(它指的是
filter\u long\u words
):

但是
filter\u long\u words
只接受一个参数

注:

  • 您可以对“我的列表”中的项目使用
    循环浏览列表,或者如果您也希望对“枚举(我的列表)”中的项目的索引使用
  • 我想您可能会得到一个
    索引器
    ,因为
    u
    将在第一轮循环中
    -1
  • filter
    功能也可以表示为列表理解:
    (如果filter\u long\u words(item))
如果我必须使用
for
循环,我的
过滤器版本将如下所示:

def my_filter(fn, sequence):
    if fn is None:
        fn = lambda x: x
    for item in sequence:
        if fn(item):
            yield item
def my_filter(fn, sequence):
    if fn is None:
        fn = lambda x: x
    return (item for item in sequence if fn(item))
因为您已经声明您正在使用Python3,所以这将返回一个生成器而不是列表。如果希望它返回列表:

def my_filter(fn, sequence):
    if fn is None:
        fn = lambda x: x
    acc = []
    for item in sequence:
        if fn(item):
            acc.append(item)
    return acc
如果不需要为
循环使用

def my_filter(fn, sequence):
    if fn is None:
        fn = lambda x: x
    for item in sequence:
        if fn(item):
            yield item
def my_filter(fn, sequence):
    if fn is None:
        fn = lambda x: x
    return (item for item in sequence if fn(item))
您正在使用2个参数=>fn(a[i],a[u])调用“filter\u long\u words”,并且出现了一个错误

def filter_long_words(l):
    if **len[l]** > 5:
        return [l]

len是内置的方法,它应该是len(l)

您正在调用
fn
,在
filter1(fn,a)
中有两个参数,并且由于您已将
filter\u long\u words()
作为
fn
传递给
filter1
,因此触发错误

但还有更奇怪的事情:

我不明白过滤器的魔力,也不明白你想做什么 完成,但在我看来,你似乎不清楚该做什么。 但是,如果您想(以某种方式)模拟
过滤器的工作方式,则必须返回一个
仅包含
fn
函数返回true的项目的列表。什么时候 你知道这一点,你可以重写它-这里有一些重写的建议

# explicit, inefficient and long, but straightforward version:
def filter1(fn, a):
    new_list = []
    for item in a:
        if fn(item):
            new_list.append(item):
    return new_list

# shorter version using list comprehensions:
def filter1(fn, a):
    return [item for item in a if fn(item)]
filter\u long\u words
函数也错误-它应该返回True或True 错。它可以工作的唯一原因是因为任何非空列表都是空的 python将其视为
True
,函数的默认返回值为
None
, 这就意味着错误。但使用它会让人困惑,而且在语法上是错误的
len[l]
-正确的用法是
len(l)
。 有一些关于重写的建议,它们都返回显式布尔值 价值观:


a[i]=fn(a[i],a[u])
应该做什么?那么使用for循环时新的filter()应该是什么样子呢??