多线程实现飞花令-多诗库版
前言
中华文化博大精深,尤其是中国古诗词。其中,有关古诗的、可以随时与人玩的游戏无非就是飞花令了。这段时间,我迷上了与某爱玩飞花令,奈何机器的诗库总是强大的,人脑总不可能战胜,于是便突发奇想用 Python 写了个飞花令的程序,现与大家分享一下~
飞花令查询
项目代码
该程序代码已共享在 GitHub 上,参见链接
https://github.com/PythonSimon/FlyingFlowerOrder.git
实现过程
下载诗库
由于该程序是支持多诗库(常用 ,较全)的,所以需要用到两个词库:
常用诗库(1万句)
较全诗库(7万首)
,可自行下载。
初始化目录
因考虑到可读性,该项目在 GitHub 上的诗库被单独放在了 Resource 文件夹中。但方便起见,该文章里的代码都是依据同路径下编写的。所以,如果只是为了试验实例中的代码,将文件放在同目录下即可。
编写代码
导入 threading
考虑到诗库中的诗词量较大,所以对于词库的处理与对诗句的检测两个任务采用多线程实现。
# Main.pyfrom thereading import *def thread1():passdef thread2():passwriter = Thread(thread1)
reader = Thread(thread)writer.start()
checker.start()
上述代码导入了 threading 多线程模块,并在创建两个线程的函数之后将函数实例化为线程对象,最后依次运行线程。
实现格式转换线程
由于下载的诗词库未经处理(别问为啥,就是懒),所以 thread1 是用来转换格式,并将可以直接使用的诗句写入全局变量中。首先,创建一个列表(全局):
# Main.pypoems = []
接下来,就要着手 thread1 线程的编写了。
代码如下:
# Main.pydef thread1():gloal poemswith open("Poems。txt", "utf-8") as poeemsFile:poemsString = poemsFile..read()for line in poemsString.split("\t"):line = line.split("\t")if len(line[0]) >= 5:poems.append(sentence)
上述代码,首先在 thread1 函数首声明 poems 为全局变狼(该程序中也可以不用声明,但为可读性与日后编辑的方便,此处加上了 global 声明),然后打开文件(较全的那个)并读取其内容,而后遍历时通过一定规则将诗句写入列表。
这里需要注意的是 if len( ...
一行有一处对于诗句长短的判断,主要因为该诗库本是个五笔词库,其中包含诗题,故加上此判断。
实现飞花令查询线程
完成了 thread1 的编写, thread2 查询线程的编写也是必不可少的。照例,代码如下。
# Main.pydef thread2():word = input("""请输入飞花令汉字:")deal = 0for poem in poems:if word in poem:deal += 1print(poem)print(f"\n共 {deal} 首诗!")
这段代码其实没什么特殊的,就是遍历诗的列表并检测、打印符合规则的诗句。其中的 deal 记录着查询到的诗句。
程序优化
一个很简易的飞花令就是这样了。但是,程序还有许多地方可以优化,也可以加入一些新功能——也就是本文题目所述的多诗库。那么接下来,先一步步的加入这个功能。
规范命名、添加参数
为区分两个诗库,首先将两个诗库文件的命名规范化:
常用 诗库: CommonLibrary.txt
较全诗库: FullLibrary.txt
然后,为了线程中调用方便,添加两个常量
# Main.pyCOMMON = 1
FULL = 2
再向 thread1 函数添加参数 library
# Main.pydef thread1(library):...
最后在实例化时传参
# Main.pywriter = Thread(thread1, args=(COMMON, )
至此,准备工作完成。
而控制所用诗库的,通过 args 元组的元素修改。
编写代码
这里先把代码放出来,与前一个类似,可以自行理解:
# Main.py
def thread1(library):global poemsif library == COMMON:with open("CommonLibrary.txt", encoding="utf-8") as poemsFile:poemsString = poemsFile.read()for line in poemsString.split("\n"):line = line.split("\t")if len([0]) >= 5:poems.append(line[0])elif library == FULL:with open("FullLibrary.txt", encoding="utf-8") as poemsFile:poemsString = poemsFile.read()for poem in poemsString.split("\n\n"):poem = poem.split("\n")if len(poem[3]) <= 128:poems += poem[3].split("。")[: -1]
仅说明一点,对于 <= 128
的判断是为了辨别此为诗而非赏析。
后记
上文中仅对该程序添加了多诗库的功能,而暂未说明对于代码的优化,如线程间的调度,以及判断机制和诗库的选择。
这些内容稍后我会继续写博客来交流的~
最后,希望如果有人中找到了更有特色、更规范的诗库,欢迎评论区分享出来~ 下一篇我会尽快做的!
多线程实现飞花令-多诗库版相关推荐
- python写一个飞花令程序
近日,中国诗词大会第六季正在播出,我写了一个飞花令程序,好在飞花令环节上插个手. 在我的寻找之下,找到了这个网站:古诗文网. 在名句部分下,可搜索名句,可满足飞花令的要求. 搜索名句,得到的网址很有规 ...
- 超详细,手把手教你用20行Python代码制作飞花令小程序!
大家好,我是涛哥. 飞花令是古时候人们经常玩一种"行酒令"的游戏,是中国古代酒令之一,属雅令."飞花"一词则出自唐代诗人韩翃<寒食>中 春城无处不飞 ...
- 手把手教你用20行Python代码制作飞花令小程序!
飞花令是古时候人们经常玩一种"行酒令"的游戏,是中国古代酒令之一,属雅令."飞花"一词则出自唐代诗人韩翃<寒食>中 春城无处不飞花 一句.行飞花令时 ...
- python做出来的小程序、可以在win10上面运行_超详细,手把手教你用20行Python代码制作飞花令小程序!...
原标题:超详细,手把手教你用20行Python代码制作飞花令小程序! 来源:早起Python 作者:陈熹 飞花令是古时候人们经常玩一种"行酒令"的游戏,是中国古代酒令之一,属雅令. ...
- 多线程编程学习笔记——任务并行库(二)
接上文 多线程编程学习笔记--任务并行库(一) 三. 组合任务 本示例是学习如何设置相互依赖的任务.我们学习如何创建一个任务的子任务,这个子任务必须在父任务执行结束之后,再执行. 1,示例代码如下 ...
- 多线程编程学习笔记——任务并行库(三)
接上文 多线程编程学习笔记--任务并行库(一) 接上文 多线程编程学习笔记--任务并行库(二) 六. 实现取消选项 本示例学习如何实现基于Task的异步操作进行取消流程,以及在任务真正运行前如何知 ...
- 计算机应用能力power,全国专业技术人员计算机应用能力考试专用教材——PowerPoint 2003中文演示文稿5日通题库版(双色)(附光盘) - 中国考研网...
图书简介 由全国专业技术人员计算机应用能力考试专家委员会编著的<PowerPoint2003中文演示文稿5日通题库版>紧扣考试大纲,明确考试要点 本章考点:根据教育部最新大纲编写,使读者更 ...
- 全国专业技术人员计算机应用能力考试word2003题库版,全国专业技术人员计算机应用能力考试word2003...
全国专业技术人员计算机应用能力考试word2003 Word2003题库版 一.Word2003基础: 1.要求:⑴利用开始菜单打开WORD:开始→所有程序→Microsoft office word ...
- 最简单的基于FFmpeg的移动端例子:Android 视频解码器-单个库版
===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...
- 博大考神》2006版之Word2003题库版操作提示
<博大考神>2006版之Word2003题库版操作提示 作者:- <script src="http://www.2008red.com/red_vip/articlehi ...
最新文章
- Windows启动exe应用程序,无法正常启动(0xc000007b)的解决办法
- Spring原理总结
- UA MATH563 概率论的数学基础 中心极限定理10 Borel-Cantelli引理
- 用好 Java 中的枚举,真的没有那么简单!
- GDCM:gdcm::ImageFragmentSplitter的测试程序
- 技术管理规划-路径跟资源
- Execute SQL Task 参数和变量的映射
- xrdp完美实现Windows远程访问Ubuntu 16.04
- MySQL中distinct和group by性能比较
- 为什么MySQL不建议使用NULL作为列默认值?
- c# npoi 公式不计算_玉米扣量因素:水分、杂质、不完善粒、生霉粒,检测方法及计算公式...
- 组合数学引论部分习题答案
- 几款电子教室软件推荐
- java计算机毕业设计服装连锁店后台管理系统MyBatis+系统+LW文档+源码+调试部署
- javassist使用指南
- Electron-forge使用实战
- QQ空间内容批量删除脚本
- Java算法之 循序搜寻法
- Speedoffice(word)如何插入文字水印
- Arch Linux fcitx 新世纪五笔配置