我是编程业余爱好者,工作是中学里面的档案管理员。除了大学学过C++,我的工作跟编程没什么关系,但因为管理电子档案,所以跟excel打交道还是挺多的。
今年3月,我被小姐妹安利了在风变学python,于是报了名,花了2个月毕业了。期间除了完成课堂作业,自己也做了一些小项目,很有趣。以后大概也会继续在编程的世界里愉快玩耍吧,于是就在这里开个博客分享记录一下。
先来一张图,记录我到目前为止的所有项目(按最后改动时间排序):
第一个项目:云云图书馆
【创作背景】
当时正在学python基础语法,学到“类和对象”。这应该是基础语法的第一个难点,我跟着课程跑了一遍,整个人都是晕的。实在没勇气开始下一章,于是就想,自己再把课堂练习(《流浪图书馆》)换汤不换药的再敲一遍,改成自己的项目来练练手。
【功能设想】
作为一个图书管理系统,首先进去应该是一个菜单,可以选择各功能。功能有浏览书目(内置),添加书籍,借书还书(需要创建借阅人信息)。
【功能实现】
图书馆里的书都有书名,作者,内容简介,借阅状态,借书人信息,预定归还日期这些信息。添加书籍的时候也需要录入这些信息。所以需要创建一个类来管理所有的书籍,每一本书就是一个对象。
功能1:浏览全部书籍,就是打印出所有对象的信息。
功能2:添加书籍,就是创建新的对象。
功能3:借书,给对象的 借阅状态/借书人信息/预定还书日期 这三个信息重新赋值。借书之前要先判断本书是否已经被借走,如果已经被借走,告知预定归还日期。
功能4:还书,给对象的 借阅状态/借书人信息/预定还书日期 这三个信息重新赋值。还书之前要判断本书是否已经被归还。设定默认借书时间为一个月,需要用datetime函数来计算书籍是否过期(当时还不太会用,只做了个粗糙版的日期计算器),过期了就提示要缴罚款。
菜单:每个功能完成之后要回到主菜单,用 while True 循环。
优化:程序主体完成之后,可以优化一些小的细节,比如预定输入数字但实际输入了字母的时候,提示“输入有误,重新输入”,而不是直接闪退。
【 效果体验】
【完工感受】
敲完这个项目之后,我感觉对类和对象,以及函数的使用有了一点信心。知道了常见的坑在哪里(因为自己都跳过),甚至能在学习群里回答一些小伙伴的提问了。
这个项目是我第一个融入了自己想法的项目,它奠定了我之后编写小程序的风格(就是只关注功能,不关注颜值的偷懒风格)。
这个项目做完,阿云就继续前行,朝着自动发邮件的关卡冲去啦~
【完整代码】
import time
import datetime
class Book():
# 需要基本属性:书名,作者,推荐语,借阅状态,借阅人姓名,预定归还日期
def __init__(self,bookname,author,comment,state=0,lender=None,returndate=None):
self.bookname=bookname
self.author=author
self.comment=comment
self.state=state
self.lender=lender
self.returndate=returndate
def __str__(self):
#列出书籍基本信息
state='未借出'
if self.state==1:
state='已借出'
return '\n书名:%s\n作者:%s\n推荐语:%s\n借阅状态:%s\n借阅人:%s\n预定归还日期:%s' %(\
self.bookname,self.author,self.comment,state,self.lender,self.returndate)
class Bookmanager():
books=[]
def __init__(self):
#添加3本初始化书籍,供测试
book1=Book('惶然录','费尔南多·佩索阿','一个迷失方向且濒于崩溃的灵魂的自我启示,一首对默默无闻、失败、智慧、困难和沉默的赞美诗。')
book2=Book('以箭为翅','简媜','调和空灵文风与禅宗境界,刻画人间之缘起缘灭。像一条柔韧的绳子,情这个字,不知勒痛多少人的心肉。')
book3=Book('爱的流放地','渡边淳一','霜王有梦,神女无心。绝望的爱情,心中的桃花源。',1,'健健','2021-03-22')
self.books.append(book1)
self.books.append(book2)
self.books.append(book3)
def menu(self):
#选择菜单
print('-'*75,'\n\n欢迎来到阿云图书馆,每本沉默的好书都是一座流浪的岛屿,希望你有缘发现并着陆。\n制作:云云\n日期:2021.3.25')
while True:
time.sleep(0.5)
print('\n'+'-'*75)
choice=input('\n1.浏览全部书籍\n2.添加书籍\n3.借阅书籍\n4.归还书籍\n5.退出系统\n\n请输入数字选择您需要的功能:')
if choice=='1':
self.showallbook()
elif choice=='2':
self.addbook()
elif choice=='3':
self.lendbook()
elif choice=='4':
self.returnbook()
elif choice=='5':
print('\n感谢使用。愿你我成为爱书之人,在茫茫书海里相遇。再会。')
input('\n按回车键结束程序')
break
else:
print('\n------输入有误,请输入数字来选择功能------')
def showallbook(self):
#function 1
for book in self.books:
print(book)
print('')
def addbook(self):
#function 2
newname=input('\n请输入书籍名称:')
newauthor=input('\n请输入作者:')
newcomment=input('\n请输入推荐语:')
newbook=Book(newname,newauthor,newcomment)
self.books.append(newbook)
print('\n书籍录入成功!')
def check(self,name):
for book in self.books:
if name==book.bookname:
return book
else:
return None
def monthplus1(self):
import datetime
today=datetime.date.today()
if today.month!=12:
res=today.replace(month=today.month+1)
else:
res=today.replace(month=1)
res=today.replace(year=today.year+1)
return res
def lendbook(self):
#function 3
name=input('\n请输入书籍名称:')
if self.check(name)==None:
print('\n查无此书')
else:
sta=self.check(name).state
if sta==0:
self.check(name).state=1
self.check(name).lender=input('\n请输入您的姓名:')
self.check(name).returndate=self.monthplus1()
print('\n借阅成功,借阅期限是1个月,请记得在{}之前归还哦!'.format(self.check(name).returndate))
else:
print('\n您来晚了一步,该书已经被借走了。预定归还日期是{}。'.format(self.check(name).returndate))
def totalday(self,day):
import datetime
self.day=day
day=str(day)
day_year=int(day[:4])
day_month=int(day[5:7])
day_day=int(day[8:10])
totalday=day_year*365+day_month*30+day_day
return totalday
def returnbook(self):
#function 4
name=input('\n请输入书籍名称:')
if self.check(name)==None:
print('\n无此书,请检查您的输入是否正确。')
else:
sta=self.check(name).state
if sta==1:
self.check(name).state=0
#检查是否超时
dayshould=self.check(name).returndate
dayactual=datetime.date.today()
diff=self.totalday(dayactual)-self.totalday(dayshould)
if diff>0:
print('\n归还成功。但您的借阅时间超时了{}天,需要付{}元超时费。谢谢。'.format(diff,diff*0.5))
else:
print('\n归还成功。')
self.check(name).lender=None
self.check(name).returndate=None
else:
print('\n这本书还没有被借走呢。请检查您的输入是否正确。')
manager=Bookmanager()
manager.menu()