Python算法之旅字符串游戏之身份证号的秘密

    最近在力扣(LeetCode)网闲逛,发现很多题目的官方题解都是用Python语言来描述的,这说明大家已经逐渐认识到Python语言描述算法的优越性:它语法简明,内置函数丰富,表述直截了当,可以用最简明清晰的方式实现算法思想。

    现在的编程教育起点偏高,难度堪比奥数,令大量孩子望而却步,成了少数算法思维特别强的学生的“专利”。将来高中信息技术要学习Python语言,初中小学也要跟进,全面提升学生的计算思维。现有的编程教程要么内容太浅,只简单地介绍了Python语法知识,要么难度太大,目标直奔信息奥赛,不适合普通学生学习。

    笔者不才,愿意做一个架桥铺路的人,希望通过设置一些难度适当、生动有趣的案例,帮助孩子进一步掌握Python的基本数据结构,进一步理解顺序、选择和循环等算法结构,学会使用解析、枚举和模拟等算法思想来解决问题,提升算法思维和逻辑能力。

    经过一段时间的调研,我设计了一条从入门到提高的算法教学路径,并搜集了大量相关素材,整理好后将逐步在“Python算法之旅”微信公众号推送系列文章。

    为了使表述的方法更灵活,视角更多元,语言更生动,我打算使用人物对话的方式来展示解题思路和知识点,希望大家能够喜欢。


出场人物介绍:

小美:小学4年级学生,参加了学校的编程兴趣小组,已经了解了Python语言的基本语法,能够看懂一些简单的程序。她做事风风火火,对所有的事情都很好奇,喜欢打破砂锅问到底,是一个叫人又爱又恨的小丫头。

阿福:一个酷爱编程的8年级男生。大家都说他长得像国宝大熊猫,动作缓慢,憨态可掬。他做事情确实够慢的,连说话也慢条斯理,可是他一点也不担心,他常常说:“慢就是快,只要坚持下去,蜗牛也能爬上金字塔。”

古老师:虽然年近不惑,但依然对生活充满热情。“爱生活爱运动”是他的人生信条,和孩子们一起编程是他最大的乐趣。他神出鬼没,总是在孩子们最需要帮助的时候出现。当然,你也不能动不动就找古老师,因为他很忙,非常非常忙。所以,遇到问题还是自己先思考吧。


字符串游戏之身份证号的秘密

小美:最近听我们老师说网上有很多骗子利用人们泄露的身份信息进行诈骗活动,很多人都上当了呢。老师提醒我们不要随意把自己的身份证号告诉别人,以防被坏人利用。身份证号上面真的包含了很多关于我们的个人信息吗?

阿福:是的,每位具有中华人民共和国国籍的公民都有一个唯一的、不变的18位身份证号码。

小美:18位?那么多啊!

阿福:是的,必须要这么多,否则太短了不够用。这18个号码排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。例如我的身份证号是“330281200605302813”,那么“330281”代表我的出生地 “浙江省余姚市”,“20060530”代表我的出生日期是2006年5月30日,“281”是顺序码,最后一个数字“3”是校验码。

小美:地址码和出生日期码我能理解。什么是顺序码和校验码呢?

阿福:顺序码表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。校验码是根据前面十七位数字码计算出来的检验码,它是判断身份证号是否有效的一个依据。

小美:原来是这样啊!那就是说只要知道了我的身份证号,就可以知道我哪天生日了?

阿福:是的,不仅仅是知道你的生日,还有出生地和性别呢。小美,其实我们可以使用Python编写一个程序,根据输入的18位身份证号,输出该公民的出生日期和性别。

小美:这个简单,不就是使用字符串的切片方法访问子串吗,看我的。


问题:根据输入的18位身份证号,输出该公民的出生日期和性别。


代码:

id_num = input("请输入身份证号:")

birthday = id_num[6:10] + '-' +id_num[10:12] + '-' + id_num[12:14]

sex = '男' if int(id_num[14:17])% 2 == 1 else '女'

print(birthday, sex)


古老师:小美真棒!这段代码很漂亮啊!阿福,你能把这段代码的功能抽象成一个函数吗?

阿福:当然可以啦,我还可以写出和小美不一样的代码呢。


函数功能:根据输入的18位身份证号,返回该公民的出生日期和性别。

函数名:id_Inf(id_num:str) -> tuple

参数表:id_num -- 存储了18位身份证号码的字符串。

返回值:一个元组,包含了出生日期信息和性别。

示例1:输入id_num='330281200605302813',返回(2006-05-30, 男)

示例2:输入id_num='330281201010310641',返回(2010-10-31, 女)


代码:

def id_Inf(id_num: str) -> tuple:

   birthday = id_num[6:10] + '-' + id_num[10:12] + '-' + id_num[12:14]

   sex = '女男'

    r =int(id_num[16]) % 2

   return (birthday, sex[r])


小美:阿福,你不错啊!竟然使用sex字符串来代替了我的if语句,而且只提取了顺序码的最后一个数字来判断其奇偶性,确实比我强!不过我知道提取第17个字符还有另外一种写法,那就是id_num[-2]。

古老师:确实是这样,你们两个都很不错,都熟练地掌握了字符串切片和拼接的方法。但是我要指出的是,阿福在示例2中给出的身份证号“330281201010310641”是一个无效的身份证号。

小美、阿福:啊!无效的身份证号?老师你是怎么看出来的?

古老师:这个嘛。。。。。。不好意思我还有别的事情要忙,这个问题你们还是自己先思考一下吧。再会。


作者简介:巧若拙,微信昵称“斌哥”。高中信息技术教师,专心研究中小学编程和算法教学,在“Python算法之旅”微信公众号撰写原创文章近百篇,愿意和大家一起探讨中小学算法教育课题,请多多指教。

你可能感兴趣的:(Python算法之旅字符串游戏之身份证号的秘密)