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