来源 | 异步

今天,异步君给大家推荐一个很有意思的专栏:《读九章学Python》。

《九章算术》,一本成书于东汉初期、汇总了中国先秦至汉代数学成就的著作。Python版本的《九章算术》,以编程的方式诠释《九章》,通过《九章》学习编程。

简练精致的文言、清晰明了的代码,相辅相成、相合相融。“观阴阳之割裂,总算术之根源”,“析理以辞,解体用图”,用严谨的态度在计算机上再现古人之思,在古算法的阐述中体现计算机编程之想、之美。

最近有个 GitHub 项目火了 —— 文言编程语言 / wenyan-lang。

这一项目并不是简单的将程序中的英文字符换成了中文,而是利用 NLP 的一些技术,将文言文程序语法转换到 JavaScript 或 Python 运行。

来看看 文言版的“Hello world” 怎么写:

吾有一數。曰三。名之曰「甲」。 為是「甲」遍。     吾有一言。曰「「問天地好在。」」。書之。 云云。 

运行:

問天地好在。 問天地好在。 問天地好在。 

文言文编程肯定没有 abc,改用甲乙丙:

吾有一數。曰三。名之曰「甲」。     有數五十。名之曰「大衍」。 吾有一言。曰「「噫吁戲」」。名之曰「乙」。 

true/false 改为阳/阴,类型变成了“爻”:

吾有一爻。曰陰。名之曰「丙」。 

if 判断:

若三不大於五者。乃得「「想當然耳」」。若非。乃得「「怪哉」」也。 

循环:

為是百遍。⋯⋯ 云云。     恆為是。⋯⋯ 云云。     乃止。 

看了这些代码,网友戏称:照这样下去,《九章算术》就是一本算法导论;《孙子兵法》就是一本安全攻防;《易经》大概是一本二进制逆向……

其实,国内还真的有人研究《九章算术》,并且以编程的方式诠释这时隔千年的经典数学著作。

她就是timedot,真名胡洁,拥有近二十年的IT从业和管理经验,担任过开发、测试、配置、测试经理、QA经理、高级项目经理等多个职务,具备扎实的理论基础和丰富的实战经验,使用过的编程语言有:PB、C、C++、Java、Perl、Python。

同时他也是一名热爱传统文化的程序员,遵崇“科学艺术本相通,科技人文可相融”的创作理念,将致力于为计算机科学注入更多的人文气息。

“术”和“算法”

《九章算术》是我国现存的最古老的数学著作之一。据初步考证,《九章》大约成书于东汉初期,汇总了中国先秦至汉代的数学成就。

《九章》是一本问题集,以问答的形式,汇集并分析了当时人们在实践中所碰到的数学问题。全书共计246个问题202术,按问题性质分为方田、粟米、衰分、少广、商功、均输、盈不足、方程、勾股9章,其中各章在解决实际问题时,都有明确的计算方法:“术”。

《九章》成书后,历经众人传抄、删改,时有变动。直至魏晋时代,刘徽为《九章》作注,基本成为流传后世基本的定本。而后至唐代,李淳风等人为其补注后,该书成为了算术专科的主要课本。之后,此书传习不绝。“九章”二字,也成了中国数学的代名词。

为什么说《九章》中的“术”其实可以对应计算机科学中的“算法”呢?我们来看一个实际的例子——里田术。

问题一今有田广一里,从一里。问为田几何?

答曰:三顷七十五亩。

问题二又有田广二里,从三里。问为田几何?

答曰:二十二顷五十亩

什么意思呢?

简单翻译一下就是:

问题一,有一块方形田地,长为1里,宽为1里,其面积是多少?

答:3顷75亩。

问题二,又有方形田地,其长为2里,宽为3里,其面积是多少?

答:22顷55亩。

古人的思想,其实和我们现代科技又是相通的,在计算机上,我们可以再现古人之思。

比如这段话,也可以用我们设计优雅、明确、简单的编程语言Python来翻译。

1、自定义函数

我们可以把里田术定义成自己的一个函数。函数定义包括函数的名字以及函数被调用时运行的语句序列集。下面是这个函数的源码,如图所示。

函数的第一行叫做header(头),其余部分叫做body(体)。header以一个冒号结束,body可以包含任意数量的语句。body里的所有语句必须缩进,缩进可以选择两个空格、4个空格或一个tab,无论选择哪一种,body中每一条语句的缩进必须一致、必须对齐。

函数的命名规则和变量命名规则一样:字母、数字、下划线是合法的,但第1个字符不能是数字。你不可以用关键字作为函数名,也应尽量避免函数名和已有的变量名同名。

提示

关键字是编程语言里事先定义的、有特别意义的标识符,例如:def是一个关键字,表示这是一个函数定义;return也是一个关键字,表示返回函数结果。

2、注释

