日记管理系统
函数式编程
详解版
将程序拆分为一个个小的函数----“分而治之”
def main():
""" 完成一系列操作的主函数 """
load() # 调用load函数
while True:
print("我的日记系统v1.0".center(20, '-') +
"\n1. 添加日记 \
\n2. 删除日记 \
\n3. 修改日记信息 \
\n4. 查询日记信息 \
\n5. 显示所有日记信息\
\n6. 退出")
try:
if (menu_option := int(input("请输入您需要的功能选项:"))-1) == 5: # ValueError
save()
print("退出")
break
except ValueError:
print("请你从新输入一个数字: ")
continue
#? func + () -> func()
func_ls = [add, remove, modify, search, show_all]
func_ls[menu_option]()
#? 为什么不把 () 放到 func_ls 里面?
#? func() -> 执行
def sub_add():
""" 让用户输入日记内容 """
middle=[] #? 中间变量
cnt=0 #? 行号
while diary:=input(':'):
#? ':'提示用户输入, 不输入任何字符按回车结束
middle.append(str(cnt)+' '+diary)
cnt+=1
middle.append('end_of_diary')
# ? 添加一篇日记结束的标志
return middle
def add():
""" 让用户输入整篇日记 """
global diary_ls
#! 不声明下一句不能添加 why? 如果局部要对全局变量*修改*,则在局部声明该全局变量
diary_ls.extend(['date:'+input(' ˙ω˙ 今天是几月几号?(eg.6/8): '),
'wheather:'+input('今天天气怎么样: '),
'mood:'+input('今天心情怎么样: '),
'theme:'+input('日记的主题是: ')]) #? 字符串list
print('好,现在开始愉快地写日记吧!')
diary_ls.extend(sub_add())
def save():
""" 保存 diary_ls 中的数据到 txt """
#? 以"写"的方式,打开当前目录下的'diary.txt'
with open('./diary.txt', 'w', encoding='utf-8') as d:
d.write('\n'.join(diary_ls))
#? 把 dairy_ls 转换成字符串,中间用换行回车隔开,再写入文件
def search():
""" 根据索引查找date所在行 """
while True:
try:
(choice := int(input('请输入索引:\n1. 日期\n2. 主题'))) in [1, 2]
break
except ValueError: # 确保用户输入的是1或2
print("请你输入一个数字: 1 或 2")
continue
if not choice-1:
s = input('请输入日期: ')
# 以日期为搜索标志
# global diary_ls # 非必要
index = 0 # 找到了就要返回的下标值
for i in range(len(diary_ls)): # 下标从0 -> len(diary_ls)-1 遍历 diary_ls
if (aim1 := diary_ls[i]) == (aim2 := 'date:'+s):
# eg. 输入 6/9 -> date:6/9 再去和diary_ls里面的比较
index = i # 相等的时候得到下标值
break
else: # 如果循环了一圈都没找到
print('没有找到!')
return -1 # 返回 -1 表示没找的, 这里就退出函数了
i = index # 下标付给 i 作返回值, index 拿去作为循环变量
while diary_ls[index].strip() != 'end_of_diary':
# # IndexError: 'end_of_diary\n'
print(diary_ls[index]) # 打印找到的结果
index += 1
return i # 返回找到的下标值
else:
s = input('请输入主题: ') # ***
index = 0
for i in range(len(diary_ls)):
if diary_ls[i] == 'theme:'+s: # ***
index = i
break
else:
print('没有找到!')
return -1
i = (index :=index-3) # ***
while diary_ls[index].strip() != 'end_of_diary':
print(diary_ls[index])
index += 1
return i #? 返回的还是date
def remove(index=-2):
""" 删除 """
#? 如果remove有参数传入 index=传入的参数 , 否则调用searc去找
if index != -2 or (index := search()) != -1: #* 没找的,或没传入下标就不执行
while diary_ls[index] != 'end_of_diary': # 从date删到end_of_diary
del diary_ls[index]
del diary_ls[index] # 删除 end_of_diary
#! index += 1 after del ls shrink or list index out of range
def modify():
""" 修改日记内容 """
# 调用search去找要修改的,没找到就show_menu
#? 为什么不直接remove
if (index := search()) != -1:
remove(index+4) # 找到了就删掉其类容
global diary_ls
diary_ls=diary_ls[:index+4]+sub_add()+diary_ls[index+4:]
# 然添加新的
def load():
""" 加载 txt 中数据到 dairy_ls """
#? 以"添加"的方式,打开当前目录下的'diary.txt' 创建新文件时,可用参数:w,w+,a,a+
#? 为什么不以"读"的方式打开文件 -> 不能新建文件
with open('./diary.txt', 'a+', encoding='utf-8') as d:
global diary_ls # !必要
#? 读取文件全部类容->str, 去掉两边的空格和空行,按 \n 分割->list
d.seek(0) #? 文件指针回到文件开头
diary_ls = d.read().strip().split('\n')
print(diary_ls) # 输出以前的 diary_ls 里面的类容
def show_all():
""" 打印所有日记信息 """
# global diary_ls
for i in diary_ls:
print([i,''][i=='end_of_diary'])
# i== 'end_of_diary' -> print('')
diary_ls = []
if __name__ == '__main__': #? 程序主入口
try:
main()
except KeyboardInterrupt:
# Ctrl+C
... # 不做任何事
finally:
print('谢谢使用 :)')
精华版
里面有个小彩蛋
def add():
global diary_ls # ! 不声明下一句不能添加 why? 如果局部要对全局变量*修改*,则在局部声明该全局变量
diary_ls.extend(['date:'+input(' ˙ω˙ 今天是几月几号?(eg.6/8): '),
'wheather:'+input('今天天气怎么样: '),
'mood:'+input('今天心情怎么样: '),
'theme:'+input('日记的主题是: ')])
print('好,现在开始愉快地写日记吧!')
diary_ls.extend(sub_add())
def save():
with open('./diary.txt', 'w', encoding='utf-8') as d:
d.write('\n'.join(diary_ls))
def search():
while True:
try:
(choice := int(input('请输入索引:\n1. 日期 2. 主题: '))) in [1, 2]
break
except ValueError:
print("请你输入一个数字: 1 或 2")
continue
if not choice-1:
s = input('请输入日期: ')
index = 0
for i in range(len(diary_ls)):
if diary_ls[i] == 'date:'+s:
index = i
break
else:
print('没有找到!')
return -1
i = index
while diary_ls[index].strip() != 'end_of_diary': #! IndexError: 'end_of_diary\n'
print(diary_ls[index])
index += 1
return i
else:
s = input('请输入主题: ') # ***
index = 0
for i in range(len(diary_ls)):
if diary_ls[i] == 'theme:'+s: # ***
index = i
break
else:
print('没有找到!')
return -1
i = (index := index-3) # ***
while diary_ls[index].strip() != 'end_of_diary': # IndexError: 'end_of_diary\n'
print(diary_ls[index])
index += 1
return i # date
def remove(index=-2):
if index != -2 or (index := search()) != -1:
while diary_ls[index] != 'end_of_diary':
del diary_ls[index]
del diary_ls[index]
print(diary_ls)
def modify():
if (index := search()) != -1:
remove(index+4)
global diary_ls
diary_ls=diary_ls[:index+4]+sub_add()+diary_ls[index+4:]
def sub_add():
middle=[]
cnt=0
while diary:=input(':'):
middle.append(str(cnt)+' '+diary)
cnt+=1
middle.append('end_of_diary')
return middle
def load():
try:
d = open('./diary.txt', 'r', encoding='utf-8')
except FileNotFoundError:
open('./diary.txt', 'w').close()
d = open('./diary.txt', 'r', encoding='utf-8')
finally:
global diary_ls # !必要
diary_ls = d.read().strip().split('\n')
d.close()
print(diary_ls)
def show_all():
for i in diary_ls:
print([i, ''][i == 'end_of_diary'])
def main():
load()
while True:
print("我的日记系统v8.3".center(20, '-') +
"\n1. 添加日记 \
\n2. 删除日记 \
\n3. 修改日记信息 \
\n4. 查询日记信息 \
\n5. 显示所有日记信息\
\n6. 退出")
try:
if (menu_option := int(input("请输入您需要的功能选项:"))-1) == 5: #! ValueError
save()
print("退出")
break
except ValueError:
print("请你输入一个数字")
continue
func_ls = [add, remove, modify, search, lambda:print(
'\n'.join([[i, '\n'][i == 'end_of_diary'] for i in diary_ls]))]
func_ls[menu_option]()
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
...
# except IndexError:
finally:
print('谢谢使用 :)')
# todo Singleton
Singleton版
def singleton(cls):
_instance = {}
def inner():
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return inner
@singleton
class Diary(object):
__diary_ls = []
def __init__(self):
# * 主程序入口
try:
self.__main()
except KeyboardInterrupt:
...
finally:
print('谢谢使用 :)')
def add(self):
Diary.__diary_ls.append('date:'+input(' ˙ω˙ 今天是几月几号?(eg.6/8): ')+'\n' +
'wheather:'+input('今天天气怎么样: ')+'\n' +
'mood:'+input('今天心情怎么样: ')+'\n' +
'theme:'+input('日记的主题是: '))
print('好,现在开始愉快地写日记吧!')
cnt = 0
while diary := input('>'):
Diary.__diary_ls.append(str(cnt)+' '+diary)
cnt += 1
Diary.__diary_ls.append('end_of_diary\n')
def save(self):
with open('./diary.txt', 'w', encoding='utf-8') as d:
d.write('\n'.join(Diary.__diary_ls))
def search(self):
s = input('请输入日期: ')
index = 0
for i in range(len(Diary.__diary_ls)):
if (ls := Diary.__diary_ls[i]) == (aim := 'date:'+s):
index = i
break
else:
print('没有找到!')
return -1
i = index
while Diary.__diary_ls[index] != 'end_of_diary':
print(Diary.__diary_ls[index])
index += 1
return i
def remove(self, index=-2):
if index != -2 or (index := self.search()) != -1:
while Diary.__diary_ls[index] != 'end_of_diary':
del Diary.__diary_ls[index]
del Diary.__diary_ls[index]
def modify(self):
if (index := self.search()) != -1:
self.remove(index)
self.add()
def load(self):
with open('./diary.txt', 'r', encoding='utf-8') as d:
Diary.__diary_ls = d.read().strip().split('\n')
print(Diary.__diary_ls)
def __main(self):
self.load()
while True:
print("我的日记系统v3.0".center(20, '-') +
"\n1. 添加日记 \
\n2. 删除日记 \
\n3. 修改日记信息 \
\n4. 查询日记信息 \
\n5. 显示所有日记信息\
\n6. 退出")
try:
if (menu_option := int(input("请输入您需要的功能选项:"))-1) == 5:
self.save()
print("退出")
break
except ValueError:
print("请你输入一个数字")
continue
func_ls = [self.add,
self.remove,
self.modify,
self.search,
lambda:
print('\n'.join([[i, ''][i == 'end_of_diary']
for i in Diary.__diary_ls]))
]
func_ls[menu_option]()
Diary1 = Diary()
# print(__diary_ls)