Python_文件_日记管理系统

这是一个使用函数式编程实现的日记管理系统,包括添加、删除、修改、查询和显示日记功能。通过输入选项进行交互操作,数据保存在'diary.txt'文件中。系统还实现了Singleton模式,确保类只有一个实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数式编程

详解版

将程序拆分为一个个小的函数----“分而治之”

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SVIP_Quanw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值