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