其他条件总是有效的

2024-04-27 03:36:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码中有一个我无法识别的bug。如果列表包含[3,3],则此代码应返回True。你知道吗

但是,如果我写一个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.

为什么会这样?你知道吗


Tags: 代码infalsetrueforlenreturnif
3条回答

因为else条件是先满足的。 有一个for循环遍历列表[1,3,3]中的所有数字,首先检查第一个数字是1,然后检查第二个数字是3

if nums[i]==3 and nums[i+1]==3:

在本例中,nums[i]是1,这意味着nums[i]==3不是真的,这意味着您的代码将直接转到Else

解决问题的方法很简单:

def has_33(nums):
    for i in range(len(nums)):
        if nums[i]==3 and nums[i+1]==3:return True
    return False

像这样尝试,错误发生在代码中,因为它将在第一个循环中返回并从代码中退出。因此,您可以给出一个标志,只要条件满足,就将该标志更改为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

其他答案很好地解释了这个错误。不过,我确实想指出两点。你知道吗

  1. Python中的最佳实践是尽可能避免对一组索引进行迭代,而更倾向于对对象进行迭代(例如for n in nums)。你知道吗
  2. 有一些库函数可以让你的生活更轻松。你知道吗

考虑以下使用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:]))

相关问题 更多 >