其他条件始终有效

时间:2018-10-05 05:31:08

标签: python if-statement

我的代码中有一个无法识别的错误。如果列表包含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.

为什么会这样?

4 个答案:

答案 0 :(得分:3)

其他答案很好地解释了该错误。我确实想指出两件事。

  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:]))

答案 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”语句。