我的代码包括我重新创建函数'filter()'并将其与一个函数一起使用来过滤超过5个字符的单词。当我尝试使用它时,它与实际的函数过滤器一起使用...我正在使用python 3 +
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
答案 0 :(得分:1)
您在这里将两个参数传递给fn
(引用filter_long_words
):
a[i] = fn(a[i], a[u])
但filter_long_words
只接受一个参数。
注意:
for item in my_list
循环浏览列表,或者如果您想要索引for index, item in enumerate(my_list)
。IndexError
,因为u
将在您的循环的第一轮中-1
。filter
函数也可以表示为列表理解:(item for item in listered if filter_long_words(item))
如果我必须使用filter
循环,我的for
版本会如下所示:
def my_filter(fn, sequence):
if fn is None:
fn = lambda x: x
for item in sequence:
if fn(item):
yield item
由于您已声明使用的是Python 3,因此返回生成器而不是列表。如果你想要它返回一个列表:
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
如果您不需要使用for
循环:
def my_filter(fn, sequence):
if fn is None:
fn = lambda x: x
return (item for item in sequence if fn(item))
答案 1 :(得分:1)
您在fn
中使用2个参数调用filter1(fn, a)
,并且由于您已将filter_long_words()
传递给filter1
fn
,这会触发错误。
但是有更奇怪的东西:
我不理解filter1
或你想要的东西
完成,但在我看来,你不知道该怎么做。
但是如果你想模仿(不知何故)filter
如何运作,你必须返回一个
列表,其中仅包含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_long_words
函数也是错误的 - 它应该返回True或
假。它可以工作的唯一原因是因为任何非空列表都是
python处理为True
,函数的默认返回值为None
,
转换为False。但是使用起来会让人感到困惑和语法错误
len[l]
- 正确用法为len(l)
。
有一些重写的建议,它们都返回显式的布尔值
值:
# unnecessary long, but self-explanatory:
def filter_long_words(l):
if len(l) > 5:
return True
else
return False
# short variant
def filter_long_words(l):
return len(l) > 5
答案 2 :(得分:0)
您使用2参数=>调用“filter_long_words” fn(a [i],a [u])也有错误
def filter_long_words(l):
if **len[l]** > 5:
return [l]
len是内置方法,它应该是len(l)