原标题:用 Python 编写中国历史知识库,此时不用中文命名变量更待何时?

早先想做个以中国历史为背景的小游戏,但苦于没找到现成已结构化的历史数据。理想中的需要有人物(包括基本信息、人物关系)、事件(包括时间、地点)等等。

加上后来想尝试将少儿编程与传统学科(尤其是文科)结合起来,于是试着用 Python 代码记录历史数据并提供查询功能。有几个优势:

数据是纯文本格式, 易于合作编辑

易于扩展和重构, 相比数据库, 可以更方便地增减/修改数据之间的关系

编辑时可以借助IDE的自动补全, 语法错误等功能, 减少笔误

易于编写自动测试以保证一些基本检验规则, 比如朝代没有重合部分, 先辈出生日期肯定早于后辈, 等等.

易于直接使用数据进行分析:

比如这样:

Array.prototype.diff = function(a) {

return this.filter(function(i) {return a.indexOf(i) < 0;});

};

消失国家 = 国家所属时期[朝代.春秋].diff(国家所属时期[朝代.战国])

console.log("春秋消失的国家: " + JSON.stringify(消失国家))

可以输出:

春秋消失的国家: ["晋国","宋国","吴国","越国","鲁国"]

下面是 Python 源码, 仅作原型演示之用, 如果正式开始项目会采用更翔实的史实参考来源(如教材). 数据结构设计等等很不成熟, 请多指摘, 尤其是TODO部分.

注意:全部变量采用了中文命名,原因很简单,用的到这个代码的开发者必然会中文咯。

// 来源: 中国少儿百科全书-历史大观: 河姆渡文化-郑和下西洋

var 朝代 = Object.freeze({

新石器: "新石器时代",

东周: "东周",

春秋: "春秋时期",

战国: "战国时期",

秦: "秦朝",

西汉: "西汉",

东汉: "东汉",

三国: "三国时期",

隋: "隋朝",

唐: "唐朝",

元: "元朝",

明: "明朝"

});

var 社会类型 = Object.freeze({

氏族社会: "氏族社会",

母系社会: "母系社会"

});

// TODO: 添加地点关系, 如国-地区-省-市-镇, 以及行政区划改变(村->镇等)

var 地点 = Object.freeze({

浙江: "浙江省",

余姚: "余姚市",

河姆渡: "河姆渡文化",

长江下游: "长江下游地区",

黄河中游: "黄河中游地区",

陕西: "陕西省",

西安: "西安市",

半坡: "半坡遗址",

长安: "长安",

洛阳: "洛阳",

齐: "齐国",

晋: "晋国",

宋: "宋国",

秦: "秦国",

楚: "楚国",

吴_春秋: "吴国",

越: "越国",

燕: "燕国",

韩: "韩国",

赵: "赵国",

魏_战国: "魏国",

鲁: "鲁国",

匈奴: "匈奴",

大月氏: "大月氏",

西域: "西域",

官渡: "官渡",

赤壁: "赤壁",

魏_三国: "魏国",

蜀国: "蜀国",

吴_三国: "吴国",

吐蕃: "西藏",

蒙古: "蒙古国",

中亚: "中亚",

东欧: "东欧",

西洋: "东南亚和印度洋沿海"

});

// TODO: 更多人物信息, 如原名, 性别, 小名等等

var 人物 = Object.freeze({

周平王: "周平王",

齐桓公: "齐桓公",

晋文公: "晋文公",

宋襄公: "宋襄公",

秦穆公: "秦穆公",

楚庄王: "楚庄王",

吴王: "阖闾",

越王: "勾践",

孔子: "孔子",

老子: "老子",

墨子: "墨子",

孟子: "孟子",

秦王: "嬴政",

汉景帝: "汉景帝",

汉武帝: "刘彻",

卫青: "卫青",

霍去病: "霍去病",

张骞: "张骞",

袁绍: "袁绍",

袁术: "袁术",

曹操: "曹操",

孙坚: "孙坚",

刘备: "刘备",

孙权: "孙权",

曹丕: "曹丕",

汉献帝: "汉献帝",

唐太宗: "李世民",

李靖: "李靖",

尉迟恭: "尉迟恭",

李建成: "李建成",

魏征: "魏征",

文成公主: "文成公主",

松赞干布: "松赞干布",

武则天: "武则天",

唐高宗: "唐高宗",

成吉思汗: "铁木真",

忽必烈: "忽必烈",

郑和: "马和",

朱棣: "朱棣"

});

