题目描述与分析
题目描述:
每门课的成绩分为A、B、C、D、F五个等级,为了计算平均绩点,规定A、B、C、D、F分别代表4分、3分、2分、1分、0分。
输入描述:
有多组测试样例。每组输入数据占一行,由一个或多个大写字母组成,字母之间由空格分隔。
输出描述:
每组输出结果占一行。如果输入的大写字母都在集合{A,B,C,D,F}中,则输出对应的平均绩点,结果保留两位小数。否则,输出“Unknown”。
一、字符串的使用
在Python中,字符串既可以使用单引号’',也可以使用双引号""来创建,并且Python中没有字符类型,即便只有一个字符,也是作为一个字符串来使用。
str1 = "hello,world"
str2 = "a"
可以使用 + 操作符来拼接字符串:
s = "Hello" + " " + "World"
print(s) # 输出 'Hello World'
可以通过索引获取字符串中的字符,或者进行切片操作来获取子字符串:
s = "Hello World"
print(s[0]) # 输出 'H'
print(s[-1]) # 输出 'd'
print(s[0:5]) # 输出 'Hello'
字符串遍历也是使用for循环
str1 = "Hello"
# 使用 for 循环遍历字符串中的字符
for char in str1:
print(char, end = " ")
# 输出结果:H e l l o
切片操作和列表切片操作类似。
str1 = "Hello,World!"
# 使用切片操作获取子字符串
sub_string = str1[0:5] # 获取从索引0到索引4的子字符串,不包括索引5的字符
print(sub_string) # 输出结果:Hello
# 省略起始和结束索引来获取整个字符串
full_string = str1[:]
print(full_string) # 输出结果:Hello,World!
# 使用步长来获取间隔字符
step_string = str1[0::2] # 从索引0开始,每隔2个字符获取一个字符
此外,字符串也提供了一系列对字符串的操作方法,常见的有以下几种:
使用len()获取字符串的长度。
my_string = "Hello,World!"
length = len(my_string) # 返回 12
split(): 将字符串分割成子字符串并返回一个列表,默认情况下,使用空格作为分隔符。
join(): 将列表中的字符串连接成一个新的字符串,你可以指定连接符号,比如下面的示例。
persons = ["tom", "jerry", "mike"]
text = " ".join(persons)
# 将列表中的字符串以空格连接在一起,相当于split的反向操作,"tom jerry mike"
replace(): 用于替换字符串中的指定子字符串。
str1 = "Hello, World!"
str2 = str1.replace("World", "Python") # 替换 "World" 为 "Python"
二、代码编写
根据题目要求,有多组测试用例,每组输入数据占一行,也就是说要接收一行数据作为一个字符串,这需要使用input()来完成
while True:
try:
# 获取一行字符串作为输入
s = input()
except:
break
想要计算平均绩点,我们需要计算一行数据的分数总和,再除以数据的个数,所以需要定义变量sum_grade表示分数总和,count表示数据的个数
sum_grade = 0 # 分数总和
count = 0 # 分数的个数
接着遍历字符串
for char in s:
# 遍历字符串
如果是A则转换成4分,B转换成3分,C转换成2分,D转换成1分,F转换成0分,如果输入的内容不在{A, B, C, D, F}中,则输出Unknown, 对用不同的情况需要使用不同的代码进行处理,可以借助if-else进行解决。
for char in s:
if char == 'A': # 如果输入的字符是A, 总分增加4,数据量 + 1
sum_grade += 4
count += 1
elif char == 'B': # 如果输入的字符串是B, 总分增加3, 数据量 + 1
sum_grade += 3
count += 1
elif char == 'C': # 如果输入的字符串是B, 总分增加3, 数据量 + 1
sum_grade += 2
count += 1
elif char == 'D': # 如果输入的字符串是D, 总分增加1, 数据量 + 1
sum_grade += 1
count += 1
elif char == 'F': # 如果输入的字符串是D, 总分增加1, 数据量 + 1
count += 1
elif char == ' ': # 如果输入的字符串是空格,则不对当前的字符串做任何处理,继续遍历下一个字符
continue
else: # 如果输入的字符串不在{A, B, C, D, F}中,则输出"Unknown", 并跳出执行这一行字符串
print("Unknown")
break
最后我们需要按照题目的输出格式输出,题目要求我们输出对应的平均绩点,结果保留两位小数,也就是说sum_grade / count的结果是浮点数,并且需要格式化为两位小数。
想要在Python中输出保留两位小数的数字,可以使用format()方法, format()方法通常用于字符串中的占位符替换,占位符通常用花括号 {} 表示。你可以将占位符插入到字符串中,然后使用 format() 方法来将实际值插入这些占位符。
number = 3.1415926
# {}是一个占位符,输出结果时会将format()参数里的内容替换在{}中,:.2f 表示保留两位小数
formatted_number = "{:.2f}".format(number)
print(formatted_number)
所以只需要在for循环之后加上下面的代码
for char in s:
# {A, B, C, D, F}的条件判断
# 循环结束后对 sum / count的结果进行格式化输出
print("{:.2f}".format(sum_grade / count))
这里还有个问题,当循环遇到{A, B, C, D, F}以及空格之外的字符时,会输出"Unknown", 然后退出for循环的执行,但是仍然会执行循环之后的语句,即print语句,实际上,这行代码不应该被执行,应该怎样做才能避免这行代码的执行呢?
我们知道if(条件)可以控制语句的执行,当条件为真的时候,if结构体中的代码可以执行,条件为假的时候则不用执行,所以我们可以联想到下面的形式:
if condition:
print("{:.2f}".format(sum_grade / count))
也就是说,我们可以采用这样一种思路,事先给每一行字符串一个“真的令牌”,字符串遍历处理过程中,如果有哪一行字符串中有{A, B, C, D, F}以及空格之外的字符,则把“真令牌”替换成“假令牌”,这样当走出循环之后再进行输出处理时,就会因为不认识这个“假令牌”而不进行输出。
比如下面的示例:
# 初始化一个 "真令牌"
flag = True
# 在某种情况下真令牌被替换成假令牌
flag = False
# 无法执行下面的逻辑
if flag:
# 在flag为True时执行的代码
不过我们经常使用0/1来代替布尔值。
flag = 1
# 在某种情况下 1 被修改为0
# flag为0,表示false, 无法执行下面的逻辑
if flag:
完整的代码如下:
while True:
try:
s = input()
sum_grade = 0.0
count = 0
flag = 1
for char in s:
if char == 'A':
sum_grade += 4
count += 1
elif char == 'B':
sum_grade += 3
count += 1
elif char == 'C':
sum_grade += 2
count += 1
elif char == 'D':
sum_grade += 1
count += 1
elif char == 'F':
count += 1
elif char == ' ':
continue
else:
flag = 0
print("Unknown")
break
if flag:
print("{:.2f}".format(sum_grade / count))
except:
break
三、字符串格式化输出
Python提供了多种字符串格式化的方式,其中包括百分比格式化、str.format() 方法和f-字符串(在Python 3.6及以上版本)。
使用%操作符进行格式化
name = "张三"
age = 20
formatted_string = "姓名:%s, 年龄:%d " % (name, age)
print(formatted_string)
使用%会将后面的变量name, age一一对应插入到对应的占位符上,其中%s表示字符串,%d表示整数, %f表示浮点数。
字符串format()方法
format()方法允许使用占位符{}来插入值,并使用format()方法的参数来提供要插入的值,和上面的操作符很类似。
name = "张三"
age = 20
formatted_string = "姓名:{}, 年龄:{}".format(name, age)
print(formatted_string)
f-字符串
Python3.6及以上的版本支持f-string, 以f开头,后面跟着字符串,字符串中的表达式用大括号 {} 包起来,它会将变量或表达式计算后的值替换进去。
name = "张三"
age = 20
formatted_string = f"姓名: {name},年龄:{age}"
print(formatted_string)