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

Python算法之旅

共 3256字,需浏览 7分钟

 ·

2021-08-18 12:45

说在前面

受《新时代领航技术同步用书》编委会的邀请,我也尝试着编制了一些题目,尽可能按照新课标的要求,力求能够激发学生思考和考查学生的计算思维。

上次已经和大家分享了2道公民身份证号码为背景的题目,试图从设计自定义函数的角度,帮助学生初步掌握模块化编程的方法。由于自定义函数是编程教学的重、难点,必须多加练习才能掌握,所以今天继续和大家分享2道相同类型的题目。

由于新教材是块新大陆,我们都是在摸索前行,加之本人水平有限,在描述题目用语和控制题目难度方面都存在不足,敬请大家批评指正。



8.(开放题)小美参加环保知识竞答比赛,回答结果存储在字符串中,其中回答正确用'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(           ))



解析:本题考查自定义函数、字符串处理和计数方法。
1)根据题意可知变量ks分别用来存储当前答题得分和总分数,它们的初始值均为0。因为连续答对k题,第k题加k分,最终返回总分,故第①空答案为s + k,第②空答案为0
         调用函数时,我们只需在函数名后面的圆括号里填写实参ans即可。
2)当ans='FFFTTTTTFF'时,s = 1+2+3+4+5 = 15,即函数返回值为15
答案:(1)① s + k   ans
215
3)根据连续连续答对k题,则第k题加k分的算法,我们可以使用公式s = k * (k +1) / 2来计算连续答对k题的总分。我们可以存储字符串的总长度,设置外层while循环条件为i < n,然后在内层循环中跳过字符'F',然后使用while循环记录连续出现子串'T'的数量,并根据公式计算得分,参考代码如下:
算法1:存储字符串的总长度,设置外层while循环条件为i < n
def get_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) / 2   return s


拓展思考:
10.(开放题)随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。Python提供了random模块来生成随机数,它的randint()randrange()choice()sample()等方法都可以生成一个或多个随机数。

例如下面的列表生成式就可以很方便的生成一个长度为10的随机数序列,其元素值为[1, 10]区间的随机整数:a = [random.randint(1,10) for i in range(10)]

可是,这样的一个随机数列表中的元素值常常会出现重复。现在我们需要提高难度,要求生成一个长度为n的列表,其元素值为[a, b]区间的不重复的随机整数。

请根据以下对自定义函数特征的描述,写出完整代码,实现函数功能。

提示:可充分使用random模块中各种生成随机数的方法,争取写出3-4种不同的算法。

'''
函数功能:生成n[a, b]区间的的随机整数,并存储到列表中
函数名:rand_int_1(n, a, b)
参数表:n--不重复随机整数的数量,即列表长度
     a, b--不重复的随机整数分布区间的左右边界值
返回值:返回存储了n个不重复随机整数的列表
'''


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

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

相关优秀文章:

阅读代码和写更好的代码

最有效的学习方式

函数与模块典型例题

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

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

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

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

浏览 53
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

举报