新教材习题解析之python自定义函数
说在前面
一些老师在教授自定义函数时,把重点放在了语法教学上,我认为这是不妥当的。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[12:14]
② int(id_num[16]) % 2 或 int(id_num[-2]) % 2
③ id_num
拓展思考:
7.(开放题)每位具有中华人民共和国国籍的公民都有一个唯一的, 不变的18位身份证号码。身份证号最后一位是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。计算方法:将前面的身份证号码17位数分别乘以不同的系数。
(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算法,感兴趣就一起来!
相关优秀文章: