用python怎么输出个人信息,python个人信息输出程序

文章介绍了如何使用Python编程语言验证中国18位身份证号码的有效性,包括校验规则、出生日期检查和性别确定,并提供了相关代码示例。
摘要由CSDN通过智能技术生成

这篇文章主要介绍了python输入姓名打印学生信息,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。

Source code download: 本文相关源码

原题目:

校验身份证号码并输出个人信息

描述‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

中国目前采用的是18位身份证号,其第7-10位数字是出生年,11-12位是出生月份,13-14是出生日期,第17位是性别,奇数为男性,偶数为女性,第18位是校验位。
如果身份证号码的其中一位填错了(包括最后一个校验位),则校验算法可以检测出来python编写一个皮卡丘。如果身份证号的相邻2位填反了,则校验算法可以检测出来。校验规则如下:
1. 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
2. 将这17位数字和系数相乘的结果相加。
3. 用加出来和除以11,看余数只可能是:0-1-2-3-4-5-6-7-8-9-10
分别对应的最后一位身份证的号码为:1-0-X-9-8-7-6-5-4-3-2
4. 通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的X(大写英文字母X)。如果余数是10,身份证的最后一位号码就是2。

用户输入一个身份证号,校验其是否是合法的身份证号码:
1. 输入长度是否合法
2. 输入数据校验位是否合法
3. 输入数据中年月日范围是否合法,考虑闰年。
如身份证号码不合法输出 '身份证校验错误',
如身份证号码合法则分别在3行中输出'身份证号码校验为合法号码!'以及该人的出生年月日和性别。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输入格式

一个18位身份证号,末位为数字或大写字母X‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输出格式

如身份证号码不合法输出 '身份证校验错误',
如身份证号码合法则分别在3行中输出'身份证号码校验为合法号码!'以及该人的出生年月日和性别。(月份和日期均为2位数表示)


 我写的解答:

# 校验身份证中的出生日期
def check_ymd(str_ymd):
    try:
        year = int(str_ymd[:-4])
        month = int(str_ymd[-4:-2])
        day = int(str_ymd[-2:])
        days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):    # 出生年为闰年则该年二月有29天
            days[2] = 29
        else:
            pass
        if month > 12 or month < 1:                  # 出生月份大于12月或小于1月则为非法
            return False
        elif day > days[month - 1] or day < 1:      # 出生日期大于出生月份中所含天数或小于1好则为非法
            return False
        else:
            return [year, month, day]
    except:
        return False


# 校验身份证中的校验码
def check(id_num):
    try:
        id_slice = [eval(i) for i in id_num[:-1]]       # 截取身份证前17位
        id_18th = id_num[-1].upper()                    # 截取身份证最后1位
        weight_values = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
        last_nums = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
        for i in range(17):
            id_slice[i] *= weight_values[i]             # 对前17位加权处理
        if last_nums[sum(id_slice) % 11] == id_18th:
            if int(id_num[-2]) % 2 == 1:
                return '男'
            else:
                return '女'
        else:
            return False
    except:
        return False


IdNum = input()
if len(IdNum) == 18:
    Birthday = check_ymd(IdNum[6:14])       # 检验身份证中出生年月日片段
    Gender = check(IdNum)                   # 检验身份证校验码
    if Birthday and Gender:
        print("身份证号码校验为合法号码")
        print("出生:{0:}年{1:0>2}月{2:0>2}日".format(Birthday[0], Birthday[1], Birthday[2]))
        print('性别:{}'.format(Gender))
    else:
        print("身份证校验错误")
else:
    print("身份证校验错误")

网站给出的解答:

def leap(year):
    return True if (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0) else False


# 校验身证号中的年月日及校验码
def IDcheck(id):
    # 年份超过当前年,或月份小于1或大于12,或日期小于1或大于31时非法
    if int(id[6:10]) > datetime.datetime.now().year or int(id[10:12]) < 1 or int(id[10:12]) > 12 or int(
            id[12:14]) < 1 or int(id[12:14]) > 31:
        return False
    # 当月份为4,6,9,11时,日期超过30即非法
    if int(id[10:12]) in [4, 6, 9, 11] and int(id[12:14]) > 30:
        return False
    # 月份为2时,日期大于29便非法
    if int(id[10:12]) == 2 and int(id[12:14]) > 29:
        return False
    # 月份为2时,如果不是闰年,日期大于28便非法
    if int(id[10:12]) == 2 and leap(year) == False and int(id[12:14]) > 28:
        print(year)
        return False
    # 计算校验和
    ls = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]
    IDsum = sum([ls[i] * int(id[i]) for i in range(17)])
    if id[17] == 'X':
        return True if IDsum % 11 == 2 else False
    elif (IDsum % 11 + int(id[17])) % 11 == 1:
        return True
    else:
        return False


import datetime  # 导入datetime模块用于获取当年年份

id = input()
year = int(id[6:10])
month = id[10:12]
day = id[12:14]
if len(id) == 18 and IDcheck(id):  # 先判断长度是否是18位,再判断校验和
    gender = '女' if int(id[16]) % 2 == 0 else '男'
    print('身份证号码校验为合法号码')
    print('出生:{}年{}月{}日'.format(year, month, day))
    # print('年龄:{}'.format(datetime.datetime.now().year - year))
    print('性别:{}'.format(gender))
else:
    print('身份证校验错误')

由于Python123网站的大部分测试用例中输入输出隐藏,除去没有将出生年份同当年年份比较,我不知道自己的代码哪里错了。

该题对应的九个测试用例中只有第八个显示结果错误,而这个测试用例的输入输出均隐藏,我只知道这个用例与没有将出生年份同当年年份比较这个错误无关(因为当我将代码改为对于任何输入均打印“身份证校验错误”,第八个测试用例仍显示结果错误)

请各位大神帮我找一下错误,不胜感激。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值