前言

中华文化博大精深,尤其是中国古诗词。其中,有关古诗的、可以随时与人玩的游戏无非就是飞花令了。这段时间,我迷上了与某爱玩飞花令,奈何机器的诗库总是强大的,人脑总不可能战胜,于是便突发奇想用 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 的判断是为了辨别此为诗而非赏析。

后记

上文中仅对该程序添加了多诗库的功能,而暂未说明对于代码的优化,如线程间的调度,以及判断机制和诗库的选择。
这些内容稍后我会继续写博客来交流的~
最后,希望如果有人中找到了更有特色、更规范的诗库,欢迎评论区分享出来~ 下一篇我会尽快做的!

多线程实现飞花令-多诗库版相关推荐

  1. python写一个飞花令程序

    近日,中国诗词大会第六季正在播出,我写了一个飞花令程序,好在飞花令环节上插个手. 在我的寻找之下,找到了这个网站:古诗文网. 在名句部分下,可搜索名句,可满足飞花令的要求. 搜索名句,得到的网址很有规 ...

  2. 超详细,手把手教你用20行Python代码制作飞花令小程序!

    大家好,我是涛哥. 飞花令是古时候人们经常玩一种"行酒令"的游戏,是中国古代酒令之一,属雅令."飞花"一词则出自唐代诗人韩翃<寒食>中 春城无处不飞 ...

  3. 手把手教你用20行Python代码制作飞花令小程序!

    飞花令是古时候人们经常玩一种"行酒令"的游戏,是中国古代酒令之一,属雅令."飞花"一词则出自唐代诗人韩翃<寒食>中 春城无处不飞花 一句.行飞花令时 ...

  4. python做出来的小程序、可以在win10上面运行_超详细,手把手教你用20行Python代码制作飞花令小程序!...

    原标题:超详细,手把手教你用20行Python代码制作飞花令小程序! 来源:早起Python 作者:陈熹 飞花令是古时候人们经常玩一种"行酒令"的游戏,是中国古代酒令之一,属雅令. ...

  5. 多线程编程学习笔记——任务并行库(二)

    接上文 多线程编程学习笔记--任务并行库(一) 三.   组合任务 本示例是学习如何设置相互依赖的任务.我们学习如何创建一个任务的子任务,这个子任务必须在父任务执行结束之后,再执行. 1,示例代码如下 ...

  6. 多线程编程学习笔记——任务并行库(三)

    接上文 多线程编程学习笔记--任务并行库(一) 接上文 多线程编程学习笔记--任务并行库(二) 六.   实现取消选项 本示例学习如何实现基于Task的异步操作进行取消流程,以及在任务真正运行前如何知 ...

  7. 计算机应用能力power,全国专业技术人员计算机应用能力考试专用教材——PowerPoint 2003中文演示文稿5日通题库版(双色)(附光盘) - 中国考研网...

    图书简介 由全国专业技术人员计算机应用能力考试专家委员会编著的<PowerPoint2003中文演示文稿5日通题库版>紧扣考试大纲,明确考试要点 本章考点:根据教育部最新大纲编写,使读者更 ...

  8. 全国专业技术人员计算机应用能力考试word2003题库版,全国专业技术人员计算机应用能力考试word2003...

    全国专业技术人员计算机应用能力考试word2003 Word2003题库版 一.Word2003基础: 1.要求:⑴利用开始菜单打开WORD:开始→所有程序→Microsoft office word ...

  9. 最简单的基于FFmpeg的移动端例子:Android 视频解码器-单个库版

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

  10. 博大考神》2006版之Word2003题库版操作提示

    <博大考神>2006版之Word2003题库版操作提示 作者:- <script src="http://www.2008red.com/red_vip/articlehi ...

最新文章

  1. 中国计算机与信息服务贸易,中国计算机与信息服务贸易国际竞争力研究
  2. C# 整数与字符串拼接之间的装箱操作
  3. IP地址,子网掩码、默认网关,DNS服务器是什么意思
  4. Spring中使用JDBC
  5. JqueryMobile学习之二---对话框
  6. CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88...
  7. Python学习入门10:零基础如何开始学习 Python?从小白变大牛!
  8. 使用Docker部署SpringBoot
  9. 初始C语言——完数问题
  10. java 中文转英文性能最快
  11. IPv6规模部署及专项督查工作全国电视电话会议
  12. 酒越陈越醇,OPPO Reno越更越香
  13. 02自定义面板区附加功能模块及清单编写
  14. 前端三件套之JS速成
  15. 2023年渗透测试都需要学习哪些内容?
  16. 数据告诉你:中国足球还有理论性出线的可能吗?
  17. 强生稳豪倍优型血糖仪试纸_强生稳豪倍优型血糖仪(送50片试纸)
  18. 程序猿光棍节闯关游戏
  19. 在matlab中如何编码信道增益,五通信算法:五种编码增益比较matlab模拟
  20. 创业者需要的哪些优秀品质?

热门文章

  1. MySQL中文乱码解决方案
  2. 自动化运维工具ansible安装及使用
  3. 微信小程序 有赞UI关于Tab 标签页的坑
  4. 极域课堂管理系统软件V6.0 2016 豪华版
  5. html5 css 字体加粗,HTML和CSS实现字体加粗的三种方法
  6. android webview capturepicture,Android WebView 调用系统拍照和相册
  7. USB3.0 Micro-B引脚定义和封装尺寸
  8. 项目管理-PMP-第4章 项目范围管理
  9. shader基础学习摘要(一)
  10. jenkins+donet core持续集成环境搭建