吳俊杰
(西安市第八十九中學(xué),陜西西安,710000)
Python是一類面向?qū)ο蟮慕忉屝偷挠嬎銠C(jī)編程語言,在1989年,由荷蘭人Guido van Rossum發(fā)明,其首次公開發(fā)行于1991年。
Pytho n是純自由軟件的一種,它的解釋器CPython和源代碼遵循GPL (GNU通用公共許可證)許可證。它的語法清晰簡潔,其特征之一是強(qiáng)制將空格縮進(jìn)句子中。
Py t h on有豐富而強(qiáng)大的庫。它通常被稱為Glu e Language,可以很容易地與用其他語言制作的各種模塊(特別是c/c++)連接在一起。一個常見的應(yīng)用程序是使用Python來快速生成一個原型(有時甚至最終接口)的一個程序,然后重寫它一個更合適的語言,如圖形渲染模塊3d游戲,這是特別要求,可以在c/c++重寫,然后在Python封裝??烧{(diào)用的擴(kuò)展類庫。特別注意,其在使用擴(kuò)展類庫時,可能需要考慮關(guān)于平臺的問題,其中可能存在一些庫不提供跨平臺實現(xiàn)的問題[1]。
JavaScript是一種具有動態(tài)類型、基于原型特征的腳本語言、同時因為內(nèi)置了對語言類型的支持,它也是一種弱類型編程語言。它最初用于HTML(標(biāo)準(zhǔn)通用標(biāo)記語言下的應(yīng)用程序)的頁面,實現(xiàn)在HTML頁面添加動態(tài)功能。
1995年,它由網(wǎng)景公司的Brendan Eich在Web Navig ator瀏覽器完成首次設(shè)計與實現(xiàn)。因為Netscape和Sun一起工作,Netscape的管理層希望它看起來類似Java,所以稱它為JavaScript[2]。
Python是一種高級腳本語言,其結(jié)合了可解釋性、交互性、編譯性與面向?qū)ο笮浴ython語言具有高可讀的特性,有著獨(dú)特的語法結(jié)構(gòu),比如java,c語言都是用分號來結(jié)束一行代碼。而python只需要在第二行用tab鍵區(qū)分。同時不像java,c語言在運(yùn)行前需要編譯和鏈接,python作為一種解釋型語言直接可以運(yùn)行,這像PHP和Perl語言。
(1)Python是交互式編程語言:交互式可以讓用戶在提示符下,直接執(zhí)行用戶開發(fā)的程序。
(2)Python是面向?qū)ο缶幊陶Z言:python語言像java一樣支持面向?qū)ο蟮拇a風(fēng)格,可以定義類,實例類為對象等。
(3)Python是一種適合初學(xué)者的語言:python語言簡潔易學(xué)適合初級程序員來學(xué)習(xí),同時它可以支持大型應(yīng)用程序開發(fā)。從表格數(shù)據(jù)處理到大型游戲。
JavaScript和python一樣也是一種腳本語言,主要常見于web工程的開發(fā),因為它能與html和css相互兼容,很多網(wǎng)頁用它來實現(xiàn)動態(tài)交互功能。在html網(wǎng)頁中我們最常用的就是JavaScript語言[3]。
(1)像python語言一樣,它是一類解釋性腳本語言,在運(yùn)行前不需要編譯和鏈接。
(2)主要在用在以html 為主的網(wǎng)頁中,實現(xiàn)網(wǎng)頁的動態(tài)交互功能[4]。
(3)JavaScript可以直接嵌入以html為類型的網(wǎng)頁中,寫成js文件更容易實現(xiàn)代碼的分離和維護(hù)。
(4)JavaScript像java一樣具有跨平臺的特性,兼容大多數(shù)的瀏覽器。同時可以在多種平臺下運(yùn)行(如Android、Linux、Windows、iOS、Mac 等)。
Javascript作為一種腳本語言與python,shell等腳本語言類似,不需要編譯運(yùn)行,同時跟大多數(shù)語言一樣,JavaScript有自己的基本數(shù)據(jù)類型,語法結(jié)構(gòu),算術(shù)和比較運(yùn)算符。JavaScript在幫助用戶處理數(shù)據(jù)和文件實際應(yīng)用中,提供了四種基本的數(shù)據(jù)類型以及兩種特殊的數(shù)據(jù)類型。同時JavaScript利用變量存放信息,采用表達(dá)式來完成功能復(fù)雜的操作[5]。
這兩類語言都屬于腳本語言,也稱為擴(kuò)展語言或動態(tài)語言,是用于控制軟件應(yīng)用程序的編程語言。腳本通常存儲在文本(如ASCII)中,只有在調(diào)用時才進(jìn)行解釋或編譯[6]。Python與Javascript都是一種腳本語言,這就意味著這兩種語言有著腳本語言的特性,比如它們運(yùn)行都不需要編譯鏈接而是直接在解釋器中運(yùn)行,它們都屬于動態(tài)類型,有著自動的內(nèi)存管理。調(diào)用Eval()語句實現(xiàn)執(zhí)行腳本和其他腳本語言也是它們的共同特性。同時,其在定義變量時,并不需要區(qū)分像C與Java語言區(qū)分等變量。
Javascript是被設(shè)計在客戶端上的一種腳本語言,因此主要應(yīng)用在瀏覽器中,它的語言與java語言類似。Python具備高可讀,簡單易學(xué),常被初學(xué)者喜歡,用在數(shù)據(jù)處理,機(jī)器學(xué)習(xí)當(dāng)中比較多。
(1)它們編程范式不相同。編程范式是計算機(jī)編程的一種基本風(fēng)格,指導(dǎo)如何構(gòu)建程序的結(jié)構(gòu)和元素,簡言之,就是指計算機(jī)編程的基本風(fēng)格或模型。從哲學(xué)的角度來說,如果每個程序員都在創(chuàng)造一個虛擬世界,那么編程范式就是他們有意識或無意識地采用的世界觀和方法論。
Python與Javascript均支持很多不同的編程范例,但它們在面向?qū)ο缶幊谭矫娌顒e很大。面向?qū)ο蟮腏avascript是基于原型,對象繼承由prototype(和Object)創(chuàng)建,prototype對象創(chuàng)建的對象繼承原型鏈上的方法。Python是一種常規(guī)的基于類的繼承,自然支持多態(tài)性的語言。
(2)多線程模型不相同。我們通常稱進(jìn)程為程序(指令和數(shù)據(jù)集合的有序集合我們成為程序)的一次執(zhí)行,它是計算機(jī)系統(tǒng)進(jìn)行資源分配的基本單位同時也是調(diào)度的一個基本單位,為了提高程序的并發(fā)度和進(jìn)一步提高資源的利用率,我們引進(jìn)了線程,通常來說線程是進(jìn)程的實體,一個進(jìn)程有多個或者至少一個線程組成,線程也是能夠獨(dú)立運(yùn)行的單位,但是它與線程的區(qū)別是不具備獨(dú)立的資源,多個線程共用同一進(jìn)程的資源,當(dāng)然線程具有程序計數(shù)器、棧與寄存器。
JavaScript語言沒有多線程的引入,其通過并發(fā)事件驅(qū)動方式來進(jìn)行,所有的JavaScript程序都運(yùn)行于一個線程是它的特點(diǎn)。雖然在HTML5中引入web worker可以并發(fā)處理任務(wù),但是這并沒有改變Javascript語言的的單線程限制。
Pytho n采用引入線程包來支持多線程。線程化用于提供與線程相關(guān)的操作,線程是應(yīng)用程序中最小的單元。Python的多線程庫的當(dāng)前版本沒有實現(xiàn)優(yōu)先級,線程組,線程不能停止、暫停、恢復(fù)、中斷。線程模塊提供了類:線程、鎖、Rlock、條件信號量、事件、定時器這些資源。
(3)數(shù)據(jù)類型的可變性不一樣。在Python語言中,一些數(shù)據(jù)類型是不可變的,這意味著一旦這些數(shù)據(jù)類型的變量被創(chuàng)建,都是不可修改的,如果修改就會返回新對象(python語言中一切皆是對象)。相比在Javascript語言中,所有數(shù)據(jù)類型被創(chuàng)建后也可以被更改。結(jié)合多線程的概念,JavaScript不支持多線程所以修改不影響線程的安全性,但是python是支持多線程的語言一旦修改將會對線程的安全性產(chǎn)生不可估計的影響。
(4)數(shù)據(jù)類型并不完全相同。Javascript的數(shù)據(jù)類型相對更簡單,包含6個對象、字符串、布爾值、數(shù)字、空值和未定義的值。Python中的一切都是對象,比如模塊、函數(shù)、類等。同時Python有5種內(nèi)置的簡單數(shù)據(jù)的類型,分別為int類型、bool類型、long類型、 fl oat類型與complex類型,及容器類型、內(nèi)部類型、代碼類型等。布爾值:Python有真有假。Javascript有真和假。它們只是大寫字母。
UTF16是JavaScript的編碼方式,而Python的編碼方式是ASCII,為了適應(yīng)中文就需要encode和decode來不斷編碼和解碼。Python支持unicode編碼方式,需要在字符串前加u,如u “aaaa”。
在數(shù)值上JavaScript全都是64位浮點(diǎn)數(shù)的數(shù)值類型,并且支持NaN(不是一個數(shù)字),正無窮和負(fù)無窮(+/-In fi ity)。Python有許多數(shù)值類型,它的主要優(yōu)勢在于復(fù)數(shù)類型實現(xiàn)非常方便,從而在數(shù)據(jù)處理和人工智能上應(yīng)用比較多。
列表:Javascript中有內(nèi)置數(shù)組類型(數(shù)組也屬于對象)。Python的列表更接近Javascript的數(shù)組,元組可以理解為不可變列表。除了使用內(nèi)置的方法len(在Python中查找長度)外,Python和Javascript基本提供了對列表進(jìn)行操作的各種方法。其中與JavaScript語言相比Python在列表下標(biāo)的操作上非常方便與靈活,比如,l[5:-1], l[6]等。
哈希表、字典、對象:Javascript中使用大量{}來進(jìn)行對象創(chuàng)建,這些對象與字典并無區(qū)別,你可以使用鍵值對的形式訪問對象的成員。你可以動態(tài)添加、修改和刪除鍵值對,因為可以認(rèn)為這是JavaScript的哈希表或者字典。(對象的鍵必須為字符串)而在Python語言中有內(nèi)置哈希表(dictS), 這個與Javascript語言的不同之處為,dictS其可以有各種不同的類型的鍵值。
空值:Javascript中定義了兩種空值。未定義則表示變量未進(jìn)行初始化。Null表示變量已進(jìn)行初始化,但其值是空。
一個完善的制度體系可以給管理者們起到良好的輔助作用,更可以讓員工約束其自身,促進(jìn)工程進(jìn)度,打消員工消極怠工的狀態(tài),增強(qiáng)團(tuán)隊的管理體系,完善制度從以下幾方面入手:
(5)賦值邏輯的操作不同。Javascript中使用=賦值,同時它擁有判斷相等(==)與全等(===)兩種形式,它的邏輯運(yùn)算符或與分別是||,&&,這雨大多數(shù)語言類似。在Python中并沒有全等,and表示與,or表示或,因為python語言看上去更接近自然的語言。
在Python的賦值操作中不允許返回賦值結(jié)果是一個重要的改進(jìn),這個改進(jìn)的好處是可以避免錯誤地使用賦值運(yùn)算,尤其是在判斷相等時這是因為這兩個運(yùn)算符非常地相似,它們與自然語言沒有區(qū)別。Python不支持++運(yùn)算符,您不再需要考慮是先傳值和重新賦值,還是先賦值和先傳值,這取決于++符號在變量的左邊和右邊的位置。在連續(xù)賦值中, Python使用tuple可以一次分配多個變量。
(6)其他不同點(diǎn)。包管理和作用域也不相同,Javascript的作用域由method函數(shù)定義,此表示同一方法內(nèi)部具有相同作用域。Python的作用域由函數(shù)、模塊和類定義。Python包的導(dǎo)入能很好地管理依賴關(guān)系與作用域,相對而言,由于Javascript并沒有本地包管理的機(jī)制,需要 AMD異步加載的同時依賴于JS文件,其中requirejs也是一種比較常見的工具。
雖然python語言和JavaScript語言都為動態(tài)語言和用作腳本語言,這兩種語言在細(xì)節(jié)上有很多不同,從而相關(guān)的開發(fā)人員會根據(jù)不同的項目來選擇不同的語言。JavaS-cript語言與html,css相互兼容,通常在在web項目中實現(xiàn),借助JavaScript語言可以實現(xiàn)動態(tài)網(wǎng)頁。而python語言由于列表,字典等數(shù)據(jù)結(jié)構(gòu)有很多內(nèi)置的函數(shù)或者簡易的讀取策略,通常在數(shù)據(jù)處理上用到的特別多。下面分別介紹JavaScript和python語言的應(yīng)用。
下圖分別為用html語言制作的圖片拼圖游戲和利用JavaScript語言實現(xiàn)游戲動態(tài)交匯,即可以通過鼠標(biāo)移動圖片塊。從圖1可以看出用到了JavaScript語言。
圖1
網(wǎng)絡(luò)爬蟲是一個程序或腳本自動抓取信息從萬維網(wǎng)根據(jù)某些規(guī)則。它廣泛應(yīng)用于互聯(lián)網(wǎng)搜索引擎或其他類似網(wǎng)站。它可以自動收集它可以訪問、獲取或更新這些網(wǎng)站的內(nèi)容和搜索方法的所有頁面的內(nèi)容。從功能上講,爬蟲一般分為三部分:數(shù)據(jù)采集、處理和存儲。web爬蟲的基本工作流程如下:
(1)首先選取要爬取的種子,即url;
(2)將要爬取的url整合成url隊列,在接下來提供;
(3)從第二部的url隊列中選取要解析的url,然后通過解析DNS,獲取主機(jī)IP,下載url獲取的web網(wǎng)頁,并進(jìn)行存儲。此外,將URL放入已抓取URL隊列之中。
(4)分析已抓取的URL隊列的URL,分析里面其他的URL,并將URL放入待抓取的URL隊列之中,從而進(jìn)入下一個循環(huán)。
本例主要是爬取58同城網(wǎng)站上出現(xiàn)的火車站信息。第一層根據(jù)url:http://lieche.58.com/checi/kuai.html爬取網(wǎng)頁上出現(xiàn)的所有車次。
第二層是將第一層爬取的所有車次依次拼接URL:http://lieche.58.com/checi/
產(chǎn)生類似這樣的url:http://lieche.58.com/checi/K1595/。之后爬取下圖的詳細(xì)信息。
爬取的部分代碼如圖2所示。
圖2