有趣的python程序Part1:如何根據記憶曲線使用python編寫一個單詞記憶默寫程序

目錄

前言

1. 數據管理模塊

?2. 記憶算法實現

3. 持久化存儲

?4. 用戶界面實現

5.整合與測試


前言

????????此篇文章為“有趣的python程序”專欄的第一篇文章,本專欄致力于分享一些有趣的編程作品,如果能夠使您產生興趣,不妨來動手改編使之成為更好的工具吧!若是能夠幫助到您,在下不勝榮幸!

我們先來確定一下單詞記憶程序的功能框架,它需要具有以下功能:

- 基于記憶曲線(艾賓浩斯遺忘曲線)安排單詞復習
- 記錄用戶對單詞的掌握情況
- 提供學習和測試兩種模式
- 持久化保存學習數據


故此我們可以將程序分為幾個核心部分:
- **數據管理**:存儲單詞及其記憶狀態
- **記憶算法**:計算下次復習時間
- **用戶界面**:與用戶交互的界面
- **持久化存儲**:保存學習進度

## 第二階段:分模塊實現

1. 數據管理模塊

先來看以下代碼:

import datetime
from collections import defaultdictclass WordMemorySystem:def __init__(self):# 使用字典存儲所有單詞數據self.word_data = defaultdict(dict)# 記憶曲線間隔 (天)self.review_intervals = [1, 2, 4, 7, 15, 30, 60, 90]def add_word(self, word, meaning, example=""):"""添加新單詞"""today = datetime.date.today()if word not in self.word_data:self.word_data[word] = {'meaning': meaning,'example': example,'added_date': today,'last_reviewed': today,'next_review': today + datetime.timedelta(days=self.review_intervals[0]),'review_count': 0,'correct_count': 0,'incorrect_count': 0}

我們在這里使用列表來儲存記憶曲線的節點,這樣當我們核對各個單詞的背誦時間時就可以與列表里的時間相比對,我們來詳細分析這一句。

'next_review': today + datetime.timedelta(days=self.review_intervals[0])

它的意思是指當前日期加上預設的復習間隔天數。

today
代表當前日期,通常通過datetime.date.today()獲取。需要確保代碼中已正確定義該變量。

datetime.timedelta
Python標準庫中用于表示時間間隔的類。days參數指定需要增加的天數。

self.review_intervals[0]
從對象屬性中獲取的第一個復習間隔天數。review_intervals應為預定義的列表或數組,存儲著不同階段的復習間隔

?2. 記憶算法實現

def review_word(self, word, is_correct):"""記錄單詞復習結果并安排下次復習時間"""if word in self.word_data:info = self.word_data[word]info['last_reviewed'] = datetime.date.today()# 更新正確/錯誤計數if is_correct:info['correct_count'] += 1else:info['incorrect_count'] += 1# 根據記憶曲線安排下次復習時間review_count = min(info['review_count'], len(self.review_intervals) - 1)interval = self.review_intervals[review_count]# 如果不正確,縮短復習間隔if not is_correct:interval = max(1, interval // 2)info['next_review'] = datetime.date.today() + datetime.timedelta(days=interval)info['review_count'] += 1

這里我們需要做防越界處理:通過min()函數確保review_count不超過列表的最大索引。

3. 持久化存儲

import json
import osdef load_data(self, data_file='word_memory_data.json'):"""加載已有的單詞數據"""self.data_file = data_fileif os.path.exists(data_file):with open(data_file, 'r', encoding='utf-8') as f:data = json.load(f)# 將字符串日期轉換為datetime.date對象for word, word_info in data.items():for key in ['added_date', 'last_reviewed', 'next_review']:if key in word_info and word_info[key]:word_info[key] = datetime.datetime.strptime(word_info[key], '%Y-%m-%d').date()self.word_data[word] = word_infodef save_data(self):"""保存單詞數據到文件"""# 將datetime.date對象轉換為字符串data_to_save = {}for word, word_info in self.word_data.items():word_info_copy = word_info.copy()for key in ['added_date', 'last_reviewed', 'next_review']:if key in word_info_copy and word_info_copy[key]:word_info_copy[key] = word_info_copy[key].strftime('%Y-%m-%d')data_to_save[word] = word_info_copywith open(self.data_file, 'w', encoding='utf-8') as f:json.dump(data_to_save, f, ensure_ascii=False, indent=2)

