For循环由于返回而在嵌套的ifs和函数中提前终止

时间:2019-01-13 16:37:50

标签: python function for-loop if-statement return

我正在尝试解决以下练习问题:

”“想象一下,您正在为库存系统编写软件, 一家商店。该软件的一部分需要检查以查看是否输入 产品代码有效。

如果满足以下所有条件,则产品代码有效 正确:

  • 产品代码的长度是4的倍数。可以 长度为4、8、12、16、20等。
  • 产品代码中的每个字符均为大写 字符或数字。没有小写字母或标点符号 允许标记。
  • 字符序列“ A1”出现在 产品代码。

编写一个称为valid_product_code的函数。 valid_product_code 应该有一个参数,一个字符串。如果它应该返回True 该字符串是有效的产品代码,如果不是,则为False。”

def valid_product_code(code):
    if len(code)%4 == 0:
        if "A1" in code:
            if code.isalnum():
                for character in code:
                    #print(character) 
                    #print statement above when uncommented used to 
                    #check if the loop is actually running as intended
                    if character.isupper() or character.isdigit():
                        return True
                    else:
                        return False
            else:
                return False
        else:
            return False
    else:
        return False

练习题有几个测试字符串,其中包括以下内容:

print(valid_product_code("A12B44BP"))
print(valid_product_code("BFDSAUSA98932RWEFOEWA9FEAA1DSFSF"))
print(valid_product_code("A1BBD5"))
print(valid_product_code("BDD5664S"))
print(valid_product_code("66aBSaA1fdsv"))

我的代码适用于前四个示例,结果为True, True, False, False,但最后一个应为False,我得到了True。尝试进行一些调试(因此,在for循环中将print(character)并将return Truereturn False分别更改为print(True)print(False)语句)之后,{{1我曾经检查过的}}语句表明,所有小写字母都具有print值,而数字和大写字母则具有预期的False值。

我对3个外部True语句没有任何问题,但是一旦我需要隔离小写字符,我以为每个循环就足够了,但是事实上这是一个函数意味着if是过早地终止我的函数,并且不允许我实际表明整个字符串中甚至只有一个小写字母都应将整个字符串的值呈现为return。我感觉有些遗漏,例如可能是我将False语句放在错误的位置,还是我只是以错误的方式处理了这个问题?

请先帮助并感谢!

1 个答案:

答案 0 :(得分:0)

您最里面的循环没有正确实现。目前,if character.isupper() or character.isdigit():将在检测到前6个后立即返回True

您需要检查每个元素。这可以通过以下方式完成。我通过评论#

突出显示了已修改的行
def valid_product_code(code):
    if len(code)%4 == 0:
        if "A1" in code:
            if code.isalnum():
                for character in code:
                    if not (character.isupper() or character.isdigit()): # <---
                        return False # <----
                return True # <---
            else:
                return False
        else:
            return False
    else:
        return False

print(valid_product_code("A12B44BP"))
print(valid_product_code("BFDSAUSA98932RWEFOEWA9FEAA1DSFSF"))
print(valid_product_code("A1BBD5"))
print(valid_product_code("BDD5664S"))
print(valid_product_code("66aBSaA1fdsv"))

True
True
False
False
False

或者,您可以结合使用if语句使代码更加紧凑

def valid_product_code(code):
    if len(code)%4 == 0 and "A1" in code and code.isalnum():
                for character in code:
                    if not (character.isupper() or character.isdigit()):
                        return False
                return True
    else:
        return False