var 年号 = Object.freeze({

贞观: "贞观"

});

var 路线 = Object.freeze({

丝绸之路: "丝绸之路"

});

var 群体 = Object.freeze({

儒家: "儒家",

道家: "道家",

墨家: "墨家"

})

var 行为 = Object.freeze({

栽种: "栽种",

制作: "制作",

结婚: "结婚",

求教: "求教",

消灭: "消灭",

出使: "出使",

出击: "出击",

击败: "击败",

效力: "效力",

称帝: "称帝"

});

var 植物 = Object.freeze({

水稻: "水稻"

});

var 物件 = Object.freeze({

陶器: "陶器"

});

var 国家所属时期 = Object.freeze({

[朝代.春秋]: [地点.齐, 地点.晋, 地点.宋, 地点.秦, 地点.楚, 地点.吴_春秋, 地点.越, 地点.鲁],

[朝代.战国]: [地点.齐, 地点.楚, 地点.燕, 地点.秦, 地点.韩, 地点.赵, 地点.魏_战国],

[朝代.三国]: [地点.魏_三国, 地点.吴_三国, 地点.蜀国]

});

// 数字为公元纪年, 如-5000即公元前5000年, 221即公元后221年

// TODO: 很多年份如秦代-200需更正

var 时间跨度 = Object.freeze({

[地点.河姆渡]: {开始: -6000, 结束: -5000},

[地点.半坡]: {开始: -4400, 结束: -4300},

[朝代.东周]: {开始: -770, 结束: -221},

[朝代.秦]: {开始: -221, 结束: -200},

[朝代.西汉]: {开始: -200, 结束: 0},

[朝代.东汉]: {开始: 0, 结束: 229},

[年号.贞观]: {开始: 626, 结束: 650}

});

// TODO: 此表仅在人物无具体生卒年月时有用

var 所属时期 = Object.freeze({

[地点.半坡]: 朝代.新石器,

[地点.河姆渡]: 朝代.新石器,

[人物.孔子]: 朝代.春秋,

[人物.老子]: 朝代.春秋,

[人物.卫青]: 朝代.西汉,

[人物.霍去病]: 朝代.西汉

});

var 所属地点 = Object.freeze({

[人物.孔子]: 地点.鲁,

});

var 人物所属群体 = Object.freeze({

[人物.孔子]: 群体.儒家,

[人物.孟子]: 群体.儒家,

[人物.老子]: 群体.道家,

[人物.墨子]: 群体.墨家

});

var 属性 = Object.freeze({

[地点.河姆渡]: 社会类型.氏族社会,

[地点.半坡]: 社会类型.母系社会

});

// 行为方向为: 前者对后者

// TODO: 加入事件发生时间, 地点

var 事件 = Object.freeze({

[行为.结婚]: [(人物.文成公主, 人物.松赞干布), (人物.武则天, 人物.唐高宗)],

[行为.栽种]: [(地点.河姆渡, 植物.水稻)],

[行为.制作]: [(地点.半坡, 物件.陶器)],

[行为.求教]: [(人物.孔子, 人物.老子)],

[行为.消灭]: [(地点.秦, 地点.韩), (地点.秦, 地点.赵), (地点.秦, 地点.魏_战国)],

[行为.出使]: [(人物.张骞, 地点.西域), (人物.郑和, 地点.西洋)],

[行为.出击]: [(人物.卫青, 地点.匈奴), (人物.霍去病, 地点.匈奴)],

[行为.击败]: [(人物.曹操, 人物.袁绍)],

[行为.效力]: [(人物.魏征, 人物.李建成), (人物.魏征, 人物.唐太宗), (人物.李靖, 人物.唐太宗), (人物.尉迟恭, 人物.唐太宗), (人物.郑和, 人物.朱棣)],

[行为.称帝]: [(人物.曹丕, 地点.魏_三国, 220), (人物.刘备, 地点.蜀国, 221), (人物.孙权, 地点.吴_三国, 229)]

});

var 名言 = Object.freeze({

[人物.唐太宗]: ["民, 水也; 君, 舟也. 水能载舟, 亦能覆舟"]

});

责任编辑:

