Python 如何使用";向后迭代字符串;适用于“范围内”;?(应用程序用于验证UPC代码)

Python 如何使用";向后迭代字符串;适用于“范围内”;?(应用程序用于验证UPC代码),python,python-3.x,Python,Python 3.x,我试图创建一个程序,根据用户输入的数字字符串检查任意长度的UPC代码(尽管大多数是12位)的有效性。我当前的方法是首先将字符串存储到列表中,然后使用“for in range”遍历列表 我使用的UPC代码验证算法的工作原理如下:(UPC代码的设计部分是为了防止收银员在结账时输入错误,因为一个错误的数字可能会使代码无效) 验证过程从右到左运行 对于偶数位置的数字,没有变化 对于奇数位置的数字,将数字乘以3 总结结果 对于有效的UPC编号,该总和将是10的倍数 我已经能够像我所希望的那样运行一切,但

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

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

  • 验证过程从右到左运行

  • 对于偶数位置的数字,没有变化

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

  • 总结结果

  • 对于有效的UPC编号,该总和将是10的倍数

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

    以下
    def upc\u 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代码显示为无效),但算法是从左向右遍历数字字符串的

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

    范围内的i(0,len(code)):

    对于范围(-1,-len(code),-1)中的i:

    这将使代码如下所示:

    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代码现在都返回无效值,我不确定原因。我希望输出是相同的。有人有什么建议吗?谢谢你的帮助

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

    096619363148

    017082886026

    381370036005

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

    096619363149

    017082786026


    381370036015

    这里需要的东西有点复杂。默认情况下,范围不会完全覆盖

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

    等将工作,但不觉得我很neet。我不知道另一种方法,也许其他人知道?

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

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

    范围内的i(0,len(code)):


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

    谢谢,我很感激!你能给我解释一下这个范围函数的用法吗?我的理解是,它在一个范围内(开始、停止、步骤),当倒数时,最后一个数字将得到索引-1,倒数第二个数字将得到-2,等等(而不是从列表开头的0、1、2、3…开始)。然而,我的理解似乎是有缺陷的,因为您的更改对我的代码很有效。停止位置为-1的原因是范围没有返回最终的“停止”索引,如果返回了,则前进时会得到12,并出现错误。因此,我们必须在后退时对其进行一点篡改,并在我们希望它前进的地方给它一个停止位置。这是stackoverflow上的传统做法,如果有人给你一个答案,你可以使用它,然后单击“接受答案”,并向上投票。非常感谢。