新课程标准出来以后,对教学设计也提出了新的要求。今年暑假宁波市教研室组织全体高中信息技术教师学习新课标新教材新教法,并要求每位学员上交作业:一份教学设计和三道典型题目。
以下是笔者完成的三道典型题目,在此与各位老师分享。由于新教材是块新大陆,我们都是在摸索前行,加之本人水平有限,在描述题目用语和控制题目难度方面都存在不足,敬请大家批评指正。
顺便说一句,其实这几道题目都是来自我参与主编的《信息技术基础能力训练》原稿,成书已经有了,但是出版社还没有组织宣传发行,请大家再耐心等几天。
《函数与模块》典型例题
余姚市第二中学 梁见斌
典型例题
1. 编写如下代码:
def fun(a):
for i in range(3, 5):
a.append(i)
return a
x = [1, 2]
print(x, fun(x))
则程序执行后输出( )
A [1, 2][3, 4]
B [1, 2] [1, 2, 3, 4]
C [1, 2, 3, 4] [1, 2, 3, 4]
D [1, 2, 3, 4, 5] [1, 2, 3, 4, 5]
2. 提取身份证号码中的信息:每位具有中华人民共和国国籍的公民都有一个一个唯一的, 不变的18位身份证号码。
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
其中顺序码表示在同一地址码所标识的区域范围内,对同年, 同月, 同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。校验码是根据前面十七位数字码计算出来的检验码。
现在请你设计一个自定义函数,根据输入的身份证号,输出该公民的出生日期和性别。
以下代码能够实现上述功能,请将缺失的代码补充完整,并写出程序执行后输出的内容。
'''
函数功能:根据输入的身份证号,返回该公民的出生日期和性别
函数名:id_Inf(id_num)
参数表:id_num -- 存储了18位身份证号码的字符串。
返回值:一个元组,包含了出生日期信息和性别。
示例1:对于id_num='330281201010310640',返回(2010-10-31,女)
示例2:对于id_num='330281200605302813',返回(2006-05-30,男)
'''
defid_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)
3. (开放题)小美参加环保知识竞答比赛,回答结果存储在字符串中,其中回答正确用'T'表示,回答错误用'F'表示。回答错误不得分,连续答对k题,则第k题加k分。
下面的自定义函数能根据答案字符串计算小美的总分数。它的形式参数ans是一个只包含'F'和'T'两种字符的字符串,函数根据得分规则和答案字符串计算出的总分数。例如当ans='FTTTFTTFFT'时,函数返回10;当ans='TTTTFFTFTF'时,函数返回12。
请认真阅读代码,回答如下问题:
(1)将缺失的代码补充完整;
(2)当ans='FFFTTTTTFF'时,函数返回值是多少?
(3)请用自己的方式来实现自定义函数get_score(ans)。
def get_score(ans):
k, s = 0, 0
for c in ans:
if c == 'T':
k = k + 1
s = ①
else:
k = ②
return s
ans = 'FFFTTTTTFF'
print(get_score(③ ))
答案与解析
答案:C
解析:本题考查Python自函数基础知识。当传送的参数是不可更改对象时,在函数内部修改形参的值,对实参没有影响;当传送的参数是可更改对象时,在函数内部修改形参的值,实参也会发生相应变化。其中数字、字符串和元组是不可更改的对象,而列表、字典和集合则是可以更改的对象。本题中x是列表,属于可更改对象,故在函数体内为列表a插入新元素,实参x也会同步变化。
2. 答案:① id_num[12:14] ② int(id_num[16]) % 2 或 int(id_num[-2]) % 2 ③ id_num
解析:本题考查自定义函数、字符串切片和拼接、字符串转换成整数以及奇偶数判断方法。
根据题意可知字符串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 女。
3. 答案:(1)① s + k ② 0 ③ ans
(2)15
(3)根据连续连续答对k题,则第k题加k分的算法,我们可以使用公式s = k * (k +1) / 2来计算连续答对k题的总分。我们可以存储字符串的总长度,设置外层while循环条件为i < n,然后在内层循环中跳过字符'F',然后使用while循环记录连续出现子串'T'的数量,并根据公式计算得分,参考代码如下:
算法1:存储字符串的总长度,设置外层while循环条件为i < n
defget_score2(ans): s, i, n = 0, 0, len(ans) while i < n: while i < n and ans[i] == 'F': i += 1 p = i #记录当前'T'子串的起始位置 while i < n and ans[i] == 'T': i += 1 s += (i - p) * (i - p + 1) // 2 return s
为了进一步提高程序效率,我们可以为字符串增加一个结束符'.'(或除'FT'以外的其他字符)作为“哨兵”,这样在遍历字符串时,就可以将外层while循环条件写成ans[i] !='.'。有了“哨兵”以后,在内层循环中就无需判断下标是否越界,提高了程序效率。
算法2:为字符串增加一个结束符,可以进一步提高程序效率。
def get_score3(ans): ans += '.' #为字符串增加一个结束符 s, i = 0, 0 while ans[i] != '.': while ans[i] == 'F':#跳过'F'子串 i += 1 p = i #记录当前'T'子串的起始位置 while ans[i] == 'T': i += 1 s += (i - p) * (i - p + 1) / 2return s
解析:本题考查自定义函数、字符串处理和计数方法。
(1)根据题意可知变量k和s分别用来存储当前答题得分和总分数,它们的初始值均为0。因为连续答对k题,第k题加k分,最终返回总分,故第①空答案为s + k,第②空答案为0。
调用函数时,我们只需在函数名后面的圆括号里填写实参ans即可。
(2)当ans='FFFTTTTTFF'时,s = 1+2+3+4+5 = 15,即函数返回值为15。
写在后面本公众号的原创文章都是本人平时工作和学习的一些心得体会文章,虽然经过长期认真地思考方才下笔,但由于笔者水平有限,难免出现一些错漏,敬请批评指正。
无论是赞同还是反对我的看法,都请你给我留言。如果你有新的想法,千万不要憋在心里,请发出来大家一起讨论。让我们相互学习,共同进步!
需要本文word版的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,“Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。
我们专注Python算法,感兴趣就一起来!