Python程序检查信用卡号码是否有效
随着信用卡的广泛使用,保障信用卡交易安全成为了一个重要的问题。本文将介绍使用Python编写代码来检查信用卡号码的有效性。
信用卡号码规则
首先,需要了解信用卡号码的规则。信用卡号码通常由16位数字组成,其中前6位为银行识别号码(Bank Identification Number,简称BIN),由银行颁发;第7位到第15位是个人账户号码;最后一位是校验码。
校验码的计算方法如下:
- 从信用卡号码倒数第二位开始,偶数位数字乘以2,若乘积大于等于10,则将两位数字相加,否则直接取乘积结果;
- 将所有奇数位数字与第1步得到的偶数位数字之和相加;
- 若第2步结果个位数为0,则校验码为0,否则校验码为10减去个位数。
例如,信用卡号码为5390 1234 6789 9865
,那么校验码计算过程如下:
5
3
0
1
2
3
4
6
7
8
9
8
6
5
。
偶数位数字乘以2之后为6 0 2 2 6 16 18
,其中6
、0
、2
、2
和18
是小于10的数字,直接保留;而6
和16
是大于等于10的数字,需要将十位数和个位数相加,得到12
和7
。- 将所有奇数位数字和上述结果相加,结果为
5+9+3+0+1+2+3+4+7+7+8+6+5=60
。 - 60的个位数是0,因此校验码为0。
Python实现
有了校验码的计算方法,我们就可以在Python中实现。下面是代码示例:
def luhn_checksum(card_number):
"""
计算信用卡号码的校验码
:param card_number: str, 信用卡号码,不包含空格
:return: int, 校验码
"""
digits = [int(x) for x in card_number]
odd_digits_sum = sum(digits[-1::-2])
even_digits = digits[-2::-2]
even_digits_sum = sum([(x * 2 - 9) if x >= 5 else (x * 2) for x in even_digits])
total_sum = odd_digits_sum + even_digits_sum
return (10 - total_sum % 10) % 10
代码中定义了一个luhn_checksum
函数,用于计算信用卡号码的校验码。该函数接收一个字符串形式的信用卡号码,不包含空格。函数返回一个整数,为计算出的校验码。
接下来,我们需要实现一个函数来判断信用卡号码是否有效。具体来说,就是判断信用卡号码的长度是否为16位,且计算出的校验码是否与最后一位数字相等。
代码示例如下:
def is_valid_card(card_number):
"""
判断信用卡号码是否有效
:param card_number: str, 信用卡号码,包含空格
:return: bool, True表示有效,False表示无效
"""
card_number_without_space = card_number.replace(" ", "")
if len(card_number_without_space) != 16:
return False
computed_checksum = luhn_checksum(card_number_without_space)
actual_checksum = int(card_number_without_space[-1])
return computed_checksum ==actual_checksum
代码中定义了一个is_valid_card
函数,用于判断信用卡号码是否有效。该函数接收一个字符串形式的信用卡号码,包含空格。函数返回一个布尔值,True表示信用卡号码有效,False表示无效。
将上述两个函数组合在一起,可以方便地检查一个信用卡号码的有效性。代码示例如下:
def check_card_validity(card_number):
"""
检查信用卡号码的有效性
:param card_number: str, 信用卡号码,包含空格
:return: bool, True表示有效,False表示无效
"""
return is_valid_card(card_number) and luhn_checksum(card_number.replace(" ", "")) == int(card_number[-1])
函数check_card_validity
接收一个字符串形式的信用卡号码,包含空格。该函数先调用is_valid_card
函数判断信用卡号码长度是否为16位,再调用luhn_checksum
函数计算校验码,检查计算出的校验码是否与最后一位数字相等,最终返回一个布尔值表示信用卡号码的有效性。
示例
下面是几个示例,演示如何使用Python代码检查信用卡号码的有效性:
# 正确的信用卡号码
card_number = "5390 1234 6789 9860"
print(check_card_validity(card_number)) # True
# 错误的信用卡号码,长度不足16位
card_number = "5390 1234 678"
print(check_card_validity(card_number)) # False
# 错误的信用卡号码,校验码不正确
card_number = "5390 1234 6789 9861"
print(check_card_validity(card_number)) # False
结论
本文介绍了使用Python编写代码检查信用卡号码有效性的方法。通过校验码的计算方法,可以方便地判断一个信用卡号码是否有效。我们可以通过上述示例代码的方式,轻松对信用卡号码进行有效性检查,保障信用卡交易的安全。