=标题更新
昨天忘记打我学到课本的第几天了,今天开始补上~
==今天的课题
课本:https://reurl.cc/ROvEv6
练习4:设计一个函数返回传入的列表中最大和第二大元素的值
一样
1.函数
2.让使用者给一个list
3.回传最大与第二大元素
感觉元素比较的话可以用list.sort然后split前面两位,或者用if直接比较后对调排序
前者像这样:
def biggie(list1): list.sort(list1) return list1[-2:]biggie([2,3,11,5,8,1])
一次成功,好爽
def biggie(list1): for i in range(len(list1)): if list1[2]>list1[1]: list1.append(list1[2]) list1.pop(2) print(list1)biggie([5,4,12,6,2,9,12,3,55])#会卡住
后者写不出来,感觉是逻辑出状况,但基于我有写出第一个方法,我允许自己直接看答案(?
def max2(x): m1, m2 = (x[0], x[1]) if x[0] > x[1] else (x[1], x[0])#if-else跟变数写在同一行,我直接没了 for index in range(2, len(x)): if x[index] > m1: m2 = m1 m1 = x[index] elif x[index] > m2: m2 = x[index] print(x)max2([1,55,6,7,22,44,2,123])
试着马后砲一下:
1.不要试着去直接更动资料,如果像老师一样另外写两个变数出来,就可以用for把整个list跑过一遍,就不会发生像刚刚一样卡在第一次if执行完就不继续跑
2.if-else可以写在同一行。
剩下的就没啥好说, ̶跟̶我̶的̶思̶路̶基̶本̶上̶一̶样̶
=====
写完居然还有一点时间,那就只好无情的离转职更进一步ㄌ
练习5:计算指定的年月日是这一年的第几天。
这题没有说要函数,但我觉得他只是忘记写下要求,所以:
1.函数
2.让使用者指定日期(年月日)储存为list
3.识别闰年平年、其余数字转为天数加总
或是使用time模组来转换成time再直接转成天数?
总天数=日+往前的所有月分数*30+大月(1,3,5,7,8,10,12)的+1-(闰年-1or平年-2)
大月的概念这边写了段髒code解决
mon,count=12,0for Big_mon in range(1,mon+1): if Big_mon<8and Big_mon %2!=0: count+=1 elif Big_mon>=8 and Big_mon%2==0:count+=1#不管变数多少,写在同一行印出来就是666
再加入其他概念,code更髒了。
year,mon,big,total,date=20,9,0,0,11if 12>mon>1: total=(mon-1)*30for Big_mon in range(1,mon+1): if mon!=1 and Big_mon<8 and Big_mon %2!=0: big+=1 elif mon!=1 and Big_mon>=8 and Big_mon%2==0:big+=1if (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0):total-=1 else: total-=2#闰年公式if mon==1:total=0if mon==12:total=(mon-1)*30print(total+big+date)#超多if有没有
如果说重複是代码最坏的味道,我大概成功端出了馊水的世界冠军
不过自己写的程式,不含秤
最重要的是今天已经超额完成,加上我有点想睡了,明天起床再重构+看答案
=心得
今天的题目感觉都偏简单(跟我昨天搞错的副档名还有前天自己加戏的跑马灯比)
但今天有个最大的突破就是我发现渐渐能够直接在脑中规划这个程式码要怎么弄,也许有发现不知道能不能动或者需要去查询相关功能的部分再用笔记记起来,这样回去就只要处理每个问题,可以节省本来就不多的时间
希望能因此让我的进度变快~~(真的不想再做服务业了OTL)
==还债
起床之后把昨天写的东西整理了一下,主要是把润年判断与大小月判断给发包出去变成另外的函数,然后在main的地方留下日子输入跟输出
发包之后才发现有些小地方有错误,只能说昨天运气不错才执行出对的数字(?
def is_leap_year(x=0): if (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0): x-=1 else: x-=2 return xdef Big_mon(x=0): for Big_mon in range(1,mon):#原本这边多+了1,害我怎么算都多一天 if mon!=1 and Big_mon<8 and Big_mon %2!=0: x+=1 elif mon!=1 and Big_mon>=8 and Big_mon%2==0: x+=1 return xdef what_days_today(year,mon,date): if mon==1 :days=0 else:days=(mon-1)*30 return days+Big_mon(0)+is_leap_year(0)+datewhat_days_today(2000,8,31)#244
看答案时间
def is_leap_year(year): """ 判断指定的年份是不是闰年 :param year: 年份 :return: 闰年返回True平年返回False """ return year % 4 == 0 and year % 100 != 0 or year % 400 == 0def which_day(year, month, date): """ 计算传入的日期是这一年的第几天 :param year: 年 :param month: 月 :param date: 日 :return: 第几天 """ days_of_month = [ [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] ][is_leap_year(year)] total = 0 for index in range(month - 1): total += days_of_month[index] return total + datedef main(): print(which_day(1980, 11, 28)) print(which_day(1981, 12, 31)) print(which_day(2018, 1, 1)) print(which_day(2016, 3, 1))if __name__ == '__main__': main()
反省:
1.leap_year与分为几个函数执行的思考是一样的
2.完全没想到可以用list来写,或许之后的练习我该优先使用当章所教的东西来发想