?4. 用戶界面實現

在這里,我們來編寫用戶在命令行里交互時所能看到的用戶界面:

def learn_mode(self):"""學習模式:逐個顯示需要復習的單詞"""words_to_review = self.get_words_to_review()if not words_to_review:print("恭喜!今天沒有需要復習的單詞。")returnprint(f"\n今天有 {len(words_to_review)} 個單詞需要復習:")for word, info in words_to_review:print("\n" + "="*50)print(f"單詞: {word}")input("按回車鍵查看意思...")print(f"意思: {info['meaning']}")if info['example']:print(f"例句: {info['example']}")while True:response = input("你記住了嗎?(y/n): ").lower()if response in ['y', 'n']:self.review_word(word, response == 'y')breakprint("請輸入 y 或 n")print("\n復習完成!")

5.整合與測試

接下來我們給程序添加main函數,就離大功告成不遠了!

def main():system = WordMemorySystem()system.load_data()while True:print("\n" + "="*50)print("單詞記憶系統")print("1. 添加新單詞")print("2. 學習模式")print("3. 默寫測試")print("4. 退出")choice = input("請選擇操作: ")if choice == '1':word = input("輸入單詞: ").strip()meaning = input("輸入意思: ").strip()example = input("輸入例句 (可選): ").strip()system.add_word(word, meaning, example)system.save_data()elif choice == '2':system.learn_mode()system.save_data()elif choice == '3':system.test_mode()system.save_data()elif choice == '4':print("退出系統。")breakelse:print("無效選擇,請重新輸入。")

最后,我們來看看完整的代碼:

