Python 正在写入filter()函数但获取typeError
我的代码包括重新创建函数“filter()”并将其与一个函数一起使用,以过滤长度超过5个字符的单词。顺便说一句,我使用的是Python3+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:
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()应该是什么样子呢??