速过计算机二级python——第八讲:基本编程

这篇博客主要介绍了计算机二级Python考试中的基本编程和简单应用题,包括列表操作、随机数生成、turtle库的使用、文件操作和字符频次统计。通过实例解析了如何解决输入输出、列表乘积累加、菱形绘制、人员信息统计等问题,并提供了解题思路和代码实现。
摘要由CSDN通过智能技术生成

在这里插入图片描述

基本编程题【15 分】

  1. 考生文件夹下存在一个文件 PY101.py,请写代码替换横线,不修改其他代码,实现以下功能:【5 分】

键盘输入正整数 n,按要求把 n 输出到屏幕,格式要求:宽度为 20 个字符,减号字符-填充,右对齐,带千位分隔符。如果输入正整数超过 20 位,则按照真实长度输出。
例如:键盘输入正整数 n 为 1234,屏幕输出:
------------1,234

n = eval(input("请输入正整数:"))
print("{_____}".format(n))

答案:

n = eval(input("请输入正整数:"))
print("{:->20,}".format(n))

解析:

: 是 0: 的简写,意味着我们要对 format()括号中的第 0+1 个参数 n 进行格式化。
- 的意思是以此符号填充空位。
> 的意思是变量 n 居右。
20 的意思是占位20。
, 的意思是有千位分隔符。

  1. 考生文件夹下存在一个文件 PY102.py,请写代码替换横线,不修改其他代码,实现以下功能:【5 分】

a 和 b 是两个列表变量,列表 a 为[3,6,9]已给定,键盘输入列表 b,计算 a 中元素与 b 中对应元素乘积的累加和。
例如:键盘输入列表 b 为[1,2,3],累加和为 13+26+3*9=42,因此,屏幕输出计算结果:
42

a = [3,6,9]
b = eval(input())
__________
for i in __________:
   s += a[i] * b[i]
print(s)

答案:

a = [3,6,9]
b = eval(input())
s = 0
for i in range(3):
    s += a[i] * b[i]
print(s)

解析:

本题考察的是列表、eval 和 input 函数、for 循环、变量,
语句 s+=a[i]+b[i]的全写为 s=s+a[i]+b[i],所以在执行它的时候,变量 s 是有值的,需要对其进行赋值 s=0。
由于列表长度为 3,因此 range(3)应该填写。

  1. 考生文件夹下存在一个文件 PY103.py,请写代码替换横线,不修改其他代码,实现以下功能:【5 分】

以 123 为随机数种子,随机生成 10 个在 1(含)到 999(含)之间的随机数,每个随机数后跟随一个逗号进行分隔,屏幕输出这 10 个随机数。

import random
__________
for i in range(__________):
   print(__________,end = ",")

答案:

import random
random.seed(123)
for i in range(10):
    print(random.randint(1, 999),end = ",")

解析:

本题考察内置 random 库,根据题目要求,先利用 random.seed(123)生成随机数种子,for 循环再次考察 range()函数,最后考察了 random.randint()函数。

简单应用题【25 分】

  1. 考生文件夹下存在一个文件 PY201.py,请写代码替换横线,不修改其他代码,实现以下功能:【10 分】

使用 turtle 库的 turt1e.right()函数和 turt1e.fd()函数绘制一个菱形,边长为 200像素,4 个内角度数为 2 个 60 度和 2 个 120 度,效果如图所示。
在这里插入图片描述

import turtle
turtle.right(-30)
__________
turtle.right(60)
turtle.fd(200)
__________
turtle.fd(200)
turtle.right(60)
turtle.fd(200)
turtle.right(120)

答案:

import turtle
turtle.right(-30)
turtle.fd(200)
turtle.right(60)
turtle.fd(200)
turtle.right(120)
turtle.fd(200)
turtle.right(60)
turtle.fd(200)
turtle.right(120)

解析:

本题考察 turtle 库中的两个函数 fd()和 right(),
显然菱形边长都是相等的,
fd()函数的意思是 forward 前进,括号内填 200;
right()函数的意思是右转,括号内度数填写 120 度,因为 turtle 的顺序是从坐标原点先右转-30 度,即斜向上走,再右转 60 度,斜向下走,所以下一个拐点处应为 120 度。

  1. 考生文件夹下存在一个文件 PY202.py,该文件是本题目的代码提示框架在该文件中编写代码,以实现如下功能:【15 分】

键盘输入一组人员的姓名、性别、年龄等信息,信息间采用空格分隔,每人一行,空行回车结束录入;示例格式如下:
张三 男 23
李四 女 21
王五 男 18
计算并输出这组人员的平均年龄(保留 2 位小数)和其中男性人数,格式如下:平均年龄是 20.67 男性人数是 2

data = input()
···
while data:
   ···
       data = input()
       ···
       print("平均年龄是{:.2f} 男性人数是{}".format(_________))

答案:

