有人可以评价这段代码的效率吗?
它应该模仿电话号码的 IMEI 验证器,只是作为一个有趣的项目。
如果您不知道应该将每隔一个数字乘以 2,然后将所有数字加在一起,除了最后一个数字,它总是会相加,例如:
123456789
1 + (4) + 3 + (8) + 5 + (1 + 2) + 7 + (1 + 6) = 38
38 + 9 = 47
然后对 10 取模,如果没有余数,则为有效数,如果有余数,则为无效数。
我仍然有一些用于测试的打印语句,忽略它们,我怎样才能使我的代码减少一行或使其尽可能高效。
我做了一些编程,但很难弄清楚程序的效率。
任何帮助将不胜感激!
n = input("Enter number: ")
og = n.split()
new = []
sum_new = 0
def create_new():
global n
global new
temp_n = 0
for i in range (len(n)):
#test_bool = i+1 % 2 == 0 #i < len(n) - 1 and
#print(test_bool)
# print(i+1)
if i < len(n) - 1 and (i+1) % 2 == 0:
#print("test")
temp_n = str(int(n[i]) * 2)
if len(temp_n) > 1:
new.append(int(temp_n[0]))
new.append(int(temp_n[1]))
#print("doubled double! " + str(new[i]) + " " + str(new[i+1]))
else:
new.append(int(temp_n))
#print("doubled! " + str(new[i]))
else:
new.append(int(n[i]))
# print("not doubled " + str(new[i]))
create_new()
def find_sum():
global sum_new
for i in range (len(new)-1):
sum_new += new[i]
sum_new += new[len(new)-1]
find_sum()
#print(new)
#print (sum_new)
if sum_new % 10 == 0:
print("Valid.")
else:
print("Invalid.")
为什么不使用阶梯式
for
来迭代 n
?这样,您就不需要检查元素是否具有偶数索引,步进的 for
会跳过可迭代中的许多元素(如指定的)。就像这样
for i in range (0, len(n)-1, 2):
这将仅选择具有偶数索引的元素
一种方法是创建两个列表,一个包含具有奇数索引的数字,另一个包含具有偶数索引的数字。您可以通过使用切片来实现此目的。例如,如果您已将 IMEI 的数字保存到名为
list
的 IMEI
,则 IMEI[::2]
和 IMEI[1::2]
将为您提供两个 list
,分别包含偶数索引和奇数索引的数字。这可以这样实现:
summed = 0
imei = list(input("Enter number: "))[::-1]
for digit in imei[1::2]:
digit = str(int(digit) * 2)
summed += sum(int(x) for x in digit)
for digit in imei[::2]:
summed += int(digit)
print("Valid." if summed % 10 == 0 else "Invalid.")
我在这里使用
sum(int(x) for x in digit)
来解决将两双数的数字相加的问题。它本质上与用于计算数字根的代码相同,只是它只运行一次,因为永远不会有超过两位数的数字。
就我个人而言,我会这样做:
double = False
summed = 0
for digit in input("Enter number: ")[::-1]:
if double is True:
digit = str(int(digit) * 2)
summed += sum(int(x) for x in digit)
double = not double
print("Valid." if summed % 10 == 0 else "Invalid.")
这样,您只需要迭代 IMEI 一次。在前面的示例中,我们创建然后迭代两个单独的
list
,这不是很高效。