如何使用“for in range”向后遍历字符串?(应用程序用于验证UPC代码)

2024-05-13 10:36:14 发布

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

我试图创建一个程序,根据用户输入的数字字符串检查任何长度的UPC代码(尽管大多数是12位)的有效性。我目前的方法是首先将字符串存储到列表中,然后使用“for in range”遍历列表

我使用的UPC代码验证算法的工作原理如下:(UPC代码的设计部分是为了防止收银员在结账时输入错误,因为一个错误的数字可能会使代码无效)

  1. 验证过程从右到左运行。

  2. 对于偶数位置的数字,没有变化。

  3. 对于奇数位置的数字,将数字乘以3。

  4. 对结果求和。

  5. 对于有效的UPC数字,此总和将是10的倍数。

我已经能够像我所希望的那样运行一切除了准则1,验证过程从右到左发生在UPC代码中的数字串上。我现在的方法是从左到右。如果用户输入的UPC代码是奇数位数,这将证明是一个问题,因为它会使算法失效。

下面def upc_check(code):中的输入code是用户输入的UPC代码,以查看UPC代码是否有效。你知道吗

def upc_check(code):
    ODD_DIGIT_MULTIPLIER = 3
    UPC_VALIDITY_DIVISOR = 10
    digits = []
    for num in code:
        digits.append(int(num))
    print(digits)
    check_sum = 0
    for i in range(0, len(code)):
        if (i + 1) % 2 != 0:
            check_sum += (ODD_DIGIT_MULTIPLIER * digits[i])
        else:
            check_sum += (digits[i])
    if check_sum % UPC_VALIDITY_DIVISOR == 0:
        return "Valid UPC code."
    else:
        return "Invalid UPC code."

目前,输出与我期望的一样(即有效的UPC代码显示为有效,无效的UPC代码显示为无效),但算法是从左到右遍历数字字符串。你知道吗

从右到左,我希望我可以进行以下替换并获得相同的结果:

for i in range(0, len(code)):

for i in range(-1, -len(code), -1):

这将使代码如下所示:

def upc_check(code):
    ODD_DIGIT_MULTIPLIER = 3
    UPC_VALIDITY_DIVISOR = 10
    digits = []
    for num in code:
        digits.append(int(num))
    print(digits)
    check_sum = 0
    for i in range(-1, -len(code), -1):
        if (i + 1) % 2 != 0:
            check_sum += (ODD_DIGIT_MULTIPLIER * digits[i])
        else:
            check_sum += (digits[i])
    if check_sum % UPC_VALIDITY_DIVISOR == 0:
        return "Valid UPC code."
    else:
        return "Invalid UPC code."

但是,当我进行此更改时,所有有效的UPC代码现在返回值invalid,我不确定原因。我希望输出是相同的。有人有什么建议吗?谢谢你的帮助!你知道吗

如果有助于检查,以下是有效的UPC代码:

096619363148号

017082886026

381370036005号

以下是一些无效的UPC代码(上面代码的故意输入错误):

096619363149

017082786026

381370036015号


Tags: 代码inforcheckcoderange数字divisor
2条回答

如果代码从左到右按预期工作,保持大部分代码不变的快速方法是在for循环之前反转数字列表。你知道吗

所以digits = digits.reverse()和for循环的第一行可以保持原样

for i in range(0, len(code)):

我将对此进行测试,并很快更新我的答案。你知道吗

你需要的有点复杂。默认情况下,范围不会完全覆盖。你知道吗

for i in range(len(code)-1,-1,-1):

等会工作,但不觉得我是非常啃老族。我不知道另一种方法,也许别人知道?你知道吗

相关问题 更多 >