Python中如何正确校验用户输入的卡号与PIN是否匹配字典键值对
银行卡与PIN绑定校验的正确实现
原代码的两处核心错误
- 类型不匹配:生成卡片时存储的
card_num、pin_num都是整数类型,但input获取的用户输入默认是字符串类型,哪怕数值完全相同,也无法通过字典键值匹配 - 校验逻辑失效:原判断逻辑是分别检查“输入的卡号是否存在于所有键中”“输入的PIN是否存在于所有值中”,完全没有校验二者的绑定对应关系。比如系统里有两张卡,卡1PIN是1234、卡2PIN是5678,用户输入卡1的卡号+卡2的PIN,也会被判定为成功。
修正后的实现方案
- 统一数据类型:将用户输入的内容转换为与存储一致的整数类型,消除类型差异带来的匹配失败
- 调整校验逻辑:先判断输入的卡号是否存在于字典键中,若存在则取出该卡号对应的存储PIN,直接与用户输入的PIN做相等比对,从根本上保证校验的是“同一张卡的卡号和对应PIN”
可运行的修正代码
import random card_numbers = {} # 补全原代码缺失的随机数字生成逻辑 def random_digits_gen(length): return int(''.join(str(random.randint(0, 9)) for _ in range(length))) def create_card(): first_half = 400000 second_half = random_digits_gen(10) card_num = int(str(first_half) + str(second_half)) pin_num = random_digits_gen(4) store_nums(card_num, pin_num) print('Your card has been created\n' 'Your card number:\n' f'{card_num}\n' 'Your card PIN:\n' f'{pin_num}') def store_nums(number, pin): card_numbers[number] = pin def check_nums(): # 将输入转换为与存储一致的整数类型 input_card = int(input('Enter your card number:\n')) input_pin = int(input('Enter your pin:\n')) # 直接基于键查对应值做匹配,不需要分开校验键和值的全局存在性 if input_card in card_numbers and card_numbers[input_card] == input_pin: print('Success!') else: print('nope') create_card() check_nums()
实现说明
- Python中字典的
in操作默认就是检查键的存在性,不需要额外书写card_numbers.keys() - 这类绑定关系的校验,绝对不能拆分检查键和值的全局存在性,必须通过键的取值做对应关系比对
- 如果后续需要处理输入非数字的异常场景,可以增加
try-except块捕获类型转换错误,避免程序直接崩溃
内容的提问来源于stack exchange,提问作者Isaac Peterson
相关产品推荐
相关产品推荐

