Python信用卡校验代码求助:main报错等3个疑问
C50信用卡校验开发问题解答
问题1:定义main函数时出现name 'card' is not defined错误,不定义则正常运行的原因
这是变量作用域导致的问题:
- 不定义main函数时,
card是全局变量,整个代码文件内的所有代码都能访问它。 - 当你把输入处理等代码封装进
main函数后,card变成了main函数的局部变量,函数外部的代码(比如后面调用split_to_digits的逻辑)无法访问这个局部变量,因此会抛出未定义的错误。
解决方式:把所有依赖card的代码都移到main函数内部,或者将card作为参数传递给需要它的函数。
问题2:打印sum显示“built in function sum”的解决方法
出现这个问题有两个核心原因:
sum是Python的内置函数,你把它当成普通变量名使用,但代码中没有给它全程赋值(比如循环中只有满足条件时才给sum赋值,否则sum仍指向内置函数)。- 循环逻辑错误,导致
sum的赋值逻辑没有被正确触发。
解决步骤:
- 不要使用内置函数名作为变量名,改用
double_sum、total这类自定义名称。 - 先初始化累加变量(比如
double_sum = 0),再在循环中逐步累加计算结果,避免未赋值的情况。 - 修正循环遍历逻辑(原代码遍历的是列表元素而非索引,导致索引越界错误)。
问题3:代码中的其他错误及解释
1. 无效输入后未终止程序
原代码中,当卡号长度不符合要求、前缀不匹配时,仅打印INVALID但继续执行后续代码,会导致逻辑混乱。比如长度不对的卡号,仍会进入Luhn算法计算步骤。
修正:打印INVALID后添加exit()(全局代码)或return(函数内)终止程序。
2. 循环遍历逻辑错误
原代码中for i in everyotherdig是遍历列表中的元素,而非索引,后续使用everyotherdig[i]会尝试用元素值作为索引访问列表,大概率触发IndexError(比如元素是5,列表长度只有3时,everyotherdig[5]超出范围)。
修正:直接遍历元素计算,或者使用enumerate遍历索引和元素。
3. Luhn算法实现错误
原代码中处理乘2后的数字逻辑完全错误:
split_to_digits(everyotherdig[i]) * 2会把列表重复两次(比如[1,4]*2变成[1,4,1,4]),不是数字相乘。- 没有正确累加乘2后数字的各位和(比如14应该计算为1+4=5,而非直接用14)。
- 没有累加未乘2的数字之和,也没有判断最终总和是否为10的倍数(Luhn算法的核心判断条件)。
4. 前缀列表错误
原代码中prefixes包含"50",但MasterCard的有效前缀是51-55,"50"不属于有效前缀,需要移除。
修正后的完整代码
def split_to_digits(s): return [int(c) for c in s] def main(): # 处理用户输入 while True: try: card = input("Credit card number: ").strip() # 直接处理字符串,避免转int时丢失前导零(虽然信用卡号无前置零,但更严谨) if not card.isdigit() or int(card) <= 0: print("INVALID") continue break except: print("INVALID") # 检查卡号长度 if len(card) not in (13, 15, 16): print("INVALID") return # 有效前缀列表(修正错误的"50") valid_prefixes = ("4", "34", "37", "51", "52", "53", "54", "55") # 检查前缀 valid_prefix = False for prefix in valid_prefixes: if card.startswith(prefix): valid_prefix = True break if not valid_prefix: print("INVALID") return # 提取需要处理的数字 # 从倒数第二位开始,每隔一位取数(乘2的部分) double_digits = split_to_digits(card[-2::-2]) # 从最后一位开始,每隔一位取数(不乘2的部分) normal_digits = split_to_digits(card[-1::-2]) # 计算乘2后的各位和 double_sum = 0 for num in double_digits: product = num * 2 # 乘积大于等于10时,拆分各位相加;等价于 product - 9 double_sum += product if product < 10 else (product // 10 + product % 10) # 计算未乘2的数字和 normal_sum = sum(normal_digits) # 总校验和 total = double_sum + normal_sum # Luhn算法判断:总和需能被10整除 if total % 10 == 0: # 判断卡组织 if card.startswith("4"): print("VISA") elif card.startswith(("34", "37")): print("AMEX") elif card.startswith(tuple("5152535455")): print("MASTERCARD") else: print("INVALID") if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Saurias
相关产品推荐
相关产品推荐

