我应该以更好的方式重写我自己的函数。该函数接受一个迭代器和一系列布尔函数,并返回输入迭代器中元素的迭代器,该迭代器返回一个真值。
def allTrue (iterator, funz):
for i in iterator:
count = 0
for f in funz:
if f(i):
count = count+1
if count==len(funz):
yield i
Run Code Online (Sandbox Code Playgroud)
我试着写这个:
def allTrue2 (iterator, funz):
return (filter (f , iterator) for f in funz)
Run Code Online (Sandbox Code Playgroud)
但这是错误的。我怎样才能改进代码?
输出:
print(list(allTrue(range(50),
(lambda x: x % 3 == 0,
lambda x: x > 10,
lambda x: x < 44)
)))
>>> [12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42]
Run Code Online (Sandbox Code Playgroud)
如果你想要一个单线,只是为了完整性:
def allTrue (iterator, funz):
return (i for i in iterator if all(f(i) for f in funz))
Run Code Online (Sandbox Code Playgroud)
请注意,这会返回一个生成器,因此与使用yield.
def allTrue(iterator, funz):
for i in iterator:
if all(f(i) for f in funz):
yield i
Run Code Online (Sandbox Code Playgroud)