如何让我的代码更高效(Python 中的 IMEI 验证器)

问题描述 投票:0回答:2

有人可以评价这段代码的效率吗?

它应该模仿电话号码的 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.")

python coding-style memory-efficient imei
2个回答
0
投票

为什么不使用阶梯式

for
来迭代
n
?这样,您就不需要检查元素是否具有偶数索引,步进的
for
会跳过可迭代中的许多元素(如指定的)。就像这样

for i in range (0, len(n)-1, 2):

这将仅选择具有偶数索引的元素


0
投票

一种方法是创建两个列表,一个包含具有奇数索引的数字,另一个包含具有偶数索引的数字。您可以通过使用切片来实现此目的。例如,如果您已将 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
,这不是很高效。

© www.soinside.com 2019 - 2024. All rights reserved.