python古诗朝代_用 Python 编写中国历史知识库,此时不用中文命名变量更待何时?...相关推荐

  1. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  2. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  3. python游戏房间_使用 Python 学习面向对象的编程 | Linux 中国

    使用 Python 类使你的代码变得更加模块化.-- Seth Kenlon 在我上一篇文章中,我解释了如何通过使用函数.创建模块或者两者一起来使 Python 代码更加模块化.函数对于避免重复多次使 ...

  4. c调用python第三方库_用 Python ctypes 来调用 C/C++ 编写的第三方库

    看到一篇简洁的文章--如何用Python ctypes调用C++(ctypes调用C没这么多麻烦事),不敢独享... 如果需要用 Python 调用 C/C++ 编写的第三方库(这些第三方库很可能就是 ...

  5. python 免费空间_用python做大数据

    不学Python迟早会被淘汰?Python真有这么好的前景? 最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Pytho ...

  6. python制作鬼畜_用Python分析本山大叔鬼畜视频为啥这么火

    原标题:用Python分析本山大叔鬼畜视频为啥这么火 ♚ cxa,有着丰富的爬虫工作经验,公众号Python学习开发,擅长各种爬虫技术,熟悉大规模爬虫开发.热爱并喜欢钻研python. 改革春风吹满地 ...

  7. python的认识_认识Python和基础知识

    一.第一个Python程序 用vim编写,格式: vim hello.py 然后按 i 进入插入模式开始写代码,注意所有的代码都要用英文输入法,先写括号和引号,再在引号里面写内容(为了避免引号.括号不 ...

  8. python char 相等_用 Python 实现 Excel文本函数

    用 Python 实现 Excel文本函数 Excel 是非常强大的电子表格软件,大家日常经常用 Excel 处理成绩.师生名单.分析数据等,对 Excel 的函数比较了解,通过用 Python 实现 ...

  9. python希腊字母字符串_#10 Python字符串

    前言 通过上一节可知,Python6个序列的内置类型中,最常见的是列表和元组,但在Python中,最常用的数据类型却不是列表和元组,而是字符串.要想深入了解字符串,必须先掌握字符编码问题.因此本篇博文 ...

最新文章

  1. 全球有多少 C/C++ 程序员?Java 和 Python 又有多少?
  2. VisualStudio代码样式-我最喜欢的一种风格
  3. 计算机视觉与深度学习 | 对恐怖袭击事件记录数据的量化分析(附源代码):博主的机器学习首秀(研究生数学建模二等奖)
  4. NYOJ10: skiing(DFS + DP)
  5. 排序算法第四篇——冒泡排序
  6. atitit查询表修改表字段没反应--解锁锁定的表
  7. MySQL数据库性能优化方法,一篇给你总结了
  8. isis软件添加源代码c语言,ProteusISIS和Keil软件入门学习..doc
  9. web 安全-电脑端口(全部)
  10. 【超图+CESIUM】【基础API使用示例】09、超图|CESIUM - 场景分屏设置
  11. 政简网:还剩一个月时间怎么科学有效复习公务员考试?
  12. MySQL联合主键解释
  13. 如何通过发送短信唤起三方app?
  14. Cat3.0.0监控本地部署+springboot接入cat例子
  15. 实现图片“模糊”特效
  16. 物联网之MQTT3.1.1和MQTT5协议 (4) PUBLISH报文
  17. opencv-python使用cv2.resize()函数批量放大图片
  18. 电脑上照片如何压缩大小?怎么把照片在线压缩?
  19. HDU-6121 Build a tree - 2017 Multi-University Training Contest - Team 7(完全K叉树)
  20. 树莓派编译ffmpeg支持x264硬解码播放视频

热门文章

  1. 教你轻松分清pandas中的axis=0,axis=1具体含义
  2. 部署 Elastic
  3. taro tabBar的设置,设置tabbar的文字,设置tabbar的图标
  4. 用迭代法求 x=根号a。求平方根的迭代公式为:X(n+1)=(Xn+a/Xn) /2。要求前后两次求出的x的差的绝对值 小于10的-5次方
  5. Qt之connect函数—信号槽连接的几种方式和优缺点
  6. G1重要算法与总体流程
  7. 二本大一新生拒绝摆烂,2个月后的觉醒
  8. Python语言程序设计第七章 - 组合数据类型 - 6.1
  9. 各种系统架构图及其简介
  10. 机器学习-样本不均衡现象