继续记录Python的基础语法练习题五道。
第六题,打印所有的水仙花数:
#编写一个程序,该程序用于找出并打印所有水仙花数
#水仙花数:一个三位数,其各个位的数的立方和等于该数本身
for num in range(100,1000): #获取百位数字
i = num // 100
#获取十位数字
j = num // 10 % 10
#获取个位数字
k = num % 10
sum_of_cubes = i ** 3 + j ** 3 + k ** 3
#判断立方和是否等于该数本身
if sum_of_cubes == num:
print('水仙花数:',num)
这个题目其实并不困难,但正如我前文所说,我在目前阶段并不完全擅长正向拆解,因此把这个题目的逻辑复述一遍,以求自己更加地融会贯通。
题目要求打印所有的水仙花数并告知了我们什么是水仙花数(个位的立方 + 十位的立方 + 百位的立方 = 这个数本身,如153 = 1³ + 5³ + 3³),那么我们接下来的编程逻辑如下:
1.先遍历循环得到所有的三位数(for语句实现)
2.再获取三位数各个位数的数字
3.判断各个位数的数字的立方和是否等于这个数本身
最后实现需求,这就是我们在面对题目时应该有的正向拆解逻辑,通俗而言,写代码其实蛮考验中文能力的,你要知道怎么样把这个要求拆解成多个小要求,并使用代码把它们从中文翻译成编程语言。
第七题,猴子吃桃:
#猴子第一天摘了若干个桃子,当即吃了一半,还多吃了一个,如此循环到第十天再吃时桃子是剩下了一个,问第一天摘了多少个桃子?
#第十天剩下的桃子
peach = 1
#遍历循环逆推
for day in range(9,0,-1):
peach = (peach + 1) * 2
#打印结果
print(f'第一天共摘了{peach}个桃子')
这题的逻辑在于逆向推理,(第十天的桃子 + 1) * 2 = 第九天的桃子,接下来每一天都是如此循环往复,这如果是单纯的数学问题其实非常简单,就算抓不住要点,慢慢演算也可以得出结果,然而难点就在于如何用编程语言实现这一要求?
这里的代码使用的是for语句,利用其循环的特点,最终求出了第一天桃子的数量并进行打印输出。
看起来似乎真的很简单,但我在自己敲代码的时候,真的感觉每一步都在卡我。虽然这个代码总共没有几行,但是我就是没办法很顺利地把它敲出来,所以我要告诫自己,千万不能掉以轻心,一定要认真对待基础的内容,否则一栋没有地基的房子,是不可能成为高楼大厦的。
第八题,统计字符类型个数:
#输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
#输入一行字符
a = input('请输入一个字符串:') b = 0 c = 0 d = 0 e = 0 #遍历循环取出字符
for i in a:
#判断字符是否是英文
if i.isalpha():
b = b + 1
#判断字符是否是空格
elif i.isspace():
c = c + 1
#判断字符是否是数字
elif i.isdigit():
d = d + 1
else:
e = e + 1
print(f'英文字符数量是{b}') print(f'空格字符数量是{c}') print(f'数字字符数量是{d}') print(f'其他字符数量是{e}')
可以看到,在前面这几道练习题中,for语句对于问题的解决起到了很大的帮助,属于是中流砥柱了,在这个练习题中我还学习到了新的语句:例如isalpha这样的语句。巩固基础的同时还能学习到新的知识,说明我前面的学习并不全面,不过能学到新知识还是值得开心的。
第九题,对简单列表元素排序:
#给定一个简单列表,对其元素进行排序
#注意这里声明的简单列表指的是元素类型不是复合元素类型(如列表/元组/字典)
#正序
list1 = [10,30,20,50,40]
list1.sort()
print(list1)
#倒序
list2 = [100,310,200,250,90]
list2.sort(reverse = True)
print(list2)
#对列表排序(但不改变原列表顺序)
#语句:sorted(iterable,key = None,reverse = False)
#iterable:想要排序的可迭代对象
#key(可选传参)
#reverse(可选传参,选择布尔值True或者False)
list3 = sorted(list2)
print('原列表:',list2)
print('排序后的列表:',list3)
解决这个要求有三种方法,这一题算是这几道练习题中我比较擅长的了,因此不过多赘述,复习了一下列表的知识:sorted语句可以对列表排序但不改变原列表顺序,这是我疏忽的点。
第十题,学生成绩排序:
# 给定一个学生信息列表,根据学生的成绩进行排序
students = [
{'snum': 101, 'sname': '张三', 'sgrade': 88},
{'snum': 102, 'sname': '李四', 'sgrade': 79},
{'snum': 103, 'sname': '王五', 'sgrade': 91},
{'snum': 104, 'sname': '林芳', 'sgrade': 66},
]
根据学生成绩排序(使用匿名函数让字典也可以进行大小的比较从而排序)
reverse=True 表示降序(从高到低)
students_sort = sorted(students, key=lambda x: x['sgrade'], reverse=True)
一行输出一个学生
print('学号\\t姓名\\t成绩')
print('-' * 25)
for s in students_sort:
print(f"{s['snum']}\\t{s['sname']}\\t{s['sgrade']}")
这个要求的完成中,复习了匿名函数的使用,这个平时的使用率并不是很高,很容易忘记,现在在练习题中用到,还是非常不错的,下面的内容是我和DeepSeek交流后它的优化输出,让成绩排序的可视化程度更加明显。