data = input()             #姓名    年龄    性别
sum_m = 0                  #统计总人数
sum_age = 0                #统计总年龄
sum_male = 0               #统计男性人数
while data:
    info = data.split(" ")       #通过sqlit函数将data转换为列表
    sum_m += 1
    sum_age += int(info[2])      #统计年龄和
    if info[1] == "男":          #这行和下一行是统计男性个数
        sum_male += 1
    data = input()               #进入下一行
ave_age = sum_age / sum_m        #计算平均年龄
print("平均年龄是{:.2f} 男性人数是{}".format(ave_age, sum_male))

解析:

这个题目的难度一下子上来了,要求填写四个地方,其中三个都是任意的,一个是横线上的。给我们的框架是一个输入函数 input(),一个while 循环,一个 format 格式化。所以我们需要将 input()函数获取的数据进行处理,包括前处理、中处理、后处理,这样一分,解套思路就很清晰了。
前处理:对循环中所用到的变量进行定义,根据题目要求,我们需要定义统计总人数、男性人数、总年龄的三个变量,进行置零。
中处理:while 循环对每行进行处理,题目给出的 data = input()已经实现了换行操作,我们只需要将每行中的操作进行代码处理,首先是将输入的一行信息进行存储,选取列表或者字典的方式皆可,我认为列表相对字典更加简单,因此选择将信息存储在列表中,使用的函数为 spilt(),括号内填写字符串” “,即以空格字符串进行信息的元素识别并存储。紧接着我们即可计数总人数、总年龄、总男性人数,总人数只需要 sum_m+1 即可,总年龄需要使用 int()函数将数据由字符串类型转换为整数型,同时加入变量 sum_age 中,总男性人数需要一个小的单分支流进行判断。循环进入下一行,直到循环结束。
后处理:得到了总年龄和总人数,对其进行除法操作,即可得出平均年龄。在函数 format 中,可以直观地看出第 1 个变量应为平均年龄,第 2 个变量应男性人数,分别填上 ave_age 和 sum_male 即可。

综合应用题【20 分】

考生文件夹下存在 3 个 Python 源文件,分别对应 3 个问题,1 个文本文件《命运》作为本题目输入数据,请按照源文件内部说明修改代码,实现以下功能:
《命运》是著名科幻作家倪匡的作品。这里给出《命运》的一个网络版文本文件,文件名为“命运.txt”。

问题一【5分】

题目:

在 PY301_1.py 文件中修改代码,对“命运.txt”文件进行字符频次统计,输出频次最高的中文字符(不包含标点符号)及其频次,字符与频次之间采用英文冒号“:”分隔,示例格式如下:
理:224
···
d = {}
···
ls = list(d.items())
ls.sort(key = lambda x: x[1], reverse = True)
print(“{}:{}”.format(__________))

思路:

这个题目的难度一般,涉及的知识有文件操作、for 循环、if 二分支流、continue 控制条件、经典字典统计方法,字典索引、format 字符串格式方法。给我们的提示框架是一个空字典 d,d 之前需要代码,d 之后需要代码,紧接着第 4 行将字典转换为列表,第 5 行让列表根据元素的第1+1=2 个值进行排序,最后是一个 format 格式化。所以我们将字典之前的代码称为前处理,字典之后、字典转列表之前称为中处理,排序和字符串部分称为后处理,这样一分,解套思路就很清晰了。

答案:

############################# 前 处 理 #####################################
fi = open("命运.txt", "r", encoding="utf-8")  # 使用open()函数打开txt,指定encoding
words = fi.read()                             # 使用read()方法读入txt内容

# 定义列表,存储需要排除的标点符号
# \u3000代表全角空格,在考试中没有这种问题存在。在题录中的命运.txt文本中存在全角空格
exclude_str = ["《", "》", "-", " ", "。", "?", "(", ")", ",", ":", "'", "、", "!", "\n", "\u3000"]

d = {}                                        # 定义一个空字典,用键值对分别存储字符及出现次数

############################### 中 处 理 #####################################
#统计字典经典方法!
for word in words:
    if word in exclude_str:                   # 除去符号
        continue                              # 打断本次循环
    else:
        d[word] = d.get(word, 0) + 1          # 以出现的字为键,它的值为出现次数,每出现1次加1
        #d.get('key', 'value')如果字典中存在关键字key,则返回关键字对应的值
        #如果字典d中不存在关键字key,则返回value的值
ls = list(d.items())                          # 化字典为列表,便于进行排序
ls.sort(key = lambda x: x[1], reverse = True) # 对列表按照字数进行排序,当reverse=True时:为反向排序

########################################后处理#########################################
print("{}:{}".format(ls[0][0],ls[0][1]))      # 键与值的获取,格式化字符串并输出

解析:

