用python实现背单词的小脚本系统
python
前提準(zhǔn)備
注: 前提準(zhǔn)備部分的內(nèi)容不做描述,百度均有教程
步驟:
第一步:在oracle中創(chuàng)建以下表:
下面展示 建表語(yǔ)句。
--ID_FLAG表是用以記錄單詞進(jìn)度 create table ID_FLAG (id_value NUMBER(5),insert_time VARCHAR2(50) )-- EXAM_FUN2表用以記錄模塊2中測(cè)驗(yàn)的結(jié)果 create table EXAM_FUN2 (id NUMBER(5),word VARCHAR2(100),chinese_value VARCHAR2(1024),insert_time VARCHAR2(50),isright VARCHAR2(10) )-- ALL_WORDS表是單詞的記錄儲(chǔ)存表 create table ALL_WORDS (id NUMBER(5) not null,word VARCHAR2(100),chinese_value VARCHAR2(1024) )-- -- 這是用以儲(chǔ)存自已寫(xiě)的例句表 create table EXAMPLE_SENTENCE_TABLE (id_scope VARCHAR2(10),example_sentence VARCHAR2(500),insert_time VARCHAR2(50) )第二步:運(yùn)行腳本向數(shù)據(jù)庫(kù)中導(dǎo)入文件里的單詞數(shù)據(jù)
下面這個(gè)是單詞的txt文件:
鏈接: https://pan.baidu.com/s/1Ga2sHQJrpg3LGvLDt_i4vQ?pwd=1234
這是導(dǎo)入數(shù)據(jù)庫(kù)的腳本代碼:
注:代碼中的數(shù)據(jù)庫(kù)賬號(hào)密碼端口以及文件路徑等信息需要自行修改。
出現(xiàn)以下顯示時(shí)表明數(shù)據(jù)插入完成。
注:其實(shí)若愿意的話,也可以將前面的建表語(yǔ)句放到后面的數(shù)據(jù)插入腳本中一次性執(zhí)行,寫(xiě)個(gè)str字符串,將sql放進(jìn)去后,用ora.execute(str)執(zhí)行后再將其commit即可,此處沒(méi)寫(xiě)進(jìn)去是因?yàn)樵趐lsql中用習(xí)慣了,方便修改。
數(shù)據(jù)插入完成后,便可以執(zhí)行以下python腳本了
import cx_Oracle as cx import randomdef condba():global connusername = 'briup'password = 'briup'host = '127.0.0.1:1521/XE'conn = cx.connect(username,password,host)cursor = conn.cursor()return cursor'''分4種模式:1.第一種按順序五個(gè)五個(gè)出現(xiàn)word和cv ,可以輸入數(shù)字5嘗試寫(xiě)例句用以加強(qiáng)記憶2.第二種里共有三種測(cè)試方式,前兩種只出現(xiàn)翻譯,填寫(xiě)word,并進(jìn)行檢測(cè)是否匹配,第1中是每15個(gè)進(jìn)行一次檢測(cè),第2種是從開(kāi)頭一直檢測(cè)到已學(xué)部分,第3種是有單詞有翻譯,進(jìn)行選擇,所有檢測(cè)的結(jié)果會(huì)記錄在表exam_fun2中3.第三種將所有false的進(jìn)行再次復(fù)習(xí)與測(cè)驗(yàn),1是進(jìn)行復(fù)習(xí),2是對(duì)二模式中測(cè)驗(yàn)錯(cuò)誤的進(jìn)行再次測(cè)驗(yàn),若對(duì)了會(huì)更新記錄4.將復(fù)習(xí)的表進(jìn)行重置 --保留表中id = 1的值,方便重置后方法的運(yùn)行,一切重新開(kāi)始 '''def fun1(ora):count = 1print('您已選擇第一種模式:')id_sql = "select * from (select * from id_flag order by id_value desc) where rownum = 1"ora.execute(id_sql)result = ora.fetchall()#print(result[0][0])order = '0' #'0'繼續(xù)學(xué)習(xí),stop()結(jié)束學(xué)習(xí)id = result[0][0] #讀取數(shù)據(jù)庫(kù)中表id_flag中最后一次記錄的id值while id <= 5384:if(count == 4):print('已滿15個(gè),是否進(jìn)行一次測(cè)驗(yàn)? Y/N')isCheck = input('請(qǐng)輸入:')while isCheck:if isCheck == 'Y':exam3(ora)break elif isCheck == 'N':print('繼續(xù)學(xué)習(xí)')breakelse:print('請(qǐng)不要輸入除了Y或N以外的內(nèi)容:')isCheck = input('請(qǐng)輸入:')count = 1 if order == 'stop()':breakelif order == '5':print('請(qǐng)寫(xiě)您的例句:',end='')example_sentence = input()id_str = '%d~%d' % (id-5,id)ex_sql = "insert into example_sentence_table values('%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'))" % (id_str,example_sentence);ora.execute(ex_sql)conn.commit()elif order == '0':print('===========================分隔符===========================')count = count + 1strsql = "select word,chinese_value from all_words where id >= %d and id < %d" % (id,id+5)#print(strsql) ora.execute(strsql)strsql_result = ora.fetchall()for v in strsql_result:#print(v[1])a ="%s : %s" % (v[0],v[1])print(a)else:print('請(qǐng)輸入正確的指令!') insertId_sql = "insert into id_flag values(%d,to_char(sysdate,'yyyymmdd hh24:mi:ss'))" % (id)ora.execute(insertId_sql)conn.commit() #每學(xué)習(xí)一次就要記錄一次,方便方法2在測(cè)驗(yàn)的時(shí)候進(jìn)行讀取id范圍id = id+5print('請(qǐng)輸入指令:--stop()--退出,--5--自寫(xiě)例句,--0--下一個(gè)')print('===========================分隔符===========================')order = input('請(qǐng)輸入:')print('第一種模式結(jié)束')#2.第二種只出現(xiàn)cv,填寫(xiě)word,并進(jìn)行檢測(cè)是否匹配,從id_flag表中讀取id進(jìn)行 def fun2(ora):print('*******模塊2測(cè)驗(yàn)開(kāi)始*******')print('**********分界線************')print('請(qǐng)輸入數(shù)字1對(duì)已學(xué)進(jìn)行階段測(cè)驗(yàn)')print('請(qǐng)輸入數(shù)字2對(duì)已學(xué)進(jìn)行全面測(cè)驗(yàn)')print('請(qǐng)輸入數(shù)字3對(duì)已學(xué)進(jìn)行新的測(cè)驗(yàn)')print('**********分界線************')print('請(qǐng)輸入一個(gè)數(shù)字或輸入quit退出:')num = input('請(qǐng)輸入:')while num != 'quit':if num == '1': exam1(ora)elif num == '2':exam2(ora)elif num == '3':exam3(ora)else : print('輸入有誤!')print('**********分界線************')print('請(qǐng)輸入數(shù)字1對(duì)已學(xué)進(jìn)行階段測(cè)驗(yàn)')print('請(qǐng)輸入數(shù)字2對(duì)已學(xué)進(jìn)行全面測(cè)驗(yàn)')print('請(qǐng)輸入數(shù)字3對(duì)已學(xué)進(jìn)行新的測(cè)驗(yàn)')print('**********分界線************')print('請(qǐng)輸入一個(gè)數(shù)字或輸入quit退出:')num = input('請(qǐng)輸入:') print('*****階模塊2測(cè)驗(yàn)結(jié)束*****')def exam1(ora):print('*****階段性測(cè)驗(yàn)開(kāi)始*****')str_sql = "select min(id_value),max(id_value) from (select * from id_flag order by id_value desc) where rownum < 5 order by 1" #讀取記錄表中的最后兩條記錄的id值ora.execute(str_sql)result = ora.fetchall()#print(result)id1 = result[0][0]id2 = result[0][1]str_sql2 = "select * from all_words where id >= %d and id <= %d" % (id1,id2+5)#print(str_sql2)ora.execute(str_sql2)sql2_cv = ora.fetchall()#print(sql2_cv)for t in sql2_cv:print(t[2])print('請(qǐng)輸入對(duì)應(yīng)的word值:')word = input('請(qǐng)輸入:')if(word == t[1]):sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'true')" % (t[0],t[1],t[2])print('correct!')else:sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'false')" % (t[0],t[1],t[2])print('wrong! the correct answer is :'+ t[1])#print(sql_check)print('**********************分隔符*****************************')ora.execute(sql_check)conn.commit()print('*****階段性測(cè)驗(yàn)結(jié)束*****')def exam2(ora):print('*****整體測(cè)驗(yàn)開(kāi)始*****')str_sql2 = "select * from all_words where id <= (select max(id_value) from id_flag a)"#print(str_sql2)ora.execute(str_sql2)sql2_cv = ora.fetchall()#print(sql2_cv)for t in sql2_cv:print(t[2])print('請(qǐng)輸入對(duì)應(yīng)的word值:')word = input('請(qǐng)輸入:')if(word == t[1]):sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'true')" % (t[0],t[1],t[2])print('correct!')else:sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'false')" % (t[0],t[1],t[2])print('wrong! the correct answer is :'+ t[1])#print(sql_check)print('**********************分隔符*****************************')ora.execute(sql_check)conn.commit()print('*****整體測(cè)驗(yàn)結(jié)束*****')def exam3(ora):print('*****選漢語(yǔ)測(cè)驗(yàn)開(kāi)始*****')str_sql = "select min(id_value),max(id_value) from (select * from id_flag order by id_value desc) where rownum < 5 order by 1" #讀取記錄表中的最后兩條記錄的id值ora.execute(str_sql)result = ora.fetchall()#print(result)id1 = result[0][0]id2 = result[0][1]str_sql2 = "select * from all_words where id >= %d and id <= %d" % (id1,id2) #獲取最后兩個(gè)id值#print(str_sql2)ora.execute(str_sql2)sql2_cv = ora.fetchall()#print(sql2_cv)value = {} #將單詞和翻譯放在字典中value2 = [] #但翻譯放在字典中并序號(hào),方便下面抽取for t in sql2_cv:value[t[1]] = t[2] # 將這十幾個(gè)里面抽取三個(gè),與當(dāng)前選擇的值放在一起組成選項(xiàng)value2.append(t[2])#print(random.sample(value2, 3))temp = []new_temp = []for t in sql2_cv:temp = value2.copy() #將所有的翻譯給復(fù)制到一個(gè)臨時(shí)列表temp中temp.remove(t[2]) #這臨時(shí)列表中將當(dāng)前的單詞翻譯刪掉new_temp = random.sample(temp,3) #在沒(méi)有當(dāng)前翻譯的剩下值中隨機(jī)篩選3個(gè)組成新的列表new_temp.append(t[2]) #將當(dāng)前單詞的翻譯添加進(jìn)去new_temp = random.sample(new_temp,len(new_temp)) #再將組好的這個(gè)新列表進(jìn)行隨機(jī)排列print(t[1])count = 1for ft in new_temp:print(count,end='')print(' : ',end='')print(ft)count = count + 1 print('請(qǐng)從上列選項(xiàng)中選擇對(duì)應(yīng)的選項(xiàng):')num = input('請(qǐng)輸入選項(xiàng)(1~4)或者quit退出:')flag = 1while flag == 1 and num != 'quit':num = int(num) - 1if num >= 0 and num <= 3 :flag = 0else:print('您輸入的值不在1~4之間,請(qǐng)重新輸入!')num = input('請(qǐng)輸入選項(xiàng)(1~4)或者quit退出:')#num = int(num) - 1if num == 'quit':breakelif(new_temp[num] == t[2]):sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'true')" % (t[0],t[1],t[2])print('correct!')else:sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'false')" % (t[0],t[1],t[2])print('wrong! the correct answer is :')print(t[2])#print(sql_check)print('**********************分隔符*****************************')ora.execute(sql_check)conn.commit()print('*****選漢語(yǔ)測(cè)驗(yàn)結(jié)束*****')def fun3(ora):print('*****錯(cuò)重復(fù)習(xí)開(kāi)始*****')err_sql = " select count(*) \from exam_fun2 a ,(select word,max(insert_time) as max_time from exam_fun2 group by word) b \where a.word = b.word \and a.insert_time = b.max_time \and a.isright = 'false'\order by insert_time desc "ora.execute(err_sql)err_count = ora.fetchall()print('**********分界線************')if err_count:print('已積累錯(cuò)誤個(gè)數(shù):',end='')print(err_count[0][0])print('請(qǐng)輸入數(shù)字1對(duì)錯(cuò)誤進(jìn)行再次復(fù)習(xí)')print('請(qǐng)輸入數(shù)字2對(duì)復(fù)習(xí)進(jìn)行再次測(cè)驗(yàn)')print('**********分界線************')print('請(qǐng)輸入選擇或者quit退出:')num = input('請(qǐng)輸入:')while num != 'quit':if num == '1':print('**********分界線************')print('您輸入的是1,開(kāi)始對(duì)錯(cuò)誤進(jìn)行復(fù)習(xí)')str_sql = " select a.* \from exam_fun2 a ,(select word,max(insert_time) as max_time from exam_fun2 group by word) b \where a.word = b.word \and a.insert_time = b.max_time \and a.isright = 'false'\order by insert_time desc " #讀取測(cè)驗(yàn)表中的測(cè)驗(yàn)錯(cuò)誤的單詞ora.execute(str_sql)result = ora.fetchall()for v in result:a ="%s : %s" % (v[1],v[2])print(a)print('**********分界線************')elif num == '2':print('**********分界線************')print('您輸入的是2,開(kāi)始對(duì)錯(cuò)誤進(jìn)行檢驗(yàn)')str_sql = " select a.* \from exam_fun2 a ,(select word,max(insert_time) as max_time from exam_fun2 group by word) b \where a.word = b.word \and a.insert_time = b.max_time \and a.isright = 'false'\order by insert_time desc "#print(str_sql)ora.execute(str_sql)sql_cv = ora.fetchall()#print(sql_cv)for t in sql_cv:print(t[2])print('請(qǐng)輸入對(duì)應(yīng)的word值:')word = input('請(qǐng)輸入:')if(word == t[1]):sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'true')" % (t[0],t[1],t[2])print('correct!')else:sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'false')" % (t[0],t[1],t[2])print('wrong! the correct answer is :'+ t[1])#print(sql_check)print('**********分界線************')ora.execute(sql_check)conn.commit()else:print('輸入有誤,請(qǐng)重新輸入!')print('**********分界線************')print('請(qǐng)輸入數(shù)字1對(duì)錯(cuò)誤進(jìn)行再次復(fù)習(xí)')print('請(qǐng)輸入數(shù)字2對(duì)復(fù)習(xí)進(jìn)行再次測(cè)驗(yàn)')print('**********分界線************')print('請(qǐng)輸入數(shù)字選擇或者quit退出:')num = input('請(qǐng)輸入:') print('*****錯(cuò)重復(fù)習(xí)結(jié)束*****')def fun4(ora):delete_exam_fun2 = 'delete from exam_fun2 where id > 1'delete_id_flag = 'delete from id_flag where id_value > 1'ora.execute(delete_exam_fun2)ora.execute(delete_id_flag)conn.commit()print('表中記錄已重置')if __name__ == '__main__':ora = condba()print("*****請(qǐng)輸入指令1或者2或者3或者4,輸入exit()退出:*****")print('1. 開(kāi)始學(xué)習(xí)單詞')print('2. 來(lái)一次小測(cè)驗(yàn)')print('3. 復(fù)習(xí)一下上次測(cè)驗(yàn)的錯(cuò)誤')print('4. 記錄重置')print("********************分界線*********************")print('請(qǐng)輸入一個(gè)選項(xiàng):')str = input('請(qǐng)輸入:')while str != 'exit()':#print(str)if str == '1':fun1(ora)elif str == '2':fun2(ora)elif str == '3':fun3(ora)elif str == '4':fun4(ora)else:print('您輸入的選項(xiàng)無(wú)效,請(qǐng)重新輸入!')str = input('請(qǐng)輸入:')continueprint("*****請(qǐng)輸入指令1或者2或者3或者4,輸入exit()退出:*****")str = input('請(qǐng)輸入:')print('bye')conn.close()這里一共寫(xiě)了四個(gè)小功能,分為1,2,3,4四個(gè)選項(xiàng):
第一個(gè)功能是直接顯示單詞與翻譯,每五個(gè)為一組,按0進(jìn)行下一組,按5可以對(duì)當(dāng)前的單詞自寫(xiě)例句,例句會(huì)保存在表EXAMPLE_SENTENCE_TABLE中。滿15個(gè)就進(jìn)行一次小測(cè)驗(yàn),結(jié)果無(wú)論對(duì)錯(cuò)都會(huì)將其記錄在表exam_fun2中,方便后面進(jìn)行復(fù)習(xí)和再檢測(cè),輸入stop()進(jìn)行退出第一種模式。
第二個(gè)功能是測(cè)驗(yàn)功能,分三種:
第一種其實(shí)就是在1模式中的小測(cè)驗(yàn),第二種是從第一個(gè)單詞一直到你所學(xué)的單詞為止全部進(jìn)行一次測(cè)驗(yàn)。這前兩種都是根據(jù)翻譯寫(xiě)單詞,第三種是根據(jù)單詞選擇翻譯,有四種選項(xiàng),正確答案是其中的一個(gè)。
第三個(gè)功能是將前面測(cè)驗(yàn)錯(cuò)誤的進(jìn)行重新學(xué)習(xí)與測(cè)驗(yàn),當(dāng)重新測(cè)驗(yàn)正確后,再下次學(xué)習(xí)錯(cuò)誤單詞時(shí)便不會(huì)再計(jì)入內(nèi)。
第四個(gè)功能是將所有學(xué)習(xí)過(guò)的記錄,或者錯(cuò)誤的記錄全部清除掉,一切重新開(kāi)始,因此便可以進(jìn)行重復(fù)學(xué)習(xí)
自此便是全部的功能,后續(xù)還將添加閱讀題,以及對(duì)應(yīng)的題目講解等功能。
注:本腳本的編寫(xiě)環(huán)境均由vscode所實(shí)現(xiàn)。
總結(jié)
以上是生活随笔為你收集整理的用python实现背单词的小脚本系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ryzen linux 搭配显卡,锐龙R
- 下一篇: python实现自动抠图