一个程序是用代码这种形式语言编写的,很密集,只看一部分代码,经常很难弄明白这部分代码是做什么的,以及为什么要这么做。

程序越大越复杂,阅读理解就会越困难。所以,在程序中必须增加注释,注释采用自然语言对程序的功能进行描述。注释以#标志开始,Python解释器会将注释标示为红色,会忽略从#到行尾的文本(这部分文本Python解释器不会执行)。

3、程序剖析

程序第一部分为两条赋值语句,一句赋值ji_li(积里),一句赋值mu_shu(亩数)。第二部分是亩数转换,第三部分连接字符串返回结果。

1.赋值语句

ji_li = guang * cong      #广从里数相乘得积里 mu_shu =375*ji_li         #以三百七十五乘之,即亩数

第一条赋值语句将传入的参数guang、cong相乘的结果赋值于变量ji_li。

第二条赋值语句将ji_li与375相乘的结果赋值于变量mu_shu。

2.亩数转换

# 1顷 = 100 亩,亩数转换成顷和亩 qing = int(mu_shu/100)      mu = mu_shu%100 

mu_shu/100是将亩数转换成顷,结果是一个浮点数,如375/100→3.75;int(mu_shu/100)调用了int()函数,将mu_shu/100的结果截取成整数,如int(3.75)→3,即顷的整数部分。

mu_shu%100是取模运算,%是一种算术运算符,用于取除法运算的余数,例如:375%100→75(即375÷100商为3余75,这个余数75就是%运算的结果),也即亩数转换成顷后剩余的亩。

所以,上面两句代码的含义如下。

亩数(mu_shu)若为375,顷(qing)=3,亩(mu)=75,

也就是:375亩 = 3顷75亩

3.字符串连接

# 连接成字符串并返回结果 jie_guo = str(qing) + '顷' + str(mu) + '亩'   return jie_guo

这里的“+”是“字符串连接”运算符,用于把字符串连接起来。表达式str(qing) + '顷' + str(mu) + '亩'求值为一个新的字符串,这个新的字符串连接了4个字符串里的文本:str(qing) 、'顷' 、str(mu) 、'亩'。其中str(qing)、str(mu)调用了str()函数,将整数qing、mu转换成了字符串。

“+”运算符要么是加法算术运算符,要么是字符串连接运算符。它所连接的值要么都是整数或浮点数,要么都是字符串,不能又有整数、浮点数,又有字符串。表达式str(qing) + '顷' + str(mu) + '亩',如果写成qing+'顷' + mu + '亩',就会出错。因为qing、mu是整数,而'顷'和 '亩'是字符串,整数和字符串之间不能进行“+”运算符操作。

赋值语句jie_guo = str(qing) + '顷' + str(mu) + '亩',把连接成的新的字符串赋值给了变量jie_guo。

return jie_guo 将jie_guo作为函数li_tian_shu的返回值返回

4、运行结果

在IDLE中输入这个函数,最后输入一个空行结束。完成这个函数定义后,我们可以调用它来解决里田术问题一、问题二,运行结果如图所示。

li_tian_shu(1,1)解决问题一“广一里,从一里”,也就是传递给函数的参数为:guang=1、cong=1,结果为3顷75亩;

li_tian_shu(2,3)解决问题二“广二里,从三里”,也就是传递给函数的参数为:guang=2、cong=3,结果为22顷50亩;

读九章学Python

作为中国数学历史上经典著作,其中精妙的算法构思值得程序员学习。而这本书用Python语言来表述《九章》中的各种“术”、各种数学思想,也通过《九章》来学习Python语言、学习编程、学习算法思维。

通过学习《九章》各卷通用的计算方法,由浅到深覆盖了Python的编程基础。这些计算方法包括:

卷一方田:合分术、减分术、平分术、割圆术;

卷二粟米:今有术、其率术、反其率术;

卷三衰分:衰分术、返衰术;

卷四少广:少广术、开方术、开立方术;

卷六均输:均输术;

卷七盈不足:盈不足术;

卷八方程:方程术、正负术;

卷九勾股:勾股术。

在对各术的讲解过程中,加深对上篇各种编程概念的理解,呈现各种编程技巧,同步提升Python编程能力。各术的讲解包括:图解、中文注释、数学术语和程序代码,程序代码中包含对应的文言注释,程序代码的右边批注代码的编程技巧。每一个“术”的开始,都附有Python编程要点。

-END-

