一个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,也符合现在日历的打印。