前言

中华文化博大精深,尤其是中国古诗词。其中,有关古诗的、可以随时与人玩的游戏无非就是飞花令了。这段时间,我迷上了与某爱玩飞花令,奈何机器的诗库总是强大的,人脑总不可能战胜,于是便突发奇想用 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. Windows启动exe应用程序,无法正常启动(0xc000007b)的解决办法
  2. Spring原理总结
  3. UA MATH563 概率论的数学基础 中心极限定理10 Borel-Cantelli引理
  4. 用好 Java 中的枚举,真的没有那么简单!
  5. GDCM:gdcm::ImageFragmentSplitter的测试程序
  6. 技术管理规划-路径跟资源
  7. Execute SQL Task 参数和变量的映射
  8. xrdp完美实现Windows远程访问Ubuntu 16.04
  9. MySQL中distinct和group by性能比较
  10. 为什么MySQL不建议使用NULL作为列默认值?
  11. c# npoi 公式不计算_玉米扣量因素:水分、杂质、不完善粒、生霉粒,检测方法及计算公式...
  12. 组合数学引论部分习题答案
  13. 几款电子教室软件推荐
  14. java计算机毕业设计服装连锁店后台管理系统MyBatis+系统+LW文档+源码+调试部署
  15. javassist使用指南
  16. Electron-forge使用实战
  17. QQ空间内容批量删除脚本
  18. Java算法之 循序搜寻法
  19. Speedoffice(word)如何插入文字水印
  20. Arch Linux fcitx 新世纪五笔配置

热门文章

  1. 致远互联发布的智慧协同新一代企业管理平台,新在哪里?
  2. iOS客户端安装包大小优化
  3. 【渗透测试】编辑器漏洞
  4. aplay与call
  5. Matlab画曲线的切向量-quiver函数的应用
  6. 实对称矩阵一定可以对角化
  7. JAVA - Quartz 定时任务_启动原理
  8. win10系统计算机物理地址,Win10如何修改物理地址?Win10修改网卡物理地址(MAC)的两种方法...
  9. 创新工场 蔡学镛SINA微博中向我们提及的书籍、文章统计 (二)
  10. ArcCatalog导出数据