我的代码中有一个无法识别的错误。如果列表包含True
,则此代码应返回[3,3]
。
但是,如果我写一个else
条件,它总是显示False
。如果我跳过else
条件,则代码可以正常工作。
def has_33(nums):
for i in range(0,len(nums)-1):
if nums[i]==3 and nums[i+1]==3:
return True
else:
return False
pass
上面的代码返回:
# Check
has_33([1, 3, 3]) . -- > False
# Check
has_33([1, 3, 1, 3]) --> False.
但是,如果我将代码更改为此:
def has_33(nums):
for i in range(0,len(nums)-1):
if nums[i]==3 and nums[i+1]==3:
return True
pass
代码工作正常:
# Check
has_33([1, 3, 3]) --> True
# Check
has_33([1, 3, 1, 3]) -- > Returns nothing , False.
为什么会这样?
答案 0 :(得分:3)
其他答案很好地解释了该错误。我确实想指出两件事。
for n in nums
)。使用any()
和zip()
内置函数考虑以下代码。
def has_33(nums):
return any(x==y==3 for x, y in zip(nums, nums[1:]))
如果需要的话,可以使其更通用,从而使其可能适用于其他项目。使用默认值可以保留原始行为。
def has_duplicate(nums, val=3):
return any(x==y==val for x, y in zip(nums, nums[1:]))
答案 1 :(得分:2)
这是因为else条件首先被满足。 您有一个for循环,遍历列表[1,3,3]中的所有数字,首先检查第一个数字为1,然后检查第二个数字为3;
if nums[i]==3 and nums[i+1]==3:
在这种情况下,nums [i]为1,这意味着nums [i] == 3不是True,这意味着您的代码将直接进入Else
解决问题的方法很简单:
def has_33(nums):
for i in range(len(nums)):
if nums[i]==3 and nums[i+1]==3:return True
return False
答案 2 :(得分:1)
尝试这样,您的代码中发生错误,因为它会在第一个循环本身中返回并从代码中退出。因此,您可以提供一个标志,只要条件满足,将标志更改为true,然后最后返回标志:
def has_33(nums):
flag = False
for i in range(0,len(nums)-1):
if nums[i]==3 and nums[i+1]==3:
flag = True
return flag
答案 3 :(得分:1)
您还可以在函数中进行一些小的调整,并以这种方式减少“ else”语句的缩进:
def has_33(nums):
for i in range(0,len(nums)-1):
if nums[i]==3 and nums[i+1]==3:
return True
else:
return False
pass
这是Python中“ for”循环的标准结构-如果您的循环正确无中断地正确完成(在您的情况下-在列表中没有找到两个后续的“ 3”),它将执行“ else”语句。