文言文代码算什么?跟着九章算术学Python编程才厉害
來(lái)源 | 異步
今天,異步君給大家推薦一個(gè)很有意思的專欄:《讀九章學(xué)Python》。
?
《九章算術(shù)》,一本成書(shū)于東漢初期、匯總了中國(guó)先秦至漢代數(shù)學(xué)成就的著作。Python版本的《九章算術(shù)》,以編程的方式詮釋《九章》,通過(guò)《九章》學(xué)習(xí)編程。
簡(jiǎn)練精致的文言、清晰明了的代碼,相輔相成、相合相融。“觀陰陽(yáng)之割裂,總算術(shù)之根源”,“析理以辭,解體用圖”,用嚴(yán)謹(jǐn)?shù)膽B(tài)度在計(jì)算機(jī)上再現(xiàn)古人之思,在古算法的闡述中體現(xiàn)計(jì)算機(jī)編程之想、之美。
?
最近有個(gè) GitHub 項(xiàng)目火了 —— 文言編程語(yǔ)言 / wenyan-lang。
這一項(xiàng)目并不是簡(jiǎn)單的將程序中的英文字符換成了中文,而是利用 NLP 的一些技術(shù),將文言文程序語(yǔ)法轉(zhuǎn)換到 JavaScript 或 Python 運(yùn)行。
來(lái)看看 文言版的“Hello world” 怎么寫(xiě):
吾有一數(shù)。曰三。名之曰「甲」。 為是「甲」遍。 ????吾有一言。曰「「問(wèn)天地好在。」」。書(shū)之。 云云。運(yùn)行:
問(wèn)天地好在。 問(wèn)天地好在。 問(wèn)天地好在。文言文編程肯定沒(méi)有 abc,改用甲乙丙:
吾有一數(shù)。曰三。名之曰「甲」。???? 有數(shù)五十。名之曰「大衍」。 吾有一言。曰「「噫吁戲」」。名之曰「乙」。true/false 改為陽(yáng)/陰,類(lèi)型變成了“爻”:
吾有一爻。曰陰。名之曰「丙」。if 判斷:
若三不大於五者。乃得「「想當(dāng)然耳」」。若非。乃得「「怪哉」」也。循環(huán):
為是百遍。???云云。???? 恆為是。???云云。???? 乃止。
看了這些代碼,網(wǎng)友戲稱:照這樣下去,《九章算術(shù)》就是一本算法導(dǎo)論;《孫子兵法》就是一本安全攻防;《易經(jīng)》大概是一本二進(jìn)制逆向……
其實(shí),國(guó)內(nèi)還真的有人研究《九章算術(shù)》,并且以編程的方式詮釋這時(shí)隔千年的經(jīng)典數(shù)學(xué)著作。
?
她就是timedot,真名胡潔,擁有近二十年的IT從業(yè)和管理經(jīng)驗(yàn),擔(dān)任過(guò)開(kāi)發(fā)、測(cè)試、配置、測(cè)試經(jīng)理、QA經(jīng)理、高級(jí)項(xiàng)目經(jīng)理等多個(gè)職務(wù),具備扎實(shí)的理論基礎(chǔ)和豐富的實(shí)戰(zhàn)經(jīng)驗(yàn),使用過(guò)的編程語(yǔ)言有:PB、C、C++、Java、Perl、Python。
同時(shí)他也是一名熱愛(ài)傳統(tǒng)文化的程序員,遵崇“科學(xué)藝術(shù)本相通,科技人文可相融”的創(chuàng)作理念,將致力于為計(jì)算機(jī)科學(xué)注入更多的人文氣息。
?
“術(shù)”和“算法”
?
《九章算術(shù)》是我國(guó)現(xiàn)存的最古老的數(shù)學(xué)著作之一。據(jù)初步考證,《九章》大約成書(shū)于東漢初期,匯總了中國(guó)先秦至漢代的數(shù)學(xué)成就。
《九章》是一本問(wèn)題集,以問(wèn)答的形式,匯集并分析了當(dāng)時(shí)人們?cè)趯?shí)踐中所碰到的數(shù)學(xué)問(wèn)題。全書(shū)共計(jì)246個(gè)問(wèn)題202術(shù),按問(wèn)題性質(zhì)分為方田、粟米、衰分、少?gòu)V、商功、均輸、盈不足、方程、勾股9章,其中各章在解決實(shí)際問(wèn)題時(shí),都有明確的計(jì)算方法:“術(shù)”。
《九章》成書(shū)后,歷經(jīng)眾人傳抄、刪改,時(shí)有變動(dòng)。直至魏晉時(shí)代,劉徽為《九章》作注,基本成為流傳后世基本的定本。而后至唐代,李淳風(fēng)等人為其補(bǔ)注后,該書(shū)成為了算術(shù)專科的主要課本。之后,此書(shū)傳習(xí)不絕。“九章”二字,也成了中國(guó)數(shù)學(xué)的代名詞。
為什么說(shuō)《九章》中的“術(shù)”其實(shí)可以對(duì)應(yīng)計(jì)算機(jī)科學(xué)中的“算法”呢?我們來(lái)看一個(gè)實(shí)際的例子——里田術(shù)。
“問(wèn)題一今有田廣一里,從一里。問(wèn)為田幾何?
?
答曰:三頃七十五畝。
問(wèn)題二又有田廣二里,從三里。問(wèn)為田幾何?
答曰:二十二頃五十畝”
?
什么意思呢?
簡(jiǎn)單翻譯一下就是:
問(wèn)題一,有一塊方形田地,長(zhǎng)為1里,寬為1里,其面積是多少?
答:3頃75畝。
問(wèn)題二,又有方形田地,其長(zhǎng)為2里,寬為3里,其面積是多少?
答:22頃55畝。
?
?
古人的思想,其實(shí)和我們現(xiàn)代科技又是相通的,在計(jì)算機(jī)上,我們可以再現(xiàn)古人之思。
比如這段話,也可以用我們?cè)O(shè)計(jì)優(yōu)雅、明確、簡(jiǎn)單的編程語(yǔ)言Python來(lái)翻譯。
?
1、自定義函數(shù)
?
我們可以把里田術(shù)定義成自己的一個(gè)函數(shù)。函數(shù)定義包括函數(shù)的名字以及函數(shù)被調(diào)用時(shí)運(yùn)行的語(yǔ)句序列集。下面是這個(gè)函數(shù)的源碼,如圖所示。
?
函數(shù)的第一行叫做header(頭),其余部分叫做body(體)。header以一個(gè)冒號(hào)結(jié)束,body可以包含任意數(shù)量的語(yǔ)句。body里的所有語(yǔ)句必須縮進(jìn),縮進(jìn)可以選擇兩個(gè)空格、4個(gè)空格或一個(gè)tab,無(wú)論選擇哪一種,body中每一條語(yǔ)句的縮進(jìn)必須一致、必須對(duì)齊。
函數(shù)的命名規(guī)則和變量命名規(guī)則一樣:字母、數(shù)字、下劃線是合法的,但第1個(gè)字符不能是數(shù)字。你不可以用關(guān)鍵字作為函數(shù)名,也應(yīng)盡量避免函數(shù)名和已有的變量名同名。
提示
關(guān)鍵字是編程語(yǔ)言里事先定義的、有特別意義的標(biāo)識(shí)符,例如:def是一個(gè)關(guān)鍵字,表示這是一個(gè)函數(shù)定義;return也是一個(gè)關(guān)鍵字,表示返回函數(shù)結(jié)果。
2、注釋
一個(gè)程序是用代碼這種形式語(yǔ)言編寫(xiě)的,很密集,只看一部分代碼,經(jīng)常很難弄明白這部分代碼是做什么的,以及為什么要這么做。
程序越大越復(fù)雜,閱讀理解就會(huì)越困難。所以,在程序中必須增加注釋,注釋采用自然語(yǔ)言對(duì)程序的功能進(jìn)行描述。注釋以#標(biāo)志開(kāi)始,Python解釋器會(huì)將注釋標(biāo)示為紅色,會(huì)忽略從#到行尾的文本(這部分文本Python解釋器不會(huì)執(zhí)行)。
?
3、程序剖析
程序第一部分為兩條賦值語(yǔ)句,一句賦值ji_li(積里),一句賦值mu_shu(畝數(shù))。第二部分是畝數(shù)轉(zhuǎn)換,第三部分連接字符串返回結(jié)果。
?
1.賦值語(yǔ)句
ji_li?=?guang?*?cong??????#廣從里數(shù)相乘得積里 mu_shu?=375*ji_li?????????#以三百七十五乘之,即畝數(shù)第一條賦值語(yǔ)句將傳入的參數(shù)guang、cong相乘的結(jié)果賦值于變量ji_li。
第二條賦值語(yǔ)句將ji_li與375相乘的結(jié)果賦值于變量mu_shu。
2.畝數(shù)轉(zhuǎn)換
#?1頃?=?100?畝,畝數(shù)轉(zhuǎn)換成頃和畝 qing?=?int(mu_shu/100)????? mu?=?mu_shu%100mu_shu/100是將畝數(shù)轉(zhuǎn)換成頃,結(jié)果是一個(gè)浮點(diǎn)數(shù),如375/100→3.75;int(mu_shu/100)調(diào)用了int()函數(shù),將mu_shu/100的結(jié)果截取成整數(shù),如int(3.75)→3,即頃的整數(shù)部分。
mu_shu%100是取模運(yùn)算,%是一種算術(shù)運(yùn)算符,用于取除法運(yùn)算的余數(shù),例如:375%100→75(即375÷100商為3余75,這個(gè)余數(shù)75就是%運(yùn)算的結(jié)果),也即畝數(shù)轉(zhuǎn)換成頃后剩余的畝。
所以,上面兩句代碼的含義如下。
畝數(shù)(mu_shu)若為375,頃(qing)=3,畝(mu)=75,
也就是:375畝 = 3頃75畝
3.字符串連接
#?連接成字符串并返回結(jié)果 jie_guo?=?str(qing)?+?'頃'?+?str(mu)?+?'畝'?? return?jie_guo這里的“+”是“字符串連接”運(yùn)算符,用于把字符串連接起來(lái)。表達(dá)式str(qing) + '頃' + str(mu) + '畝'求值為一個(gè)新的字符串,這個(gè)新的字符串連接了4個(gè)字符串里的文本:str(qing) 、'頃' 、str(mu) 、'畝'。其中str(qing)、str(mu)調(diào)用了str()函數(shù),將整數(shù)qing、mu轉(zhuǎn)換成了字符串。
“+”運(yùn)算符要么是加法算術(shù)運(yùn)算符,要么是字符串連接運(yùn)算符。它所連接的值要么都是整數(shù)或浮點(diǎn)數(shù),要么都是字符串,不能又有整數(shù)、浮點(diǎn)數(shù),又有字符串。表達(dá)式str(qing) + '頃' + str(mu) + '畝',如果寫(xiě)成qing+'頃' + mu + '畝',就會(huì)出錯(cuò)。因?yàn)閝ing、mu是整數(shù),而'頃'和 '畝'是字符串,整數(shù)和字符串之間不能進(jìn)行“+”運(yùn)算符操作。
賦值語(yǔ)句jie_guo = str(qing) + '頃' + str(mu) + '畝',把連接成的新的字符串賦值給了變量jie_guo。
return jie_guo 將jie_guo作為函數(shù)li_tian_shu的返回值返回
4、運(yùn)行結(jié)果
在IDLE中輸入這個(gè)函數(shù),最后輸入一個(gè)空行結(jié)束。完成這個(gè)函數(shù)定義后,我們可以調(diào)用它來(lái)解決里田術(shù)問(wèn)題一、問(wèn)題二,運(yùn)行結(jié)果如圖所示。
?
li_tian_shu(1,1)解決問(wèn)題一“廣一里,從一里”,也就是傳遞給函數(shù)的參數(shù)為:guang=1、cong=1,結(jié)果為3頃75畝;
li_tian_shu(2,3)解決問(wèn)題二“廣二里,從三里”,也就是傳遞給函數(shù)的參數(shù)為:guang=2、cong=3,結(jié)果為22頃50畝;
?
?讀九章學(xué)Python
作為中國(guó)數(shù)學(xué)歷史上經(jīng)典著作,其中精妙的算法構(gòu)思值得程序員學(xué)習(xí)。而這本書(shū)用Python語(yǔ)言來(lái)表述《九章》中的各種“術(shù)”、各種數(shù)學(xué)思想,也通過(guò)《九章》來(lái)學(xué)習(xí)Python語(yǔ)言、學(xué)習(xí)編程、學(xué)習(xí)算法思維。
通過(guò)學(xué)習(xí)《九章》各卷通用的計(jì)算方法,由淺到深覆蓋了Python的編程基礎(chǔ)。這些計(jì)算方法包括:
卷一方田:合分術(shù)、減分術(shù)、平分術(shù)、割圓術(shù);
卷二粟米:今有術(shù)、其率術(shù)、反其率術(shù);
卷三衰分:衰分術(shù)、返衰術(shù);
卷四少?gòu)V:少?gòu)V術(shù)、開(kāi)方術(shù)、開(kāi)立方術(shù);
卷六均輸:均輸術(shù);
卷七盈不足:盈不足術(shù);
卷八方程:方程術(shù)、正負(fù)術(shù);
卷九勾股:勾股術(shù)。
在對(duì)各術(shù)的講解過(guò)程中,加深對(duì)上篇各種編程概念的理解,呈現(xiàn)各種編程技巧,同步提升Python編程能力。各術(shù)的講解包括:圖解、中文注釋、數(shù)學(xué)術(shù)語(yǔ)和程序代碼,程序代碼中包含對(duì)應(yīng)的文言注釋,程序代碼的右邊批注代碼的編程技巧。每一個(gè)“術(shù)”的開(kāi)始,都附有Python編程要點(diǎn)。
?
?
-END-
總結(jié)
以上是生活随笔為你收集整理的文言文代码算什么?跟着九章算术学Python编程才厉害的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: stm32c语言设计以及注释,13个基于
- 下一篇: python自动登录网银_网银自动充值-