新教材习题解析之python自定义函数

Python算法之旅

共 3424字,需浏览 7分钟

 ·

2021-06-27 02:49

说在前面

一些老师在教授自定义函数时,把重点放在了语法教学上,我认为这是不妥当的。Python的自定义函数语法相当复杂,其形式参数就有必需参数、关键字参数、默认参数、不定长参数等多种类型,更别说各种实参的变异写法和复杂的闭包语法了。这些复杂的语法不是光靠死记硬背就能掌握的,需要多次实践的积累才能逐步理解。

我认为自定义函数的教学重点应该是让学生理解模块化编程的作用、初步掌握模块化编程的方法、能够根据需要设计自定义函数(包括明确函数功能、设置参数和返回值、并给出样例演示等)。其中设计自定义函数是重中之重,需要反复练习和比较,力求达到意义明确、格式规范、表述简明的目标。

从考查的角度来说,最理想的状态是可以给出自定义函数的说明,让学生根据说明自行编写完整代码,实现函数功能(这是机试的方法);由于是笔试,为了阅卷的方便,通常采用改错或者填空的方法——也许今后会参考数学或物理大题目的做法,让学生给出较为完整的代码,根据知识点或结果给分——但这确实给阅卷带来很大的困难。

今天给大家分享的是2道以公民身份证号码为背景的题目。由于新教材是块新大陆,我们都是在摸索前行,加之本人水平有限,在描述题目用语和控制题目难度方面都存在不足,敬请大家批评指正。



例5.(开放题)每位具有中华人民共和国国籍的公民都有一个唯一的, 不变的18位身份证号码。公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

其中顺序码表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。校验码是根据前面十七位数字码计算出来的检验码。
现在请你设计一个自定义函数,根据输入的身份证号,输出该公民的出生日期和性别。
以下代码能够实现上述功能,请将缺失的代码补充完整,并写出程序执行后输出的内容。

'''

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

函数名:id_Inf(id_num)

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

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

示例1:对于id_num='330281201010310640',返回(2010-10-31,女)

示例2:对于id_num='330281200605302813',返回(2006-05-30,男)

'''

def id_Inf(id_num):

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

    sex = '女男'

    r = ②        

    return (birthday, sex[r])

 

id_num = '330281202002020648'

birthday, sex = id_Inf(③       )

print(birthday, sex)



解析:本题考查自定义函数、字符串切片和拼接、字符串转换成整数以及奇偶数判断方法。

根据题意可知字符串id_num中存储了18位身份证号,其中id_num[6:14]存储了出生日期码,故第①空答案为id_num[12:14]。
三位顺序码的奇数分配给男性,偶数分配给女性,故只需判断第17个数字的奇偶性即可。我们先提取第17个数字字符,使用int函数将其转换为整数,再对2求余数确定其奇偶性。注意第17个字符同时也是倒数第2个字符,所以第②空答案为int(id_num[16]) % 2 或 int(id_num[-2]) % 2。
调用函数时,我们只需在函数名后面的圆括号里填写实参id_num即可。函数返回一个包含了出生日期信息和性别的元组,我们可以使用两个变量birthday和 sex来接收返回值。
因为id_num='330281202002020648',故程序执行后输出:2020-02-02 女。

答案:

① id_num[12:14]  

② int(id_num[16]) % 2 或 int(id_num[-2]) % 2  

③ id_num


拓展思考:

7.(开放题)每位具有中华人民共和国国籍的公民都有一个唯一的, 不变的18位身份证号码。身份证号最后一位是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。计算方法:将前面的身份证号码17位数分别乘以不同的系数。

从第一位到第十七位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。
将这17位数字和系数相乘的结果相加;用加出来的和除以11,看余数是多少,余数只可能有0、1、2、3、4、5、6、7、8、9、10这11个数字,其分别对应的身份证最后一位号码为1、0、X、9、8、7、6、5、4、3、2。
例如,如果余数是3,身份证的第18位数字就是9;如果余数是2,身份证的最后一位号码就是罗马数字X。
现在请你设计一个自定义函数,根据输入的18位身份证号码,判断该身份证是否为有效身份证。
以下代码能够实现上述功能,请认真阅读代码,回答如下问题:

(1)将缺失的代码补充完整;

(2)当id_num='330281201010310640'时,函数返回值是什么?

(3)能否使用求和函数sum(),结合列表生成式,用一行代码代替原来的for循环,快速求出17位数字和系数相乘的结果s?

'''

函数功能:根据输入的18位身份证号码,判断该身份证是否为有效身份证。

函数名:check_id_num(id_num)

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

返回值:如果是有效身份证号返回True,否则返回False。

示例1:对于id_num='330281200605302813',返回True

示例2:对于id_num='330281201010310641',返回False

'''

def check_id_num(id_num):

    factor = (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2) #校验码系数

    remainder = '10X98765432' #余数表

    s = 0 #用来存储17位数字和系数相乘的结果

    for i in range(len(factor)):

        s = ①      

    r = ②       

    return remainder[r] == id_num[-1]

需要本文word版和拓展思考答案的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。

我们专注Python算法,感兴趣就一起来!

相关优秀文章:

阅读代码和写更好的代码

最有效的学习方式

函数与模块典型例题

字符串专题之中文大写金额数字转换工具

新教材习题解析之python循环结构

新教材习题解析之python循环结构(2)

浏览 88
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报