前处理:首先使用 open()函数以读入模式并指定 encoding=”utf-8”打开txt 文件,然后根据排序字符的题目要求,我们使用 read()方法读入文件内容,将整个文件的字符作为一个字符串赋值给 lines,最后是对标点符号的处理,首先用列表 exclude_str 将所有的标点符号存储起来。
中处理:for 循环对字符串变量 words 中的每个字符进行处理,使用二分支流的方式,如果字符是在 exclude_str 列表中存储的标点符号内,那么就打断本次循环,进入下一个循环;如果字符不在列表中,则会在字典 d 中更新:如果字典中存在字符,则返回关键字对应的值同时+1;如果字典 d 中不存在字符,则返回 0 同时+1——这也是 d[word] = d.get(word, 0) + 1 语句的含义。循环每个字符,只到循环结束。题目已经将我们的字段进行了列表转换并且按照出现次数进行反向排序(从大到小)。
后处理:在函数 format 中,根据题目要求,第 1 个变量应为字符,第 2 个变量应为字符出现次数,分别填上 ls 列表的第 0+1=1 个元素的第 0+1=1 个个值(字符)和第 0+1=1 个元素的第 1+1=2 个值(字符出现次数)。

问题二【5 分】

题目:

在 PY301_2.py 文件中修改代码,对“命运.txt”文件进行字符频次统计,按照频次由高到低,屏幕输出前 10 个频次最高的字符,不包含回车符,字符之间无间隔,连续输出,示例格式如下:
理斯卫…(后略,共 10 个字符)

思路:

题目提示框架如图 8.10,这个题目与问题(1)几乎一模一样,唯一的区别是后处理——排序和字符串部分称为后处理,所以解套思路同样清晰。只需要按照题目要求加一个循环输出前 10 个频次最高的字符即可,并且字符之间无间隔。

答案:

#######################前处理############################
fi = open("命运.txt", "r", encoding="utf-8")
words = fi.read()
exclude_str = ["《", "》", "-", " ", "。", "?", "(", ")", ",", ":", "'", "、", "!", "\n", "\u3000"]
d = {}

########################中处理############################
#统计字典经典方法!
for word in words:
    if word in exclude_str:
        continue
    else:
        d[word] = d.get(word, 0) + 1

ls = list(d.items())
ls.sort(key = lambda x: x[1], reverse = True)

#########################后处理############################
# 循环输出
for i in range(10):
    print(ls[i][0],end = '')       #将字符输出,且无间隙

解析:

前处理和中处理与问题(1)完全一样。
后处理:程序最后两行的 for 循环,能够实现输出 10 个频次最高的字符,
end=””能够实现字符之间无间隔。

问题二【10 分】

问题:

在 PY301_3.py 文件中修改代码,对“命运.txt”文件进行字符频次统计,将所有字符按照频次从高到低排序,字符包括中文、标点、英文等符号,但不包含空格和回车。将排序后的字符及频次输出到考生文件夹下,文件名为“命运-频次排序.txt”。字符与频次之间采用英文冒号“:”分隔,各字符之间采用英文逗号“,”分隔,参考 CSV 格式,最后无逗号,文件内部示例格式如下:
理:224,斯:120,卫:100

思路:

这个题目与问题(1)和(2)有四个区别,一是要写入文件,一是排除的标点符号有变化,一是要字符格式化,一是要中间间隔逗号。好消息是,除了排除标点符号属于前处理,其余三个区别都属于后处理。我们的解题仍然可以在问题(1)的基础上进行。

答案:

#######################前处理############################
fi = open("命运.txt", "r", encoding="utf-8")  #fi代表file in
words = fi.read()
exclude_str = [" ", "\n", "\u3000"]
d = {}

########################中处理############################
#统计字典经典方法!
for word in words:
    if word in exclude_str:           # 除去符号
        continue
    else:
        d[word] = d.get(word, 0) + 1  # 相同字符出现加1

ls = list(d.items())
ls.sort(key = lambda x: x[1], reverse = True)

#########################后处理############################
for i in range(len(ls)):
    ls[i] = "{}:{}".format(ls[i][0], ls[i][1])
fo = open("命运-频率统计.txt", "w")     # fo代表file out
fo.write(",".join(ls))   # 将列表ls之间的元素以逗号作为间隔写入

解析:

前处理:exclude_str 列表内的标点符号按题目要求输入。
中处理:与问题(1)完全一样。
后处理:第一步:程序的 for 循环中,我们将列表 ls 重新赋值,以 format函数格式化之后的字符串作为元素。每个元素为题目要求的<字符>:<出现次数>。
第二步:用 open 函数以写入模式新建 txt 文件。
第三步:用””.join()函数将列表 ls 之间的元素以逗号作为间隔写入文件。

小结

在第 8 讲中,我们学到了第一套 Python 二级考试的考试套路,并归纳了相应的解套思路。

  • 基本编程题:考察 format、for 循环、random 库,针对复习、拿到满分。
  • 简单应用题:考了 turtle 库和 while 循环,前者可经过训练,熟悉几个常考的 fd、left、right、seth 函数之后,能拿到满分,后者拿到大半分或者满分。
  • 综合应用题:我们总结归纳出了前处理、中处理、后处理的三步走的策略,学到了统计字数的经典方法,写入文件的一些字符串操作等。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值