本题要求实现函数输出n行数字金字塔。_函数与模块典型例题

说在前面

新课程标准出来以后,对教学设计也提出了新的要求。今年暑假宁波市教研室组织全体高中信息技术教师学习新课标新教材新教法,并要求每位学员上交作业:一份教学设计和三道典型题目。

以下是笔者完成的三道典型题目,在此与各位老师分享。由于新教材是块新大陆,我们都是在摸索前行,加之本人水平有限,在描述题目用语和控制题目难度方面都存在不足,敬请大家批评指正。

顺便说一句,其实这几道题目都是来自我参与主编的《信息技术基础能力训练》原稿,成书已经有了,但是出版社还没有组织宣传发行,请大家再耐心等几天。

3bf24d9d573e2ec9b353d62e1bc86a06.png

5c7202478e1ec9a33c04d321c2b0b260.png

《函数与模块》典型例题

余姚市第二中学 梁见斌

典型例题

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(③           ))

73472a4bb57275f168227e0b16759862.png

cf21cbcd48a91adc358077e7cb56c2aa.png

e40b56d24124bc9089a74566bb6729b3.png

答案与解析

  1. 答案: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算法,感兴趣就一起来!

a54f0c43a91d9364568172347ffd28ac.png

c66ca171ddb084f299c7498f7dd3d357.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,下面是实现函数的代码: def print_pyramid(n): for i in range(1, n+1): for j in range(1, n-i+1): print(" ", end="") for k in range(1, 2*i): if k == 1 or k == 2*i-1 or i == n: print(i, end="") else: print(" ", end="") print() 这个函数可以输出n空心的数字金字塔,其中n是一个整数。函数使用了两个嵌套的循环来控制输出数和每的内容。第一个循环控制数,第二个循环控制每的空格和数字。在第二个循环中,使用了一个条件语句来判断是否需要输出数字或空格。如果是第一、最后一或者当前位置是数字的边界位置,就输出数字,否则输出空格。最后,使用print()函数输出的内容。 ### 回答2: 要实现输出n空心的数字金字塔,我们需要先了解数字金字塔的结构和规律。数字金字塔如下所示: 1 2 2 3 3 3 4 4 4 4 可以看出,数字金字塔分为多,每数字的数量是逐递增的。在每中,数字之间要用空格隔开,而数字之前和之后的空格数量也是逐递减的。所以,我们要按照以下步骤来实现这个函数: 1. 首先定义一个可以接受一个参数n的函数,代表输出n空心的数字金字塔。 2. 在函数中,我们可以利用两层for循环,分别控制数和每数字的个数。在每次循环中,判断输出数字还是空格。若当前数字数相等或等于最后一数字,则输出这个数字;否则,输出空格; 3. 最后,需要在每数字输出完毕后加上一些换符,使得下一数字能够正确输出; 4. 这个函数的时间复杂度是O(n^2),因为有两层for循环嵌套,而空间复杂度是O(1),因为只需要几个变量存储当前状态。 下面是对应的Python代码实现: ``` def print_number_pyramid(n): for i in range(1, n + 1): for j in range(1, i + 1): if j == i or j == n or i == n: print(j, end="") else: print(" ", end="") print(" ", end="") print() ``` 注:由于字符之间需要一个空格来区分,而print默认会在字符之间加上空格,所以除了最后一个字符需要手动去掉,其他字符都不需要特殊操作。 ### 回答3: 实现这个函数的过程主要涉及到两部分,第一部分是构建空心数字金字塔,第二部分是输出n空心数字金字塔。 对于第一部分,我们可以采用以下思路:首先构建一个完整的数字金字塔,然后在输出时按照要求将一些数字替换成空格。具体的步骤如下: 1. 确定数字金字塔的层数n(假设n大于等于1),并构建一个n*n的矩阵matrix。 2. 在矩阵matrix中填入数字数字的范围从1到2*n-1,即第一层为1,第二层为2和3,以此类推。 3. 构建一个空字符串s,并设置其长度为2*n-1,即数字金字塔的最后一长度。 4. 从第n开始,将矩阵matrix中的数字按顺序取出,并将其替换为对应位置上的空格。具体地,对于每一,我们需要将与其数相等的超出一半的数字替换成空格,这样就能构建出一个空心的数字金字塔。 至此,我们已经完成了第一部分的实现。 对于第二部分,我们只需要按照要求输出n即可。具体地,每一输出的内容就是第一部分中构建的字符串s,但需要注意的是,每一的起始和末尾位置都需要进调整,以满足空心的要求。 因此,我们可以采用如下的代码实现这个函数(假设输入的n为5): def print_hollow_pyramid(n): matrix = [[0] * n for i in range(n)] s = "" for i in range(1, 2*n): s += str(i) for i in range(n): for j in range(i+1): matrix[i][j] = matrix[i][n-1-j] = i+j+1 print(s[:-(2*n-2*i-1)] + " ".join(str(matrix[i][j]) if j <= i/2 else " " for j in range(n-1)) + s[:-(2*n-2*i-1)]) 最终,我们就能够得到n空心的数字金字塔
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值