文言文代码算什么?跟着九章算术学Python编程才厉害相关推荐

  1. 《读九章算术学Python》如何用Python编程实现开立方术?附图解分析、代码实现和习题解答

    18.1 图解九章 由正方体体积,推求其一棱的长,称为"开立方". 开立方术曰:置积为实("实"是被开立方数).借一算(借一算筹用以定位),步之(所借算筹一步一 ...

  2. 《读九章算术学Python》如何用Python编程实现盈不足术?附图解分析、代码实现和习题解答

    卷七 盈不足 以御隐杂互见 主要讲述了以盈亏问题为中心的一种双假设算法. 第20章 盈不足术 Python编程要点 列表操作 嵌套元组的列表 20.1 图解九章 李籍<音义>说:" ...

  3. 《读九章算术学Python》如何用Python编程实现阿拉伯数字转换成汉字数字?

    第6章 数量转换 Python编程基础 字典 字符串操作 if-elif-else语句 递归 前面的输入和输出都是阿拉伯数字,这一章我们来看一下如何实现阿拉伯数字和汉字数字之间的相互转换. 6.1 阿 ...

  4. 《九章算术》中记载的方程是如何算的?

    <九章算术>是我国古代一部重要的算学书籍,成书于公元一世纪左右,原作者是谁已经不可考,西汉时,张苍和耿寿昌曾对其做过整理. 到了三国时期,数学家刘徽又为其作了注,也是如今通行的版本. &l ...

  5. JAVASCRIPT遇到《九章算术》-《九章算术注》序

    本章对应B站视频链接https://www.bilibili.com/video/BV1Zf4y1T79i/https://www.bilibili.com/video/BV1Zf4y1T79i/ 小 ...

  6. c语言使用循环编写勾股数,刘徽《九章算术》中的勾股数

    若A.B.C为满足A2+B2=C2的正整数.我国古代数学书<周髀算经>曾经提到"勾广三,股修四,径偶五"这三个边都是正整数的直角三角形.在公元263年时,我国数学家:刘 ...

  7. 九章算术 九:《勾股》

    九:<勾股> 1.勾股:今有勾三尺,股四尺,问为弦几何? 答曰:五尺. 2.勾股:今有弦五尺,勾三尺,问为股几何? 答曰:四尺. 3.勾股:今有股四尺,弦五尺,问为勾几何? 答曰:三尺.勾 ...

  8. [生存志] 第117节 九章算术均徭赋

            九章算术均徭赋                  贾谊在27岁时向汉文帝进献的<治安策>一文,洋洋洒洒6844个字,写了汉帝国开国30年时的九件让他忧伤难过的事情,所谓『可 ...

  9. 《九章算术》中更相减损术----求最大公约数

    更相减损法:也叫更相减损术,是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合. #include<stdio.h> in ...

  10. 九章算术更相减损术的的c语言实现

    "关于约分问题,实质是如何求分子,分母最大公约数的问题.<九章算术>中介绍了这个方法,叫做"更相减损术",即"可半者半之,不可半者,副置分母.子之数 ...

最新文章

  1. Hadoop集群的基本操作(二:HBase的基本操作)
  2. 配置Java_Home,临时环境变量信息
  3. 引入dubbo依赖的版本是多少_Dubbo 项目学习(四) 接口抽取以及依赖版本统一
  4. Teams App如何选择用户
  5. [JavaWeb-HTML]HTML标签_文件标签
  6. 小甲鱼 OllyDbg 教程系列 (六) :PJ 软件功能限制(不修改jnz的非爆破方法)
  7. MySQL 限制查询结果的记录数
  8. Linux常用命令—权限管理命令—其他权限管理命令
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的铁路售票系统
  10. php只获取来源域名不需要参数,在php中获取域名(不是子域)
  11. python gRPC
  12. 素数(质数)与合数的研究
  13. atm取款流程测试_盘点2020年软件测试新手必看的技术面试指南(下)
  14. 扫描仪scanner接口_QR Code Scanner –适用于Android的条形码扫描仪
  15. Atitit.分区对索引的影响 分区索引和全局索引 attilax总结
  16. Rainmeter新手教程
  17. 自学备考CKA攻略-考试信息及准备
  18. c++中获取蓝图组件_C++和蓝图
  19. 老生常谈-forwar的与redirect的区别与联系
  20. java生命游戏_生命游戏

热门文章

  1. PASCAL VOC2012数据集介绍与制作自己的数据集
  2. servlet原理及访问时序图
  3. 搞深度学习框架的那帮人,不是疯子,就是骗子
  4. OpenPLC:符合IEC 61131-3标准的用于网络安全研究的开源工业控制器
  5. fanuc机器人控制柜接线_工业机器人控制柜及使用方法
  6. 显著性分析-秩和检验与校正
  7. oracle存储过程实例
  8. 局域网不同网段远程桌面_自动化已非原来的自动化:看虚拟局域网技术应用到罗克韦尔的DCS...
  9. cdr怎么转换成psd转换为位图标准_CorelDRAW矢量图怎么转位图?
  10. 酷派 CWM Recovery 6.0.1.2 For CoolPad 7728 根据最新源码编译