isleapyear python_Python资料演练场

一个Python bot(随意放的大公馆存图...当头像当了好久..

读文件转义字符:

\t :横向制表,跟\r类似

\r:回车

\n:new line,即打印出新的空的一行,跟在字符串的后面表示下一个字符串打印要从下一行开始

但如果本来就换一行打印再打印\n,就会跳两行

本质就将换行等操作看成一个字符item,raw,column不需要定义可以在for循环条件里用,不是关键字,不表示行列

这里不粘贴我丑陋的代码了= =,说几点值得注意的:

1、文件名后面因该加.py .txt,否则读不出来

2、在(w)写文件txt的时候,首先会创建一个新文件(好奇怪,txt格式的文件内容没被删掉,但.py的被删了),(w+)可以读可以写

3、r模式直接在python shell里读出来

4、read(),readline(),readlines()都有返回对象

5、资料上给出的错误代码让我纠结了好久...用了w便不能再引用原来文件的内容了格式化输出:%宽度.小数点后保留几位小数f(宽度与编码有关)

打印日历

参考资料(给定年月日,判断某天是星期几):

my code:(不具有一般性...特意选了一个不是闰年的2月份)

def isLeapYear(year):

if year % 100 == 0:

if year % 4 == 0:

return True

else:

return False

else:

if year % 4 == 0:

return True

else:

return False

def day(year,month,day):

y0 = year-(14-month)//12

x = y0 + y0//4 - y0//100+y0//400

m0 = month +12*((14-month)//12.0)-2

d0 = (day+x+31*m0//12)%7

return d0

def calendar(year,month):

print('\t%d年%d月\t'%(year,month))

print('Su M Tu W Th F Sa')

n = int(day(year,month,1))

m = int(7-n)

if isLeapYear(year) is False:

if month == 2:

for i in range(1,8-n):

print(i,end= ' ')

print('\r')

print("%i%i%i%i%i%i%i"%(m+1,m+2,m+3,m+4,m+5,m+6,m+7))

print("%i%i%i%i%i%i%i"%(m+8,m+9,m+10,m+11,m+12,m+13,m+14))

print("%i%i%i%i%i%i%i"%(m+15,m+16,m+17,m+18,m+19,m+20,m+21))

然后我打印出的日历:

怎么说都有点丑丑的...

我的问题在于...为了不失一般性,应该怎么在第三个函数的基础上与第一二个函数联系起来。我当时写题的想法:

第一个函数判断是否是闰年,第二个函数判断给出年月日后这天为星期几,然后我想要打印任意给出的年月的这个月的日历。

首先,我可以判断这个月的第一天是星期几,然后我要考虑这个月是不是闰月,是28还是29还是30还是31天,这里就有四个分类讨论,这其中要套很多for if的判断。

然后,要考虑这个日历是四行还是五行,同时28天因为第一天是星期几未知使得行数不一定,这又是要讨论的。

好复杂!

然后我就...默默简化了...

贴一下答案:

#第四题

def day(y, m, d):#计算y年m月d日是星期几

# 请在下面编写代码

y0 = y - (14 - m) // 12

x = y0 + y0 // 4 - y0 // 100 + y0 // 400

m0 = m + 12 * ((14 - m) // 12) - 2

d0 = (d + x + (31 * m0) // 12) % 7

# 请不要修改下面的代码

return d0

def isLeapYear(year): #判断year年是否闰年

# 请在下面编写代码

isLeapYear = (year % 4 == 0)

isLeapYear = isLeapYear and (year % 100 != 0)

isLeapYear = isLeapYear or (year % 400 == 0)

# 请不要修改下面的代码

return isLeapYear

def calendar(y, m): #打印y年m月日历

print(' {}年{}月'.format(y,m))

print('Su\tM\tTu\tW\tTh\tF\tSa')

# 请在下面编写代码

date = day(y, m, 1)

days = 0

if m in [1, 3, 5, 7, 8, 10, 12]:

days = 31

elif m in [4, 6, 9, 11]:

days = 30

else:

if isLeapYear(y):

days = 29

else:

days = 28

count = date

for i in range(date):

print('\t', end='')

for d in range(1, days + 1):

print(str(d) + '\t', end="")

count = (count + 1) % 7

if count == 0:

print()

print()

# 请不要修改下面的代码

然后我自己重新写了一遍,终于也打印出漂亮的日历辽!

def isLeapYear(year):

if year % 100 == 0:

if year % 4 == 0:

return True

else:

return False

else:

if year % 4 == 0:

return True

else:

return False

def day(year,month,day):

y0 = year-(14-month)//12

x = y0 + y0//4 - y0//100+y0//400

m0 = month +12*((14-month)//12.0)-2

d0 = (day+x+31*m0//12)%7

return d0

def calendar(year,month):

date = int(day(year,month,1))

days = 0

if month in [1,3,5,7,8,10,12]:

days = 31

elif month in [4,6,9,11]:

days = 30

else:

if isLeapYear(year):

days = 29

else:

days = 28

count = date

print('\t\t%d年%d月'%(year,month))

print('Su\tMo\tTu\tWe\tth\tFr\tSa')

for i in range(date):

print('\t',end = '')

for i in range(1,days + 1):

print('%d\t'%i,end = '')

if (1+count)%7 == 0:

print()

count = (count+1)%7

return 1

第三个函数用很简单的代码把应该分类讨论的事情都变得简单了,我们来看看它好在哪里吧。首先将月份放在列表里,分大月小月和2月三大类,2月又分闰月和非闰月。

不吝惜用\t

最妙的地方在于狗仔了一个count = date,count = (count+1)%7,专门用来换行,由于在我们的日历里,6是最后一天,所以不能是count % 7,而必须是(count+1)%7,,利用取余来换行,直到这个月的最后一天。

在打印时,在没有特殊符号的情况下,是不打印引号的

换行有多种表示方法,print()也可以表示换行,本质是这一行有执行,但执行是打印了空格。不利用将\n加在数的后面进行换行,避免分类讨论。

调用一个函数,必须要在一个tab的位置进行return,如果没有return,就会在上次打印的末端(不一定会换行)自动返回None,所以我给了一个返回值1,也符合现在日历的打印。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值