import datetime
import json
import os
import random
from collections import defaultdictclass WordMemorySystem:def __init__(self, data_file='word_memory_data.json'):self.data_file = data_fileself.word_data = defaultdict(dict)self.load_data()# 記憶曲線間隔 (天)self.review_intervals = [1, 2, 4, 7, 15, 30, 60, 90]def load_data(self):"""加載已有的單詞數據"""if os.path.exists(self.data_file):with open(self.data_file, 'r', encoding='utf-8') as f:data = json.load(f)# 將字符串日期轉換為datetime.date對象for word, word_info in data.items():for key in ['added_date', 'last_reviewed', 'next_review']:if key in word_info and word_info[key]:word_info[key] = datetime.datetime.strptime(word_info[key], '%Y-%m-%d').date()self.word_data[word] = word_infodef save_data(self):"""保存單詞數據到文件"""# 將datetime.date對象轉換為字符串data_to_save = {}for word, word_info in self.word_data.items():word_info_copy = word_info.copy()for key in ['added_date', 'last_reviewed', 'next_review']:if key in word_info_copy and word_info_copy[key]:word_info_copy[key] = word_info_copy[key].strftime('%Y-%m-%d')data_to_save[word] = word_info_copywith open(self.data_file, 'w', encoding='utf-8') as f:json.dump(data_to_save, f, ensure_ascii=False, indent=2)def add_word(self, word, meaning, example=""):"""添加新單詞"""today = datetime.date.today()if word not in self.word_data:self.word_data[word] = {'meaning': meaning,'example': example,'added_date': today,'last_reviewed': today,'next_review': today + datetime.timedelta(days=self.review_intervals[0]),'review_count': 0,'correct_count': 0,'incorrect_count': 0}print(f"已添加單詞: {word} - {meaning}")else:print(f"單詞 '{word}' 已存在")self.save_data()def get_words_to_review(self):"""獲取今天需要復習的單詞"""today = datetime.date.today()words_to_review = []for word, info in self.word_data.items():if 'next_review' in info and info['next_review'] <= today:words_to_review.append((word, info))# 按復習優先級排序 (先復習不熟悉的單詞)words_to_review.sort(key=lambda x: (x[1]['incorrect_count'] / (x[1]['correct_count'] + x[1]['incorrect_count'] + 1),x[1]['next_review']), reverse=True)return words_to_reviewdef review_word(self, word, is_correct):"""記錄單詞復習結果并安排下次復習時間"""if word in self.word_data:info = self.word_data[word]info['last_reviewed'] = datetime.date.today()# 更新正確/錯誤計數if is_correct:info['correct_count'] += 1else:info['incorrect_count'] += 1# 根據記憶曲線安排下次復習時間review_count = min(info['review_count'], len(self.review_intervals) - 1)interval = self.review_intervals[review_count]# 如果不正確,縮短復習間隔if not is_correct:interval = max(1, interval // 2)info['next_review'] = datetime.date.today() + datetime.timedelta(days=interval)info['review_count'] += 1self.save_data()def learn_mode(self):"""學習模式:逐個顯示需要復習的單詞"""words_to_review = self.get_words_to_review()if not words_to_review:print("恭喜!今天沒有需要復習的單詞。")returnprint(f"\n今天有 {len(words_to_review)} 個單詞需要復習:")for word, info in words_to_review:print("\n" + "=" * 50)print(f"單詞: {word}")input("按回車鍵查看意思...")print(f"意思: {info['meaning']}")if info['example']:print(f"例句: {info['example']}")while True:response = input("你記住了嗎?(y/n): ").lower()if response in ['y', 'n']:self.review_word(word, response == 'y')breakprint("請輸入 y 或 n")print("\n復習完成!")def test_mode(self):"""測試模式:默寫測試"""words_to_review = self.get_words_to_review()if not words_to_review:print("今天沒有需要復習的單詞。")returnprint("\n默寫測試模式 (輸入 q 退出)")random.shuffle(words_to_review)for word, info in words_to_review:print("\n" + "=" * 50)print(f"意思: {info['meaning']}")if info['example']:print(f"例句: {info['example']}")user_input = input("請輸入對應的單詞: ").strip()if user_input.lower() == 'q':breakif user_input.lower() == word.lower():print("正確!")self.review_word(word, True)else:print(f"錯誤!正確答案是: {word}")self.review_word(word, False)print("\n測試結束!")def main():system = WordMemorySystem()while True:print("\n" + "=" * 50)print("單詞記憶系統")print("1. 添加新單詞")print("2. 學習模式")print("3. 默寫測試")print("4. 查看所有單詞")print("5. 查看今天需要復習的單詞")print("6. 退出")choice = input("請選擇操作: ")if choice == '1':word = input("輸入單詞: ").strip()meaning = input("輸入意思: ").strip()example = input("輸入例句 (可選): ").strip()system.add_word(word, meaning, example)elif choice == '2':system.learn_mode()elif choice == '3':system.test_mode()elif choice == '4':if not system.word_data:print("還沒有添加任何單詞。")else:print("\n所有單詞:")for i, (word, info) in enumerate(system.word_data.items(), 1):print(f"{i}. {word}: {info['meaning']}")if info['example']:print(f"   例句: {info['example']}")print(f"   添加日期: {info['added_date']}, 最后復習: {info['last_reviewed']}, 下次復習: {info['next_review']}")print(f"   正確: {info['correct_count']}, 錯誤: {info['incorrect_count']}")elif choice == '5':words_to_review = system.get_words_to_review()if not words_to_review:print("今天沒有需要復習的單詞。")else:print(f"\n今天需要復習 {len(words_to_review)} 個單詞:")for i, (word, info) in enumerate(words_to_review, 1):print(f"{i}. {word}: {info['meaning']}")elif choice == '6':print("退出系統。")breakelse:print("無效選擇,請重新輸入。")if __name__ == "__main__":main()

好的!那么今天的內容就到這里了,現在我們只能在命令行中操作它,之后也可以給它添加圖形化界面使它更加有趣。
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85559.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85559.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85559.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【案例】性能優化在持續集成與持續交付中的應用

【案例】性能優化在持續集成與持續交付中的應用 為了更好地理解性能優化在CI/CD流程中的實際應用&#xff0c;本節將結合一個典型案例&#xff0c;從代碼提交到部署上線的完整流程中&#xff0c;講解如何嵌入性能檢測與自動化優化機制&#xff0c;并使用結構化流程圖直觀展示關…

