所以我理解将偶数放在一个新的列表中但是当前面有一些奇数时我似乎只能调用-1?对于一个空字符串,当它应该返回-1
时,我会收到“没有”def first_even(items):
""" (list of int) -> int
Return the first even number from items. Return -1 if items contains no even numbers.
>>> first_even([1, 9, 3, 77, 13, 5, 8])
8
>>> first_even([7, 1])
-1
"""
even = []
for num in items:
if num % 2 == 0:
even.append(num)
else:
return -1
return even[0]
答案 0 :(得分:2)
def first_even(items):
""" (list of int) -> int
Return the first even number from items. Return -1 if items contains no even numbers.
>>> first_even([1, 9, 3, 77, 13, 5, 8])
8
>>> first_even([7, 1])
-1
"""
for num in items:
if num % 2 == 0:
return num
return -1
答案 1 :(得分:1)
else
块将针对第一个奇数执行,这将终止for
并丢弃所有先前的附加。相反,您希望在找到偶数后立即返回偶数(您不需要列表),然后移动else
以与for
对齐或在{{1}之外}:
for
Python def first_even(items):
for num in items:
if num % 2 == 0:
return num
else:
return -1
# or put the default value to return here
块参考:
答案 2 :(得分:1)
正如其他人所说,你的else
案例导致提前终止,而使用list
则毫无意义。您可以解决所有这些问题,查看极简主义修复的其他答案,但还有另一种选择:让Python内置函数为您完成更多工作。
The next
function将返回迭代器中的第一个项,并使用第二个参数,如果迭代器为空,则返回第二个参数。所以给它一个generator expression懒惰地产生输入中的所有偶数,它将拉出第一个并返回它。如果未找到,则默认情况下将为您返回-1
:
def first_even(items):
# x & 1 == 0 is roughly equivalent and might be slightly faster
return next((x for x in items if x % 2 == 0), -1)
对于病理类型,这可能会稍快一点,但对于那些不熟悉内部和外部Python内部的人来说,它不那么直观;我不推荐它:
from itertools import filterfalse # ifilterfalse on Py2
def first_even(items):
# (1).__rand__ is roughly equivalent, and may be faster
return next(filterfalse((2).__rmod__, items), -1)