Day.08
2020.02.26
今天首先是继续昨天的常用数据结构的练习,然后如果有时间就进行面向对象的初步学习。
1.常用数据类型练习
#练习题3(接昨天):设计一个函数返回给定文件名的后缀名
#具体实现方法:
def houzhuiming(name):
start = name.rfind('.')
new_name = name[start:]
print('后缀名为:' + new_name)
if __name__ == '__main__':
while 1:
str0 = str(input('请输入一个文件名:'))
houzhuiming(str0)
#测试结果:
#请输入一个文件名:test.py
#后缀名为:.py
#请输入一个文件名:filename.cpp
#后缀名为:.cpp
#请输入一个文件名:
#Process finished with exit code -1
小结:昨天一下子没想到思路,睡觉前偷偷看了一眼参考答案然后今天起床写的。其实不用想得太复杂(我一开始以为要自动寻找文件,然后再获取其文件名,进而获得它的后缀名),就是字符串切割的运用,用rfind()方法找到最后一个出现点.的位置,然后通过方括号[]切割字符串就行了。
#练习题4(接昨天):设计一个函数返回传入的列表中最大和第二大的元素的值
#具体实现方法:
def max_and_2max(lis):
copy = []
for x in range(len(lis)):
copy += lis[x]
max1 = max(copy)
print('列表中的最大值为:' + max1)
while 1:
if copy.count(max1) == 1:
copy.remove(max1)
max2 = max(copy)
print('列表中的第二大值为:' + max2)
break
else:
copy.remove(max1)
if __name__ == '__main__':
while 1:
list1 = list(input('请输入一个列表:'))
max_and_2max(list1)
#测试结果:请输入一个列表:1234567899
#列表中的最大值为:9
#列表中的第二大值为:8
#请输入一个列表:36669999
#列表中的最大值为:9
#列表中的第二大值为:6
#请输入一个列表:
#Process finished with exit code -1
小结:具体思路还是用列表这个形式实现,为了防止破坏原列表,我做了个copy的列表备份,把所有操作都放在备份列表中进行。我这个写法存在的缺点是,如果直接把键盘读入的字符串转化成列表的话,只能实现0到9的判断,如果想要实现多位数判断大小的话就需要自己创建一个列表。
#练习题5(接昨天):计算指定的年月日是这一年的第几天
#具体实现方法:
def judge(year_month_day):
year = year_month_day[:4]
month = year_month_day[4:6]
day = year_month_day[6:8]
date = 0
months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if int(year) % 4 == 0 and int(year) % 100 != 0:
months[1] = 29
for x in range(int(month)-1):
date += months[x]
date += int(day)
print('%s是这一年的第%d天' % (year_month_day, date))
if __name__ == '__main__':
while 1:
str0 = str(input('(格式为20200226)请输入年月日:'))
judge(str0)
#测试结果:
#(格式为20200226)请输入年月日:20200226
#20200226是这一年的第57天
#(格式为20200226)请输入年月日:20200301
#20200301是这一年的第61天
#(格式为20200226)请输入年月日:
#Process finished with exit code -1
小结:思路比较常规,就是把读入的年月日作为字符串,然后分别切割成对应的三个字符串,把年份强制类型转换为整数型以判断是否为闰年,然后再把当前月份之前的日期和当前的日期相加即可。最后要注意的是,千万不要把if name == 'main’写错,不然会半天查不出来错误,我一开始写成了if name == ‘name’,程序没有输出,找了半天的错误才发现(来自2020.03.07的吐槽:这里的闰年判断条件还是少了)。
#练习题6(接昨天):打印杨辉三角
#具体实现方法:
#第n行的m个数可表示为C(n-1,m-1)=(n-1)!/((m-1)!(n-m)!)
#具体实现方法:
def jc(num):
data = 1
if num == 0:
return data
else:
for i in range(1, num+1):
data *= i
return data
if __name__ == '__main__':
while 1:
x = int(input('请输入要打印的杨辉三角的行数:'))
for n in range(1, x+1): #第n行
str_blank = ''
for m in range(1, n+1): #第m个数
print('%d' % (int(jc(n-1)/(jc(m-1)*jc(n-m)))), end=' ')
print(end='\n')
#测试结果:
#请输入要打印的杨辉三角的行数:2
#1
#1 1
#请输入要打印的杨辉三角的行数:3
#1
#1 1
#1 2 1
#请输入要打印的杨辉三角的行数:7
#1
#1 1
#1 2 1
#1 3 3 1
#1 4 6 4 1
#1 5 10 10 5 1
#1 6 15 20 15 6 1
#请输入要打印的杨辉三角的行数:
#Process finished with exit code -1
小结:杨辉三角也是一个比较经典的例子,要点在于需要自己编写一个求阶乘的函数,在写阶乘函数的时候要注意,0的阶乘是1,如果漏掉这一种情况的话,可能输出的结果会出现错误。
2.今日总结
GitHub项目上Day7的三个综合案例我就不写了,主要是一个时间比较紧张,这几天也要开始陆续上网课了,大三下学期的课也比较多,还有一个是这些问题都需要有一定的背景知识,写的话要仔细阅读规则,这也会耗费大量时间。如果将来有空的话我会把这三个案例写一遍然后补充到这一天的日记里。
今天主要做了昨天没做完的四个练习题,难度都不算太大。前三题只要灵活运用字符串、列表的切割方法以及它们内置的函数即可完美解决,最后一题只要把阶乘函数写出来的话就没有太大的问题。