P7 QT項目----會學天氣預報(完結)

7.8 QMap 在 Qt 中&#xff0c;如果你想要將 JSON 數據解析到一個 QMap 中&#xff0c;你可以遍歷 JSON 對象的所有鍵值對&#xff0c;并將它們添加到 QMap 里。這個方法特別適合于當你的 JSON 對象是一個簡單的鍵值對集合時。以下是一個如何實現這一點的示例。 示例&#…

操作系統筆記(關于進程引入和狀態的切換)

1.前言 今天下午結束了英語的四六級考試&#xff0c;終于是結束了&#xff0c;最近的這個考試太密集&#xff0c;周四的專業基礎課考試&#xff0c;周五的這個線性代數的考試和這個周六的英語四六級考試&#xff0c;吧我都要烤焦了&#xff0c;最近也是疲于應對這個考試&#…

M1芯片macOS安裝Xinference部署大模型

如果你看的是官方手冊&#xff1a;安裝 — Xinference 千萬不要直接運行&#xff1a; pip install "xinference[all]" 會遇到幾個問題&#xff1a; 1&#xff09;Python版本如果太新可能安裝失敗 2&#xff09;全量安裝會失敗 3&#xff09;未科學上網可能會time…

【ONNX量化實戰】使用ONNX Runtime進行靜態量化

目錄 什么是量化量化實現的原理實戰準備數據執行量化 驗證量化結語 什么是量化 量化是一種常見的深度學習技術&#xff0c;其目的在于將原始的深度神經網絡權重從高位原始位數被動態縮放至低位目標尾數。例如從FP32&#xff08;32位浮點&#xff09;量化值INT8&#xff08;8位…

【量子計算】格羅弗算法

文章目錄 &#x1f50d; 一、算法原理與工作機制? 二、性能優勢&#xff1a;二次加速的體現&#x1f310; 三、應用場景?? 四、局限性與挑戰&#x1f52e; 五、未來展望&#x1f48e; 總結 格羅弗算法&#xff08;Grover’s algorithm&#xff09;是量子計算領域的核心算法之…

C++ 互斥量

在 C 中&#xff0c;互斥量&#xff08;std::mutex&#xff09;是一種用于多線程編程中保護共享資源的機制&#xff0c;防止多個線程同時訪問某個資源&#xff0c;從而避免數據競爭&#xff08;data race&#xff09;和不一致的問題。 &#x1f512; 一、基礎用法&#xff1a;s…

CSS Content符號編碼大全

資源寶整理分享&#xff1a;?https://www.httple.net? 前端開發中常用的特殊符號查詢工具&#xff0c;包含Unicode編碼和HTML實體編碼&#xff0c;方便開發者快速查找和使用各種符號。支持基本形狀、箭頭、數學符號、貨幣符號等多種分類。 前端最常用符號 圖標形狀十進制十…

RPC常見問題回答

項目流程和架構設計 1.服務端的功能&#xff1a; 1.提供rpc調用對應的函數 2.完成服務注冊 服務發現 上線/下線通知 3.提供主題的操作 (創建/刪除/訂閱/取消訂閱) 消息的發布 2.服務的模塊劃分 1.網絡通信模塊 net 底層套用的moude庫 2.應用層通信協議模塊 1.序列化 反序列化數…

【JavaEE】(3) 多線程2

一、常見的鎖策略 1、樂觀鎖和悲觀鎖 悲觀鎖&#xff1a;預測鎖沖突的概率較高。在鎖中加阻塞操作。樂觀鎖&#xff1a;預測鎖沖突的概率較低。使用忙等/版本號等&#xff0c;不產生阻塞。 2、輕量級鎖和重量級鎖 重量級鎖&#xff1a;加鎖的開銷較大&#xff0c;線程等待鎖…

創客匠人服務體系解析:知識 IP 變現的全鏈路賦能模型

