You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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”的解决方法

出现这个问题有两个核心原因:

  1. sum是Python的内置函数,你把它当成普通变量名使用,但代码中没有给它全程赋值(比如循环中只有满足条件时才给sum赋值,否则sum仍指向内置函数)。
  2. 循环逻辑错误,导致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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:12:51