在知識服務行業深度轉型期&#xff0c;創客匠人通過 “工具 陪跑 圈層” 的三維服務體系&#xff0c;構建了從 IP 定位到商業變現的完整賦能鏈條。這套經過 5 萬 知識博主驗證的模型&#xff0c;不僅解決了 “內容生產 - 流量獲取 - 用戶轉化” 的實操難題&#xff0c;更推動…

國產ARM/RISCV與OpenHarmony物聯網項目(六)SF1節點開發

一、終端節點功能設計 1. 功能說明 終端節點設計的是基于鴻蒙操作系統的 TCP 服務器程序&#xff0c;用于監測空氣質量并提供遠程控制功能。與之前的光照監測程序相比&#xff0c;這個程序使用 E53_SF1 模塊&#xff08;煙霧 / 氣體傳感器&#xff09;&#xff0c;主要功能包…

Plotly圖表全面使用指南 -- Displaying Figures in Python

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 在 Python 中顯示圖形 使用 Plotly 的 Python 圖形庫顯示圖形。 顯示圖形 Plotly的Python圖形庫plotly.py提供了多種顯示圖形的選項和方法…

getx用法詳細解析以及注意事項

源碼地址 在 Flutter 中&#xff0c;Get 是來自 get 包的一個輕量級、功能強大的狀態管理與路由框架&#xff0c;常用于&#xff1a; 狀態管理路由管理依賴注入&#xff08;DI&#xff09;Snackbar / Dialog / BottomSheet 管理本地化&#xff08;多語言&#xff09; 下面是 …

深度學習:人工神經網絡基礎概念

本文目錄&#xff1a; 一、什么是神經網絡二、如何構建神經網絡三、神經網絡內部狀態值和激活值 一、什么是神經網絡 人工神經網絡&#xff08;Artificial Neural Network&#xff0c; 簡寫為ANN&#xff09;也簡稱為神經網絡&#xff08;NN&#xff09;&#xff0c;是一種模仿…

Unity2D 街機風太空射擊游戲 學習記錄 #12環射道具的引入

概述 這是一款基于Unity引擎開發的2D街機風太空射擊游戲&#xff0c;筆者并不是游戲開發人&#xff0c;作者是siki學院的涼鞋老師。 筆者只是學習項目&#xff0c;記錄學習&#xff0c;同時也想幫助他人更好的學習這個項目 作者會記錄學習這一期用到的知識&#xff0c;和一些…

網站如何啟用HTTPS訪問?本地內網部署的https網站怎么在外網打開?

在互聯網的世界里&#xff0c;數據安全已經成為了每個網站和用戶都不得不面對的問題。近期&#xff0c;網絡信息泄露事件頻發&#xff0c;讓越來越多的網站開始重視起用戶數據的安全性&#xff0c;因此啟用HTTPS訪問成為了一個熱門話題。作為一名網絡安全專家&#xff0c;我希望…

計算機網絡-----詳解網絡原理TCP/IP(上)

文章目錄 &#x1f4d5;1. UDP協議??1.1 UDP的特點??1.2 基于UDP的應用層協議 &#x1f4d5;2. TCP協議??2.1 TCP協議段格式??2.2 TCP協議特點之確認應答??2.3 TCP協議特點之超時重傳??2.4 TCP協議特點之連接管理??2.5 TCP協議特點之滑動窗口??2.6 TCP協議特點…

Lora訓練

一種大模型高效訓練方式&#xff08;PEFT&#xff09; 目標&#xff1a; 訓練有限的ΔW&#xff08;權重更新矩陣&#xff09; ΔW為低秩矩陣→ΔWAB&#xff08;其中A的大小為dr, B的大小為rk&#xff0c;且r<<min(d,k)&#xff09;→ 原本要更新的dk參數量大幅度縮減…

藍牙 5.0 新特性全解析:傳輸距離與速度提升的底層邏輯(面試寶典版)

藍牙技術自 1994 年誕生以來,已經經歷了多次重大升級。作為當前主流的無線通信標準之一,藍牙 5.0 在 2016 年發布后,憑借其顯著的性能提升成為了物聯網(IoT)、智能家居、可穿戴設備等領域的核心技術。本文將深入解析藍牙 5.0 在傳輸距離和速度上的底層技術邏輯,并結合面試…