第一章熔任、Python基礎(chǔ)

一拆融、 Python介紹

1.1蠢琳、Python現(xiàn)狀

python的創(chuàng)始人為吉多·范羅蘇姆(Guido van Rossum)。1989年的圣誕節(jié)期間冠息,吉多·范羅蘇姆為了在阿姆斯特丹打發(fā)時(shí)間挪凑,決心開發(fā)一個(gè)新的腳本解釋程序,作為ABC語言的一種繼承逛艰。

最新的TIOBE排行榜肌访,Python趕超PHP占據(jù)第五媒咳, Python崇尚優(yōu)美、清晰、簡單掀宋,是一個(gè)優(yōu)秀并廣泛使用的語言。


image

由上圖可見吧史,Python整體呈上升趨勢吠各,反映出Python應(yīng)用越來越廣泛并且也逐漸得到業(yè)內(nèi)的認(rèn)可!G范永乌!

Python可以應(yīng)用于眾多領(lǐng)域惑申,如:數(shù)據(jù)分析、組件集成翅雏、網(wǎng)絡(luò)服務(wù)圈驼、圖像處理、數(shù)值計(jì)算和科學(xué)計(jì)算等眾多領(lǐng)域望几。目前業(yè)內(nèi)幾乎所有大中型互聯(lián)網(wǎng)企業(yè)都在使用Python绩脆,如:Youtube、Dropbox橄抹、BT靴迫、Quora(中國知乎)、豆瓣楼誓、知乎玉锌、Google、Yahoo!慌随、Facebook芬沉、NASA、百度阁猜、騰訊丸逸、汽車之家、美團(tuán)等剃袍。

1.2黄刚、目前Python主要應(yīng)用領(lǐng)域:

  • 云計(jì)算: 云計(jì)算最火的語言, 典型應(yīng)用OpenStack
  • WEB開發(fā): 眾多優(yōu)秀的WEB框架民效,眾多大型網(wǎng)站均為Python開發(fā)憔维,Youtube, Dropbox, 豆瓣。畏邢。业扒。, 典型WEB框架有Django
  • 科學(xué)運(yùn)算舒萎、人工智能: 典型庫NumPy, SciPy, Matplotlib, Enthought librarys,pandas
  • 系統(tǒng)運(yùn)維: 運(yùn)維人員必備語言
  • 金融:量化交易程储,金融分析,在金融工程領(lǐng)域臂寝,Python不但在用章鲤,且用的最多,而且重要性逐年提高咆贬。原因:作為動態(tài)語言的Python败徊,語言結(jié)構(gòu)清晰簡單,庫豐富掏缎,成熟穩(wěn)定皱蹦,科學(xué)計(jì)算和統(tǒng)計(jì)分析都很牛逼煤杀,生產(chǎn)效率遠(yuǎn)遠(yuǎn)高于c,c++,java,尤其擅長策略回測
  • 圖形GUI: PyQT, WxPython,TkInter

1.3、Python在一些公司的應(yīng)用:

  • 谷歌:Google App Engine 根欧、code.google.com 怜珍、Google earth 、谷歌爬蟲凤粗、Google廣告等項(xiàng)目都在大量使用Python開發(fā)
  • CIA: 美國中情局網(wǎng)站就是用Python開發(fā)的
  • NASA: 美國航天局(NASA)大量使用Python進(jìn)行數(shù)據(jù)分析和運(yùn)算
  • YouTube:世界上最大的視頻網(wǎng)站YouTube就是用Python開發(fā)的
  • Dropbox:美國最大的在線云存儲網(wǎng)站,全部用Python實(shí)現(xiàn)今豆,每天網(wǎng)站處理10億個(gè)文件的上傳和下載
  • Instagram:美國最大的圖片分享社交網(wǎng)站嫌拣,每天超過3千萬張照片被分享,全部用python開發(fā)
  • Facebook:大量的基礎(chǔ)庫均通過Python實(shí)現(xiàn)的
  • Redhat: 世界上最流行的Linux發(fā)行版本中的yum包管理工具就是用python開發(fā)的
  • 豆瓣: 公司幾乎所有的業(yè)務(wù)均是通過Python開發(fā)的
  • 知乎: 國內(nèi)最大的問答社區(qū)呆躲,通過Python開發(fā)(國外Quora)
  • 春雨醫(yī)生:國內(nèi)知名的在線醫(yī)療網(wǎng)站是用Python開發(fā)的
  • 除上面之外异逐,還有搜狐、金山插掂、騰訊灰瞻、盛大、網(wǎng)易辅甥、百度酝润、阿里、淘寶 璃弄、土豆要销、新浪、果殼等公司都在使用Python完成各種各樣的任務(wù)夏块。

1.4疏咐、Python 是一門什么樣的語言?

編程語言主要從以下幾個(gè)角度為進(jìn)行分類脐供,編譯型和解釋型浑塞、靜態(tài)語言和動態(tài)語言、強(qiáng)類型定義語言和弱類型定義語言政己,每個(gè)分類代表什么意思呢酌壕,我們一起來看一下。

1.5匹颤、什么是.pyc仅孩?

我初學(xué)Python時(shí),聽到的關(guān)于Python的第一句話就是印蓖,Python是一門解釋性語言辽慕,我就這樣一直相信下去,直到發(fā)現(xiàn)了.pyc文件的存在赦肃。如果是解釋型語言溅蛉,那么生成的.pyc文件是什么呢公浪?c應(yīng)該是compiled的縮寫才對啊船侧!

為了防止其他學(xué)習(xí)Python的人也被這句話誤解欠气,那么我們就在文中來澄清下這個(gè)問題,并且把一些基礎(chǔ)概念給理清镜撩。

1.6预柒、解釋型語言和編譯型語言

計(jì)算機(jī)是不能夠識別高級語言的,所以當(dāng)我們運(yùn)行一個(gè)高級語言程序的時(shí)候袁梗,就需要一個(gè)“翻譯機(jī)”來從事把高級語言轉(zhuǎn)變成計(jì)算機(jī)能讀懂的機(jī)器語言的過程宜鸯。這個(gè)過程分成兩類,第一種是編譯遮怜,第二種是解釋淋袖。

編譯型語言在程序執(zhí)行之前,先會通過編譯器對程序執(zhí)行一個(gè)編譯的過程锯梁,把程序轉(zhuǎn)變成機(jī)器語言即碗。運(yùn)行時(shí)就不需要翻譯,而直接執(zhí)行就可以了陌凳。最典型的例子就是C語言剥懒。

解釋型語言就沒有這個(gè)編譯的過程,而是在程序運(yùn)行的時(shí)候冯遂,通過解釋器對程序逐行作出解釋蕊肥,然后直接運(yùn)行,最典型的例子是Ruby蛤肌。

通過以上的例子壁却,我們可以來總結(jié)一下解釋型語言和編譯型語言的優(yōu)缺點(diǎn),因?yàn)榫幾g型語言在程序運(yùn)行之前就已經(jīng)對程序做出了“翻譯”裸准,所以在運(yùn)行時(shí)就少掉了“翻譯”的過程展东,所以效率比較高。但是我們也不能一概而論炒俱,一些解釋型語言也可以通過解釋器的優(yōu)化來在對程序做出翻譯時(shí)對整個(gè)程序做出優(yōu)化盐肃,從而在效率上超過編譯型語言。

此外权悟,隨著Java等基于虛擬機(jī)的語言的興起砸王,我們又不能把語言純粹地分成解釋型和編譯型這兩種。

用Java來舉例峦阁,Java首先是通過編譯器編譯成字節(jié)碼文件谦铃,然后在運(yùn)行時(shí)通過解釋器給解釋成機(jī)器文件。所以我們說Java是一種先編譯后解釋的語言榔昔。

1.7驹闰、編譯和解釋的區(qū)別是什么瘪菌?

編譯器是把源程序的每一條語句都編譯成機(jī)器語言,并保存成二進(jìn)制文件,這樣運(yùn)行時(shí)計(jì)算機(jī)可以直接以機(jī)器語言來運(yùn)行此程序,速度很快;

解釋器則是只在執(zhí)行程序時(shí),才一條一條的解釋成機(jī)器語言給計(jì)算機(jī)來執(zhí)行,所以運(yùn)行速度是不如編譯后的程序運(yùn)行的快的.

這是因?yàn)橛?jì)算機(jī)不能直接認(rèn)識并執(zhí)行我們寫的語句,它只能認(rèn)識機(jī)器語言(是二進(jìn)制的形式)

image
image

編譯型vs解釋型

編譯型
優(yōu)點(diǎn):編譯器一般會有預(yù)編譯的過程對代碼進(jìn)行優(yōu)化。因?yàn)榫幾g只做一次嘹朗,運(yùn)行時(shí)不需要編譯师妙,所以編譯型語言的程序執(zhí)行效率高∫倥啵可以脫離語言環(huán)境獨(dú)立運(yùn)行默穴。

缺點(diǎn):編譯之后如果需要修改就需要整個(gè)模塊重新編譯。編譯的時(shí)候根據(jù)對應(yīng)的運(yùn)行環(huán)境生成機(jī)器碼褪秀,不同的操作系統(tǒng)之間移植就會有問題壁顶,需要根據(jù)運(yùn)行的操作系統(tǒng)環(huán)境編譯不同的可執(zhí)行文件。

解釋型
優(yōu)點(diǎn):有良好的平臺兼容性溜歪,在任何環(huán)境中都可以運(yùn)行,前提是安裝了解釋器(虛擬機(jī))许蓖。靈活蝴猪,修改代碼的時(shí)候直接修改就可以,可以快速部署膊爪,不用停機(jī)維護(hù)自阱。

缺點(diǎn):每次運(yùn)行的時(shí)候都要解釋一遍,性能上不如編譯型語言米酬。

一沛豌、低級語言與高級語言
最初的計(jì)算機(jī)程序都是用0和1的序列表示的,程序員直接使用的是機(jī)器指令赃额,無需翻譯加派,從紙帶打孔輸入即可執(zhí)行得到結(jié)果。后來為了方便記憶跳芳,就將用0芍锦、1序列表示的機(jī)器指令都用符號助記,這些與機(jī)器指令一一對應(yīng)的助記符就成了匯編指令飞盆,從而誕生了匯編語言娄琉。無論是機(jī)器指令還是匯編指令都是面向機(jī)器的,統(tǒng)稱為低級語言吓歇。因?yàn)槭轻槍μ囟C(jī)器的機(jī)器指令的助記符孽水,所以匯編語言是無法獨(dú)立于機(jī)器(特定的CPU體系結(jié)構(gòu))的。但匯編語言也是要經(jīng)過翻譯成機(jī)器指令才能執(zhí)行的城看,所以也有將運(yùn)行在一種機(jī)器上的匯編語言翻譯成運(yùn)行在另一種機(jī)器上的機(jī)器指令的方法女气,那就是交叉匯編技術(shù)。
高級語言是從人類的邏輯思維角度出發(fā)的計(jì)算機(jī)語言析命,抽象程度大大提高主卫,需要經(jīng)過編譯成特定機(jī)器上的目標(biāo)代碼才能執(zhí)行逃默,一條高級語言的語句往往需要若干條機(jī)器指令來完成。高級語言獨(dú)立于機(jī)器的特性是靠編譯器為不同機(jī)器生成不同的目標(biāo)代碼(或機(jī)器指令)來實(shí)現(xiàn)的簇搅。那具體的說完域,要將高級語言編譯到什么程度呢,這又跟編譯的技術(shù)有關(guān)了瘩将,既可以編譯成直接可執(zhí)行的目標(biāo)代碼吟税,也可以編譯成一種中間表示,然后拿到不同的機(jī)器和系統(tǒng)上去執(zhí)行姿现,這種情況通常又需要支撐環(huán)境肠仪,比如解釋器或虛擬機(jī)的支持,Java程序編譯成bytecode备典,再由不同平臺上的虛擬機(jī)執(zhí)行就是很好的例子异旧。所以,說高級語言不依賴于機(jī)器提佣,是指在不同的機(jī)器或平臺上高級語言的程序本身不變吮蛹,而通過編譯器編譯得到的目標(biāo)代碼去適應(yīng)不同的機(jī)器。從這個(gè)意義上來說拌屏,通過交叉匯編潮针,一些匯編程序也可以獲得不同機(jī)器之間的可移植性,但這種途徑獲得的移植性遠(yuǎn)遠(yuǎn)不如高級語言來的方便和實(shí)用性大倚喂。

二每篷、編譯與解釋
編譯是將源程序翻譯成可執(zhí)行的目標(biāo)代碼,翻譯與執(zhí)行是分開的端圈;而解釋是對源程序的翻譯與執(zhí)行一次性完成焦读,不生成可存儲的目標(biāo)代碼。這只是表象枫笛,二者背后的最大區(qū)別是:對解釋執(zhí)行而言吨灭,程序運(yùn)行時(shí)的控制權(quán)在解釋器而不在用戶程序;對編譯執(zhí)行而言刑巧,運(yùn)行時(shí)的控制權(quán)在用戶程序喧兄。
解釋具有良好的動態(tài)特性和可移植性,比如在解釋執(zhí)行時(shí)可以動態(tài)改變變量的類型啊楚、對程序進(jìn)行修改以及在程序中插入良好的調(diào)試診斷信息等吠冤,而將解釋器移植到不同的系統(tǒng)上,則程序不用改動就可以在移植了解釋器的系統(tǒng)上運(yùn)行恭理。同時(shí)解釋器也有很大的缺點(diǎn)拯辙,比如執(zhí)行效率低,占用空間大,因?yàn)椴粌H要給用戶程序分配空間涯保,解釋器本身也占用了寶貴的系統(tǒng)資源诉濒。

編譯器是把源程序的每一條語句都編譯成機(jī)器語言,并保存成二進(jìn)制文件,這樣運(yùn)行時(shí)計(jì)算機(jī)可以直接以機(jī)器語言來運(yùn)行此程序,速度很快;
而解釋器則是只在執(zhí)行程序時(shí),才一條一條的解釋成機(jī)器語言給計(jì)算機(jī)來執(zhí)行,所以運(yùn)行速度是不如編譯后的程序運(yùn)行的快的.

編譯型和解釋型
我們先看看編譯型,其實(shí)它和匯編語言是一樣的:也是有一個(gè)負(fù)責(zé)翻譯的程序來對我們的源代碼進(jìn)行轉(zhuǎn)換夕春,生成相對應(yīng)的可執(zhí)行代碼未荒。這個(gè)過程說得專業(yè)一點(diǎn),就稱為編譯(Compile)及志,而負(fù)責(zé)編譯的程序自然就稱為編譯器(Compiler)片排。如果我們寫的程序代碼都包含在一個(gè)源文件中,那么通常編譯之后就會直接生成一個(gè)可執(zhí)行文件速侈,我們就可以直接運(yùn)行了率寡。但對于一個(gè)比較復(fù)雜的項(xiàng)目,為了方便管理倚搬,我們通常把代碼分散在各個(gè)源文件中冶共,作為不同的模塊來組織。這時(shí)編譯各個(gè)文件時(shí)就會生成目標(biāo)文件(Object file)而不是前面說的可執(zhí)行文件每界。一般一個(gè)源文件的編譯都會對應(yīng)一個(gè)目標(biāo)文件比默。這些目標(biāo)文件里的內(nèi)容基本上已經(jīng)是可執(zhí)行代碼了,但由于只是整個(gè)項(xiàng)目的一部分盆犁,所以我們還不能直接運(yùn)行。待所有的源文件的編譯都大功告成篡九,我們就可以最后把這些半成品的目標(biāo)文件“打包”成一個(gè)可執(zhí)行文件了谐岁,這個(gè)工作由另一個(gè)程序負(fù)責(zé)完成,由于此過程好像是把包含可執(zhí)行代碼的目標(biāo)文件連接裝配起來榛臼,所以又稱為鏈接(Link)伊佃,而負(fù)責(zé)鏈接的程序就叫……就叫鏈接程序(Linker)。鏈接程序除了鏈接目標(biāo)文件外沛善,可能還有各種資源航揉,像圖標(biāo)文件啊、聲音文件啊什么的金刁,還要負(fù)責(zé)去除目標(biāo)文件之間的冗余重復(fù)代碼帅涂,等等,所以……也是挺累的尤蛮。鏈接完成之后媳友,一般就可以得到我們想要的可執(zhí)行文件了。
上面我們大概地介紹了編譯型語言的特點(diǎn)产捞,現(xiàn)在再看看解釋型醇锚。噢,從字面上看坯临,“編譯”和“解釋”的確都有“翻譯”的意思焊唬,它們的區(qū)別則在于翻譯的時(shí)機(jī)安排不大一樣恋昼。打個(gè)比方:假如你打算閱讀一本外文書,而你不知道這門外語赶促,那么你可以找一名翻譯液肌,給他足夠的時(shí)間讓他從頭到尾把整本書翻譯好,然后把書的母語版交給你閱讀芳杏;或者矩屁,你也立刻讓這名翻譯輔助你閱讀,讓他一句一句給你翻譯爵赵,如果你想往回看某個(gè)章節(jié)吝秕,他也得重新給你翻譯。
兩種方式空幻,前者就相當(dāng)于我們剛才所說的編譯型:一次把所有的代碼轉(zhuǎn)換成機(jī)器語言烁峭,然后寫成可執(zhí)行文件;而后者就相當(dāng)于我們要說的解釋型:在程序運(yùn)行的前一刻秕铛,還只有源程序而沒有可執(zhí)行程序约郁;而程序每執(zhí)行到源程序的某一條指令,則會有一個(gè)稱之為解釋程序的外殼程序?qū)⒃创a轉(zhuǎn)換成二進(jìn)制代碼以供執(zhí)行但两,總言之鬓梅,就是不斷地解釋、執(zhí)行谨湘、解釋绽快、執(zhí)行……所以,解釋型程序是離不開解釋程序的紧阔。像早期的BASIC就是一門經(jīng)典的解釋型語言坊罢,要執(zhí)行BASIC程序,就得進(jìn)入BASIC環(huán)境擅耽,然后才能加載程序源文件活孩、運(yùn)行。解釋型程序中乖仇,由于程序總是以源代碼的形式出現(xiàn)憾儒,因此只要有相應(yīng)的解釋器,移植幾乎不成問題乃沙。編譯型程序雖然源代碼也可以移植航夺,但前提是必須針對不同的系統(tǒng)分別進(jìn)行編譯,對于復(fù)雜的工程來說崔涂,的確是一件不小的時(shí)間消耗阳掐,況且很可能一些細(xì)節(jié)的地方還是要修改源代碼。而且,解釋型程序省卻了編譯的步驟缭保,修改調(diào)試也非常方便汛闸,編輯完畢之后即可立即運(yùn)行,不必像編譯型程序一樣每次進(jìn)行小小改動都要耐心等待漫長的Compiling…Linking…這樣的編譯鏈接過程艺骂。不過凡事有利有弊诸老,由于解釋型程序是將編譯的過程放到執(zhí)行過程中,這就決定了解釋型程序注定要比編譯型慢上一大截钳恕,像幾百倍的速度差距也是不足為奇的别伏。
編譯型與解釋型,兩者各有利弊厘肮。前者由于程序執(zhí)行速度快,同等條件下對系統(tǒng)要求較低睦番,因此像開發(fā)操作系統(tǒng)类茂、大型應(yīng)用程序、數(shù)據(jù)庫系統(tǒng)等時(shí)都采用它托嚣,像C/C++巩检、Pascal/Object Pascal(Delphi)、VB等基本都可視為編譯語言示启,而一些網(wǎng)頁腳本兢哭、服務(wù)器腳本及輔助開發(fā)接口這樣的對速度要求不高、對不同系統(tǒng)平臺間的兼容性有一定要求的程序則通常使用解釋性語言夫嗓,如Java厦瓢、JavaScript、VBScript啤月、Perl、Python等等劳跃。
但既然編譯型與解釋型各有優(yōu)缺點(diǎn)又相互對立谎仲,所以一批新興的語言都有把兩者折衷起來的趨勢,例如Java語言雖然比較接近解釋型語言的特征刨仑,但在執(zhí)行之前已經(jīng)預(yù)先進(jìn)行一次預(yù)編譯郑诺,生成的代碼是介于機(jī)器碼和Java源代碼之間的中介代碼,運(yùn)行的時(shí)候則由JVM(Java的虛擬機(jī)平臺榛鼎,可視為解釋器)解釋執(zhí)行这嚣。它既保留了源代碼的高抽象拆吆、可移植的特點(diǎn),又已經(jīng)完成了對源代碼的大部分預(yù)編譯工作飞涂,所以執(zhí)行起來比“純解釋型”程序要快許多。而像VB6(或者以前版本)、C#這樣的語言较店,雖然表面上看生成的是.exe可執(zhí)行程序文件士八,但VB6編譯之后實(shí)際生成的也是一種中介碼,只不過編譯器在前面安插了一段自動調(diào)用某個(gè)外部解釋器的代碼(該解釋程序獨(dú)立于用戶編寫的程序梁呈,存放于系統(tǒng)的某個(gè)DLL文件中婚度,所有以VB6編譯生成的可執(zhí)行程序都要用到它),以解釋執(zhí)行實(shí)際的程序體官卡。C#(以及其它.net的語言編譯器)則是生成.net目標(biāo)代碼蝗茁,實(shí)際執(zhí)行時(shí)則由.net解釋系統(tǒng)(就像JVM一樣,也是一個(gè)虛擬機(jī)平臺)進(jìn)行執(zhí)行寻咒。當(dāng)然.net目標(biāo)代碼已經(jīng)相當(dāng)“低級”哮翘,比較接近機(jī)器語言了,所以仍將其視為編譯語言仔涩,而且其可移植程度也沒有Java號稱的這么強(qiáng)大忍坷,Java號稱是“一次編譯,到處執(zhí)行”熔脂,而.net則是“一次編碼佩研,到處編譯”。呵呵霞揉,當(dāng)然這些都是題外話了旬薯。總之适秩,隨著設(shè)計(jì)技術(shù)與硬件的不斷發(fā)展绊序,編譯型與解釋型兩種方式的界限正在不斷變得模糊。

動態(tài)語言和靜態(tài)語言
通常我們所說的動態(tài)語言秽荞、靜態(tài)語言是指動態(tài)類型語言和靜態(tài)類型語言骤公。

(1)動態(tài)類型語言:動態(tài)類型語言是指在運(yùn)行期間才去做數(shù)據(jù)類型檢查的語言,也就是說扬跋,在用動態(tài)類型的語言編程時(shí)阶捆,永遠(yuǎn)也不用給任何變量指定數(shù)據(jù)類型,該語言會在你第一次賦值給變量時(shí)钦听,在內(nèi)部將數(shù)據(jù)類型記錄下來洒试。Python和Ruby就是一種典型的動態(tài)類型語言,其他的各種腳本語言如VBScript也多少屬于動態(tài)類型語言朴上。

(2)靜態(tài)類型語言:靜態(tài)類型語言與動態(tài)類型語言剛好相反垒棋,它的數(shù)據(jù)類型是在編譯其間檢查的,也就是說在寫程序時(shí)要聲明所有變量的數(shù)據(jù)類型痪宰,C/C++是靜態(tài)類型語言的典型代表叼架,其他的靜態(tài)類型語言還有C#畔裕、JAVA等。

強(qiáng)類型定義語言和弱類型定義語言

(1)強(qiáng)類型定義語言:強(qiáng)制數(shù)據(jù)類型定義的語言碉碉。也就是說柴钻,一旦一個(gè)變量被指定了某個(gè)數(shù)據(jù)類型,如果不經(jīng)過強(qiáng)制轉(zhuǎn)換垢粮,那么它就永遠(yuǎn)是這個(gè)數(shù)據(jù)類型了贴届。舉個(gè)例子:如果你定義了一個(gè)整型變量a,那么程序根本不可能將a當(dāng)作字符串類型處理。強(qiáng)類型定義語言是類型安全的語言蜡吧。

(2)弱類型定義語言:數(shù)據(jù)類型可以被忽略的語言毫蚓。它與強(qiáng)類型定義語言相反, 一個(gè)變量可以賦不同數(shù)據(jù)類型的值。

強(qiáng)類型定義語言在速度上可能略遜色于弱類型定義語言昔善,但是強(qiáng)類型定義語言帶來的嚴(yán)謹(jǐn)性能夠有效的避免許多錯誤元潘。另外,“這門語言是不是動態(tài)語言”與“這門語言是否類型安全”之間是完全沒有聯(lián)系的君仆!
例如:Python是動態(tài)語言翩概,是強(qiáng)類型定義語言(類型安全的語言); VBScript是動態(tài)語言,是弱類型定義語言(類型不安全的語言); JAVA是靜態(tài)語言返咱,是強(qiáng)類型定義語言(類型安全的語言)钥庇。

通過上面這些介紹,我們可以得出咖摹,*python是一門動態(tài)解釋性的強(qiáng)類型定義語言评姨。*那這些基因使成就了Python的哪些優(yōu)缺點(diǎn)呢?我們繼續(xù)往下看萤晴。

1.8吐句、 Python到底是什么

其實(shí)Python和Java/C#一樣,也是一門基于虛擬機(jī)的語言店读,我們先來從表面上簡單地了解一下Python程序的運(yùn)行過程吧嗦枢。

當(dāng)我們在命令行中輸入python hello.py時(shí),其實(shí)是激活了Python的“解釋器”屯断,告訴“解釋器”:你要開始工作了文虏。可是在“解釋”之前裹纳,其實(shí)執(zhí)行的第一項(xiàng)工作和Java一樣,是編譯紧武。

熟悉Java的同學(xué)可以想一下我們在命令行中如何執(zhí)行一個(gè)Java的程序:

javac hello.java

java hello

只是我們在用Eclipse之類的IDE時(shí)剃氧,將這兩部給融合成了一部而已。其實(shí)Python也一樣阻星,當(dāng)我們執(zhí)行python hello.py時(shí)朋鞍,他也一樣執(zhí)行了這么一個(gè)過程已添,所以我們應(yīng)該這樣來描述Python,Python是一門先編譯后解釋的語言滥酥。

1.9更舞、簡述Python的運(yùn)行過程

在說這個(gè)問題之前,我們先來說兩個(gè)概念坎吻,PyCodeObject和pyc文件缆蝉。

我們在硬盤上看到的pyc自然不必多說,而其實(shí)PyCodeObject則是Python編譯器真正編譯成的結(jié)果瘦真。我們先簡單知道就可以了刊头,繼續(xù)向下看。

當(dāng)python程序運(yùn)行時(shí)诸尽,編譯的結(jié)果則是保存在位于內(nèi)存中的PyCodeObject中原杂,當(dāng)Python程序運(yùn)行結(jié)束時(shí),Python解釋器則將PyCodeObject寫回到pyc文件中您机。

當(dāng)python程序第二次運(yùn)行時(shí)穿肄,首先程序會在硬盤中尋找pyc文件,如果找到际看,則直接載入咸产,否則就重復(fù)上面的過程。

所以我們應(yīng)該這樣來定位PyCodeObject和pyc文件仿村,我們說pyc文件其實(shí)是PyCodeObject的一種持久化保存方式锐朴。

1.10、Python 的優(yōu)缺點(diǎn)

先看優(yōu)點(diǎn)

  1. Python的定位是“優(yōu)雅”蔼囊、“明確”焚志、“簡單”,所以Python程序看上去總是簡單易懂畏鼓,初學(xué)者學(xué)Python酱酬,不但入門容易,而且將來深入下去云矫,可以編寫那些非常非常復(fù)雜的程序膳沽。
  2. 開發(fā)效率非常高,Python有非常強(qiáng)大的第三方庫让禀,基本上你想通過計(jì)算機(jī)實(shí)現(xiàn)任何功能挑社,Python官方庫里都有相應(yīng)的模塊進(jìn)行支持,直接下載調(diào)用后巡揍,在基礎(chǔ)庫的基礎(chǔ)上再進(jìn)行開發(fā)痛阻,大大降低開發(fā)周期,避免重復(fù)造輪子腮敌。
  3. 高級語言————當(dāng)你用Python語言編寫程序的時(shí)候阱当,你無需考慮諸如如何管理你的程序使用的內(nèi)存一類的底層細(xì)節(jié)
  4. 可移植性————由于它的開源本質(zhì)俏扩,Python已經(jīng)被移植在許多平臺上(經(jīng)過改動使它能夠工 作在不同平臺上)。如果你小心地避免使用依賴于系統(tǒng)的特性弊添,那么你的所有Python程序無需修改就幾乎可以在市場上所有的系統(tǒng)平臺上運(yùn)行
  5. 可擴(kuò)展性————如果你需要你的一段關(guān)鍵代碼運(yùn)行得更快或者希望某些算法不公開录淡,你可以把你的部分程序用C或C++編寫,然后在你的Python程序中使用它們油坝。
  6. 可嵌入性————你可以把Python嵌入你的C/C++程序嫉戚,從而向你的程序用戶提供腳本功能。

再看缺點(diǎn):

  1. 速度慢免钻,Python 的運(yùn)行速度相比C語言確實(shí)慢很多彼水,跟JAVA相比也要慢一些,因此這也是很多所謂的大牛不屑于使用Python的主要原因极舔,但其實(shí)這里所指的運(yùn)行速度慢在大多數(shù)情況下用戶是無法直接感知到的凤覆,必須借助測試工具才能體現(xiàn)出來,比如你用C運(yùn)一個(gè)程序花了0.01s,用Python是0.1s,這樣C語言直接比Python快了10倍,算是非巢鹞海夸張了盯桦,但是你是無法直接通過肉眼感知的,因?yàn)橐粋€(gè)正常人所能感知的時(shí)間最小單位是0.15-0.4s左右渤刃,哈哈拥峦。其實(shí)在大多數(shù)情況下Python已經(jīng)完全可以滿足你對程序速度的要求,除非你要寫對速度要求極高的搜索引擎等卖子,這種情況下略号,當(dāng)然還是建議你用C去實(shí)現(xiàn)的。
  2. 代碼不能加密洋闽,因?yàn)镻YTHON是解釋性語言玄柠,它的源碼都是以名文形式存放的,不過我不認(rèn)為這算是一個(gè)缺點(diǎn)诫舅,如果你的項(xiàng)目要求源代碼必須是加密的羽利,那你一開始就不應(yīng)該用Python來去實(shí)現(xiàn)。
  3. 線程不能利用多CPU問題刊懈,這是Python被人詬病最多的一個(gè)缺點(diǎn)这弧,GIL即全局解釋器鎖(Global Interpreter Lock),是計(jì)算機(jī)程序設(shè)計(jì)語言解釋器用于同步線程的工具虚汛,使得任何時(shí)刻僅有一個(gè)線程在執(zhí)行匾浪,Python的線程是操作系統(tǒng)的原生線程。在Linux上為pthread卷哩,在Windows上為Win thread蛋辈,完全由操作系統(tǒng)調(diào)度線程的執(zhí)行。一個(gè)python解釋器進(jìn)程內(nèi)有一條主線程殉疼,以及多條用戶程序的執(zhí)行線程梯浪。即使在多核CPU平臺上,由于GIL的存在瓢娜,所以禁止多線程的并行執(zhí)行挂洛。關(guān)于這個(gè)問題的折衷解決方法,我們在以后線程和進(jìn)程章節(jié)里再進(jìn)行詳細(xì)探討眠砾。

當(dāng)然虏劲,Python還有一些其它的小缺點(diǎn),在這就不一一列舉了褒颈,我想說的是柒巫,任何一門語言都不是完美的,都有擅長和不擅長做的事情谷丸,建議各位不要拿一個(gè)語言的劣勢去跟另一個(gè)語言的優(yōu)勢來去比較堡掏,語言只是一個(gè)工具,是實(shí)現(xiàn)程序設(shè)計(jì)師思想的工具刨疼,就像我們之前中學(xué)學(xué)幾何時(shí)泉唁,有的時(shí)候需要要圓規(guī),有的時(shí)候需要用三角尺一樣揩慕,拿相應(yīng)的工具去做它最擅長的事才是正確的選擇亭畜。之前很多人問我Shell和Python到底哪個(gè)好?我回答說Shell是個(gè)腳本語言迎卤,但Python不只是個(gè)腳本語言拴鸵,能做的事情更多,然后又有鉆牛角尖的人說完全沒必要學(xué)Python, Python能做的事情Shell都可以做蜗搔,只要你足夠牛B,然后又舉了用Shell可以寫俄羅斯方塊這樣的游戲劲藐,對此我能說表達(dá)只能是,不要跟SB理論碍扔,SB會把你拉到跟他一樣的高度瘩燥,然后用充分的經(jīng)驗(yàn)把你打倒。

1.11不同、Python 解釋器

當(dāng)我們編寫Python代碼時(shí)厉膀,我們得到的是一個(gè)包含Python代碼的以.py為擴(kuò)展名的文本文件。要運(yùn)行代碼二拐,就需要Python解釋器去執(zhí)行.py文件服鹅。

由于整個(gè)Python語言從規(guī)范到解釋器都是開源的,所以理論上百新,只要水平夠高企软,任何人都可以編寫Python解釋器來執(zhí)行Python代碼(當(dāng)然難度很大)。事實(shí)上饭望,確實(shí)存在多種Python解釋器仗哨。

CPython

當(dāng)我們從Python官方網(wǎng)站下載并安裝好Python 2.7后形庭,我們就直接獲得了一個(gè)官方版本的解釋器:CPython。這個(gè)解釋器是用C語言開發(fā)的厌漂,所以叫CPython萨醒。在命令行下運(yùn)行python就是啟動CPython解釋器。

CPython是使用最廣的Python解釋器苇倡。教程的所有代碼也都在CPython下執(zhí)行富纸。

IPython

IPython是基于CPython之上的一個(gè)交互式解釋器,也就是說旨椒,IPython只是在交互方式上有所增強(qiáng)晓褪,但是執(zhí)行Python代碼的功能和CPython是完全一樣的。好比很多國產(chǎn)瀏覽器雖然外觀不同综慎,但內(nèi)核其實(shí)都是調(diào)用了IE涣仿。

CPython用>>>作為提示符,而IPython用In [``序號``]:作為提示符示惊。

PyPy

PyPy是另一個(gè)Python解釋器变过,它的目標(biāo)是執(zhí)行速度。PyPy采用JIT技術(shù)涝涤,對Python代碼進(jìn)行動態(tài)編譯(注意不是解釋)媚狰,所以可以顯著提高Python代碼的執(zhí)行速度。

絕大部分Python代碼都可以在PyPy下運(yùn)行阔拳,但是PyPy和CPython有一些是不同的崭孤,這就導(dǎo)致相同的Python代碼在兩種解釋器下執(zhí)行可能會有不同的結(jié)果。如果你的代碼要放到PyPy下執(zhí)行糊肠,就需要了解PyPy和CPython的不同點(diǎn)辨宠。

Jython

Jython是運(yùn)行在Java平臺上的Python解釋器,可以直接把Python代碼編譯成Java字節(jié)碼執(zhí)行货裹。

IronPython

IronPython和Jython類似嗤形,只不過IronPython是運(yùn)行在微軟.Net平臺上的Python解釋器,可以直接把Python代碼編譯成.Net的字節(jié)碼弧圆。

1.12赋兵、Python發(fā)展史

  • 1989年,為了打發(fā)圣誕節(jié)假期搔预,Guido開始寫Python語言的編譯器霹期。Python這個(gè)名字,來自Guido所摯愛的電視劇Monty Python’s Flying Circus拯田。他希望這個(gè)新的叫做Python的語言历造,能符合他的理想:創(chuàng)造一種C和shell之間,功能全面,易學(xué)易用吭产,可拓展的語言侣监。
  • 1991年,第一個(gè)Python編譯器誕生臣淤。它是用C語言實(shí)現(xiàn)的达吞,并能夠調(diào)用C語言的庫文件。從一出生荒典,Python已經(jīng)具有了:類,函數(shù)吞鸭,異常處理寺董,包含表和詞典在內(nèi)的核心數(shù)據(jù)類型,以及模塊為基礎(chǔ)的拓展系統(tǒng)刻剥。
  • Granddaddy of Python web frameworks, Zope 1 was released in 1999
  • Python 1.0 - January 1994 增加了 lambda, map, filter and reduce.
  • Python 2.0 - October 16, 2000遮咖,加入了內(nèi)存回收機(jī)制,構(gòu)成了現(xiàn)在Python語言框架的基礎(chǔ)
  • Python 2.4 - November 30, 2004, 同年目前最流行的WEB框架Django 誕生
  • Python 2.5 - September 19, 2006
  • Python 2.6 - October 1, 2008
  • Python 2.7 - July 3, 2010
  • In November 2014, it was announced that Python 2.7 would be supported until 2020, and reaffirmed that there would be no 2.8 release as users were expected to move to Python 3.4+ as soon as possible
  • Python 3.0 - December 3, 2008
  • Python 3.1 - June 27, 2009
  • Python 3.2 - February 20, 2011
  • Python 3.3 - September 29, 2012
  • Python 3.4 - March 16, 2014
  • Python 3.5 - September 13, 2015

1.13造虏、Python 2與3的詳細(xì)區(qū)別?

In summary : Python 2.x is legacy, Python 3.x is the present and future of the language

PRINT IS A FUNCTION

ALL IS UNICODE NOW

某些庫改名了

Old Name New Name
_winreg winreg
ConfigParser configparser
copy_reg copyreg
Queue queue
SocketServer socketserver
markupbase _markupbase
repr reprlib
test.test_support test.support

還有誰不支持PYTHON3?

One popular module that don't yet support Python 3 is Twisted (for networking and other applications). Most

actively maintained libraries have people working on 3.x support. For some libraries, it's more of a priority than

others: Twisted, for example, is mostly focused on production servers, where supporting older versions of

Python is important, let alone supporting a new version that includes major changes to the language. (Twisted is

a prime example of a major package where porting to 3.x is far from trivial

1.14御吞、一切皆對象

對于Python,一切事物都是對象漓藕,對象基于類創(chuàng)建

image

所以陶珠,以下這些值都是對象: "wupeiqi"、38享钞、['北京', '上海', '深圳']揍诽,并且是根據(jù)不同的類生成的對象。

image
image
image

1.15栗竖、小結(jié)

Python的解釋器很多暑脆,但使用最廣泛的還是CPython。如果要和Java或.Net平臺交互狐肢,最好的辦法不是用Jython或IronPython添吗,而是通過網(wǎng)絡(luò)調(diào)用來交互,確保各程序之間的獨(dú)立性份名。

二碟联、Python安裝

2.1、Windows

下載安裝包
    https://www.python.org/downloads/
安裝
    默認(rèn)安裝路徑:C:\python27
配置環(huán)境變量
    【右鍵計(jì)算機(jī)】--》【屬性】--》【高級系統(tǒng)設(shè)置】--》【高級】--》【環(huán)境變量】--》【在第二個(gè)內(nèi)容框中找到 變量名為Path 的一行僵腺,雙擊】 --> 【Python安裝目錄追加到變值值中玄帕,用 ; 分割】
    如:原來的值;C:\python27想邦,切記前面有分號

2.2裤纹、Linux、Mac

無需安裝,原裝Python環(huán)境
ps:如果自帶2.6鹰椒,請更新至2.7

三锡移、Hello World程序

3.1、Hello World程序

在linux 下創(chuàng)建一個(gè)文件叫hello.py,并輸入漆际,然后執(zhí)行命令:python hello.py ,輸出

echo "print("Hello World!")" > hello.py
python hello.py
  Hello World!

3.2淆珊、指定解釋器

上一步中執(zhí)行 python hello.py 時(shí),明確的指出 hello.py 腳本由 python 解釋器來執(zhí)行奸汇。

如果想要類似于執(zhí)行shell腳本一樣執(zhí)行python腳本施符,例: ./hello.py,那么就需要在 hello.py 文件的頭部指定解釋器擂找,如下:

#!/usr/bin/env python

print "hello,world"

如此一來戳吝,執(zhí)行: ./hello.py 即可。

ps:執(zhí)行前需給予 hello.py 執(zhí)行權(quán)限贯涎,chmod 755 hello.py

在交互器中執(zhí)行

除了把程序?qū)懺谖募锾蓿€可以直接調(diào)用python自帶的交互器運(yùn)行代碼,

python
>>> print("Hello World!")
Hello World!

對比下其它語言的hello world

#include <iostream>
int main(void)
{
    std::cout<<"Hello world";
}
#include <stdio.h>
int main(void)
{
    printf("\nhello world!");
    return 0;
}
public class HelloWorld{
    // 程序的入口
    public static void main(String args[]){
        // 向控制臺輸出信息
        System.out.println("Hello World!");
    }
}
<?php
    echo "hello world!";
?>
puts "Hello world."
package main
import "fmt"
func main()
{
    fmt.Printf("Hello World!\n God Bless You!");
}

四塘雳、字符編碼

4.1陆盘、ASCII碼

python解釋器在加載 .py 文件中的代碼時(shí),會對內(nèi)容進(jìn)行編碼(默認(rèn)ascill)

ASCII(American Standard Code for Information Interchange败明,美國標(biāo)準(zhǔn)信息交換代碼)是基于拉丁字母的一套電腦編碼系統(tǒng)隘马,主要用于顯示現(xiàn)代英語和其他西歐語言,其最多只能用 8 位來表示(一個(gè)字節(jié))妻顶,即:2**8 = 256-1祟霍,所以,ASCII碼最多只能表示 255 個(gè)符號盈包。

image

4.2沸呐、中文編碼

為了處理漢字,程序員設(shè)計(jì)了用于簡體中文的GB2312和用于繁體中文的big5呢燥。

GB2312編碼

GB2312(1980年)一共收錄了7445個(gè)字符崭添,包括6763個(gè)漢字和682個(gè)其它符號。漢字區(qū)的內(nèi)碼范圍高字節(jié)從B0-F7叛氨,低字節(jié)從A1-FE呼渣,占用的碼位是72*94=6768。其中有5個(gè)空位是D7FA-D7FE寞埠。

GBK和GB18030編碼

GB2312 支持的漢字太少屁置。1995年的漢字?jǐn)U展規(guī)范GBK1.0收錄了21886個(gè)符號,它分為漢字區(qū)和圖形符號區(qū)仁连。漢字區(qū)包括21003個(gè)字符蓝角。2000年的 GB18030是取代GBK1.0的正式國家標(biāo)準(zhǔn)阱穗。該標(biāo)準(zhǔn)收錄了27484個(gè)漢字,同時(shí)還收錄了藏文使鹅、蒙文揪阶、維吾爾文等主要的少數(shù)民族文字。現(xiàn)在的PC平臺必須支持GB18030患朱,對嵌入式產(chǎn)品暫不作要求鲁僚。所以手機(jī)、MP3一般只支持GB2312裁厅。

從ASCII冰沙、GB2312、GBK 到GB18030执虹,這些編碼方法是向下兼容的拓挥,即同一個(gè)字符在這些方案中總是有相同的編碼,后面的標(biāo)準(zhǔn)支持更多的字符声畏。在這些編碼中,英文和中文可以統(tǒng)一地處理姻成。區(qū)分中文編碼的方法是高字節(jié)的最高位不為0插龄。按照程序員的稱呼,GB2312科展、GBK到GB18030都屬于雙字節(jié)字符集 (DBCS)均牢。

有的中文Windows的缺省內(nèi)碼還是GBK,可以通過GB18030升級包升級到GB18030才睹。不過GB18030相對GBK增加的字符徘跪,普通人是很難用到的,通常我們還是用GBK指代中文Windows內(nèi)碼琅攘。

Unicode碼

顯然ASCII碼無法將世界上的各種文字和符號全部表示垮庐,所以,就需要新出一種可以代表所有字符和符號的編碼坞琴,即:Unicode

Unicode(統(tǒng)一碼哨查、萬國碼、單一碼)是一種在計(jì)算機(jī)上使用的字符編碼剧辐。Unicode 是為了解決傳統(tǒng)的字符編碼方案的局限而產(chǎn)生的寒亥,它為每種語言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,規(guī)定雖有的字符和符號最少由 16 位來表示(2個(gè)字節(jié))泉粉,即:2 **16 = 65536魏颓,
注:此處說的的是最少2個(gè)字節(jié)吁朦,可能更多

UTF-8碼

UTF-8,是對Unicode編碼的壓縮和優(yōu)化加勤,他不再使用最少使用2個(gè)字節(jié),而是將所有的字符和符號進(jìn)行分類:ascii碼中的內(nèi)容用1個(gè)字節(jié)保存、歐洲的字符用2個(gè)字節(jié)保存胸竞,東亞的字符用3個(gè)字節(jié)保存...

所以欺嗤,python解釋器在加載 .py 文件中的代碼時(shí),會對內(nèi)容進(jìn)行編碼(默認(rèn)ascill)卫枝,如果是如下代碼的話:

報(bào)錯:ascii碼無法表示中文

#!/usr/bin/env python
print "你好煎饼,世界"

改正:應(yīng)該顯示的告訴python解釋器,用什么編碼來執(zhí)行源代碼校赤,即:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
print "你好吆玖,世界"

4.4、進(jìn)制

4.5翅阵、計(jì)算機(jī)內(nèi)存地址和為什么用16進(jìn)制?

為什么用16進(jìn)制

1迁央、計(jì)算機(jī)硬件是0101二進(jìn)制的掷匠,16進(jìn)制剛好是2的倍數(shù),更容易表達(dá)一個(gè)命令或者數(shù)據(jù)岖圈。十六進(jìn)制更簡短讹语,因?yàn)閾Q算的時(shí)候一位16進(jìn)制數(shù)可以頂4位2進(jìn)制數(shù),也就是一個(gè)字節(jié)(8位進(jìn)制可以用兩個(gè)16進(jìn)制表示)

2蜂科、最早規(guī)定ASCII字符集采用的就是8bit(后期擴(kuò)展了,但是基礎(chǔ)單位還是8bit)顽决,8bit用2個(gè)16進(jìn)制直接就能表達(dá)出來,不管閱讀還是存儲都比其他進(jìn)制要方便
3导匣、計(jì)算機(jī)中CPU運(yùn)算也是遵照ASCII字符集才菠,以16、32贡定、64的這樣的方式在發(fā)展鸠儿,因此數(shù)據(jù)交換的時(shí)候16進(jìn)制也顯得更好
4、為了統(tǒng)一規(guī)范厕氨,CPU进每、內(nèi)存、硬盤我們看到都是采用的16進(jìn)制計(jì)算

16進(jìn)制用在哪里
1命斧、網(wǎng)絡(luò)編程田晚,數(shù)據(jù)交換的時(shí)候需要對字節(jié)進(jìn)行解析都是一個(gè)byte一個(gè)byte的處理,1個(gè)byte可以用0xFF兩個(gè)16進(jìn)制來表達(dá)国葬。通過網(wǎng)絡(luò)抓包贤徒,可以看到數(shù)據(jù)是通過16進(jìn)制傳輸?shù)摹?br> 2芹壕、數(shù)據(jù)存儲,存儲到硬件中是0101的方式接奈,存儲到系統(tǒng)中的表達(dá)方式都是byte方式

3踢涌、一些常用值的定義,比如:我們經(jīng)常用到的html中color表達(dá)序宦,就是用的16進(jìn)制方式睁壁,4個(gè)16進(jìn)制位可以表達(dá)好幾百萬的顏色信息。

五互捌、數(shù)據(jù)類型初識

5.1潘明、int(整型)

在32位機(jī)器上,整數(shù)的位數(shù)為32位秕噪,取值范圍為-2的31次方~2的31-1次方钳降,即-2147483648~2147483647
在64位系統(tǒng)上,整數(shù)的位數(shù)為64位腌巾,取值范圍為-2的63次方~2的63-1次方遂填,即-9223372036854775808~9223372036854775807

5.2、long(長整型)

跟C語言不同澈蝙,Python的長整數(shù)沒有指定位寬吓坚,即:Python沒有限制長整數(shù)數(shù)值的大小,但實(shí)際上由于機(jī)器內(nèi)存有限碉克,我們使用的長整數(shù)數(shù)值不可能無限大凌唬。

注意并齐,自從Python2.2起漏麦,如果整數(shù)發(fā)生溢出,Python會自動將整數(shù)數(shù)據(jù)轉(zhuǎn)換為長整數(shù)况褪,所以如今在長整數(shù)數(shù)據(jù)后面不加字母L也不會導(dǎo)致嚴(yán)重后果了撕贞。

5.3、float(浮點(diǎn)型)

? 先掃盲 http://www.cnblogs.com/alex3714/articles/5895848.html 浮點(diǎn)數(shù)用來處理實(shí)數(shù)测垛,即帶有小數(shù)的數(shù)字捏膨。類似于C語言中的double類型,占8個(gè)字節(jié)(64位)食侮,其中52位表示底号涯,11位表示指數(shù),剩下的一位表示符號锯七。

5.4链快、complex(復(fù)數(shù))

復(fù)數(shù)由實(shí)數(shù)部分和虛數(shù)部分組成,一般形式為x+yj眉尸,其中的x是復(fù)數(shù)的實(shí)數(shù)部分域蜗,y是復(fù)數(shù)的虛數(shù)部分巨双,這里的x和y都是實(shí)數(shù)。

注:Python中存在小數(shù)字池:-5 ~ 257

5.5霉祸、布爾值

真或假

1 或 0

5.6筑累、字符串(str)

name = "alex"

萬惡的字符串拼接

python中的字符串在C語言中體現(xiàn)為是一個(gè)字符數(shù)組,每次創(chuàng)建字符串時(shí)候需要在內(nèi)存中開辟一塊連續(xù)的空丝蹭,并且一旦需要修改字符串的話慢宗,就需要再次開辟空間,萬惡的+號每出現(xiàn)一次就會在內(nèi)從中重新開辟一塊空間半夷。

字符串格式化輸出

name = "alex"
print "i am %s " % name

#輸出: i am alex

PS: 字符串是 %s;整數(shù) %d;浮點(diǎn)數(shù)%f

字符串常用功能:

  • 移除空白
  • 分割
  • 長度
  • 索引
  • 切片

5.7婆廊、bytes類型

由于Python的字符串類型是str,在內(nèi)存中以Unicode表示巫橄,一個(gè)字符對應(yīng)若干個(gè)字節(jié)淘邻。如果要在網(wǎng)絡(luò)上傳輸,或者保存到磁盤上湘换,就需要把str變?yōu)橐宰止?jié)為單位的bytes宾舅。Python對bytes類型的數(shù)據(jù)用帶b前綴的單引號或雙引號表示:

name = b'alex'
print(name,type(name)

b'alex' <class 'bytes'>

要注意區(qū)分'ABC'和b'ABC',前者是str,后者雖然內(nèi)容顯示得和前者一樣,但bytes的每個(gè)字符都只占用一個(gè)字節(jié)

5.8彩倚、列表

創(chuàng)建列表:

name_list = ['alex', 'seven', 'eric']
或
name_list = list(['alex', 'seven', 'eric'])

基本操作:

  • 索引
  • 切片
  • 追加
  • 刪除
  • 長度
  • 切片
  • 循環(huán)
  • 包含

5.9筹我、元組(不可變列表)

創(chuàng)建元組

ages = (11, 22, 33, 44, 55)
或
ages = tuple((11, 22, 33, 44, 55))

5.10、字典(無序)

創(chuàng)建字典

person = {"name": "mr.wu", 'age': 18}
或
person = dict({"name": "mr.wu", 'age': 18})

常用操作

  • 索引
  • 新增
  • 刪除
  • 鍵帆离、值蔬蕊、鍵值對
  • 循環(huán)
  • 長度

六、變量

Variables are used to store information to be referenced and manipulated in a computer program. They also provide a way of labeling data with a descriptive name, so our programs can be understood more clearly by the reader and ourselves. It is helpful to think of variables as containers that hold information. Their sole purpose is to label and store data in memory. This data can then be used throughout your program.

6.1哥谷、聲明變量

#_*_coding:utf-8_*_

name = "Alex Li"

上述代碼聲明了一個(gè)變量岸夯,變量名為: name,變量name的值為:"Alex Li"

6.2们妥、變量定義的規(guī)則

  • 變量名只能是 字母猜扮、數(shù)字或下劃線的任意組合
  • 變量名的第一個(gè)字符不能是數(shù)字
  • 以下關(guān)鍵字不能聲明為變量名
    ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']

6.3、變量的賦值

name = "Alex Li"
name2 = name
print(name,name2)
name = "Jack"
print("What is the value of name2 now?")

七监婶、數(shù)據(jù)運(yùn)算

7.1旅赢、算數(shù)運(yùn)算

image

7.2、比較運(yùn)算

image

7.3惑惶、賦值運(yùn)算

image

7.4煮盼、邏輯運(yùn)算

image

7.5、成員運(yùn)算

image

7.6带污、身份運(yùn)算

image

7.7僵控、位運(yùn)算

image
#!/usr/bin/python

a = 60            # 60 = 0011 1100
b = 13            # 13 = 0000 1101
c = 0

c = a & b;        # 12 = 0000 1100
print "Line 1 - Value of c is ", c

c = a | b;        # 61 = 0011 1101
print "Line 2 - Value of c is ", c

c = a ^ b;        # 49 = 0011 0001 #相同為0,不同為1
print "Line 3 - Value of c is ", c

c = ~a;           # -61 = 1100 0011
print "Line 4 - Value of c is ", c

c = a << 2;       # 240 = 1111 0000
print "Line 5 - Value of c is ", c

c = a >> 2;       # 15 = 0000 1111
print "Line 6 - Value of c is ", c

**按位取反運(yùn)算規(guī)則(按位取反再加1) 詳解http://blog.csdn.net/wenxinwukui234/article/details/42119265

7.8刮刑、三元運(yùn)算

三元運(yùn)算符就是在賦值變量的時(shí)候喉祭,可以直接加判斷养渴,然后賦值

如果條件為真:result = 值1

如果條件為假:result = 值2

a = 1
b = 2
c = a if a>1 else b #如果a大于1的話,c=a泛烙,否則c=b

7.9理卑、運(yùn)算符優(yōu)先級:

image

更多內(nèi)容:猛擊這里

八、模塊初識

Python的強(qiáng)大之處在于他有非常豐富和強(qiáng)大的標(biāo)準(zhǔn)庫和第三方庫蔽氨,幾乎你想實(shí)現(xiàn)的任何功能都有相應(yīng)的Python庫支持藐唠,以后的課程中會深入講解常用到的各種庫,現(xiàn)在鹉究,我們先來象征性的學(xué)2個(gè)簡單的宇立。

8.1、sys模塊

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
print(sys.argv)

#輸出
$ python test.py helo world
['test.py', 'helo', 'world']  #把執(zhí)行腳本時(shí)傳遞的參數(shù)獲取到了

8.2自赔、os模塊

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os

os.system("df -h") #調(diào)用系統(tǒng)命令

完全結(jié)合一下

import os,sys

os.system(''.join(sys.argv[1:])) #把用戶的輸入的參數(shù)當(dāng)作一條命令交給os.system來執(zhí)行

8.3妈嘹、python tab補(bǔ)全模塊

for mac

import sys
import readline
import rlcompleter

if sys.platform == 'darwin' and sys.version_info[0] == 2:
    readline.parse_and_bind("bind ^I rl_complete")
else:
    readline.parse_and_bind("tab: complete")  # linux and python3 on mac

for linux

#!/usr/bin/env python
# python startup file
import sys
import readline
import rlcompleter
import atexit
import os
# tab completion
readline.parse_and_bind('tab: complete')
# history file
histfile = os.path.join(os.environ['HOME'], '.pythonhistory')
try:
    readline.read_history_file(histfile)
except IOError:
    pass
atexit.register(readline.write_history_file, histfile)
del os, histfile, readline, rlcompleter

寫完保存后就可以使用了

python
>>> import tab

你會發(fā)現(xiàn),上面自己寫的tab.py模塊只能在當(dāng)前目錄下導(dǎo)入绍妨,如果想在系統(tǒng)的何何一個(gè)地方都使用怎么辦呢润脸? 此時(shí)你就要把這個(gè)tab.py放到python全局環(huán)境變量目錄里啦,基本一般都放在一個(gè)叫 Python/2.7/site-packages 目錄下他去,這個(gè)目錄在不同的OS里放的位置不一樣毙驯,用 print(sys.path) 可以查看python環(huán)境變量列表。

九灾测、輸入和輸出

9.1爆价、鍵盤輸入可見密碼

#!/usr/bin/env python
#_*_coding:utf-8_*_

#name = raw_input("What is your name?") #only on python 2.x
name = input("What is your name?")
print("Hello " + name )

9.2、鍵盤輸入密碼不可見

輸入密碼時(shí)媳搪,如果想要不可見铭段,需要利用getpass 模塊中的 getpass方法,即:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import getpass

# 將用戶輸入的內(nèi)容賦值給 name 變量
pwd = getpass.getpass("請輸入密碼:")

# 打印輸入的內(nèi)容
print(pwd)

注釋

當(dāng)行注視:# 被注釋內(nèi)容

多行注釋:""" 被注釋內(nèi)容 """

十蛾号、表達(dá)式 if...else 判斷

10.1稠项、場景一涯雅、用戶登陸驗(yàn)證

# 提示輸入用戶名和密碼
# 驗(yàn)證用戶名和密碼
#     如果錯誤鲜结,則輸出用戶名或密碼錯誤
#     如果成功,則輸出 歡迎活逆,XXX!

#!/usr/bin/env python
# -*- coding: encoding -*-

import getpass

name = raw_input('請輸入用戶名:')
pwd = getpass.getpass('請輸入密碼:')

if name == "alex" and pwd == "cmd":
    print("歡迎精刷,alex!")
else:
    print("用戶名和密碼錯誤")

10.2蔗候、場景二怒允、猜年齡游戲

在程序里設(shè)定好你的年齡,然后啟動程序讓用戶猜測锈遥,用戶輸入后纫事,根據(jù)他的輸入提示用戶輸入的是否正確勘畔,如果錯誤,提示是猜大了還是小了

#!/usr/bin/env python
# -*- coding: utf-8 -*-

my_age = 28

user_input = int(input("input your guess num:"))

if user_input == my_age:
    print("Congratulations, you got it !")
elif user_input < my_age:
    print("Oops,think bigger!")
else:
    print("think smaller!")

外層變量丽惶,可以被內(nèi)層代碼使用,內(nèi)層變量炫七,不應(yīng)被外層代碼使用

十一、表達(dá)式 for 循環(huán)

11.1钾唬、最簡單的循環(huán)10次

#_*_coding:utf-8_*_
__author__ = 'Alex Li'

for i in range(10):
    print("loop:", i )

輸出:

loop: 0
loop: 1
loop: 2
loop: 3
loop: 4
loop: 5
loop: 6
loop: 7
loop: 8
loop: 9

11.2万哪、需求一

還是上面的程序,但是遇到小于5的循環(huán)次數(shù)就不走了抡秆,直接跳入下一次循環(huán)

for i in range(10):
    if i<5:
        continue #不往下走了,直接進(jìn)入下一次loop
    print("loop:", i )

11.3奕巍、需求二

還是上面的程序,但是遇到大于5的循環(huán)次數(shù)就不走了儒士,直接退出

for i in range(10):
    if i>5:
        break #不往下走了,直接跳出整個(gè)loop
    print("loop:", i )

十二的止、表達(dá)式 while 循環(huán)

12.1、鹤帕茫枯石爛代碼

有一種循環(huán)叫死循環(huán)冲杀,一經(jīng)觸發(fā),就運(yùn)行個(gè)天荒地老睹酌、喝ㄋ枯石爛。

count = 0
while True:
    print("你是風(fēng)兒我是沙,纏纏綿綿到天涯...",count)
    count +=1

其實(shí)除了時(shí)間憋沿,沒有什么是永恒的旺芽,死loop還是少寫為好

12.2、需求一

循環(huán)100次就退出

count = 0
while True:
    print("你是風(fēng)兒我是沙,纏纏綿綿到天涯...",count)
    count +=1
    if count == 100:
        print("去你媽的風(fēng)和沙,你們這些脫了褲子是人,穿上褲子是鬼的臭男人..")
        break

12.3辐啄、需求二

回到上面for 循環(huán)的例子采章,如何實(shí)現(xiàn)讓用戶不斷的猜年齡,但只給最多3次機(jī)會壶辜,再猜不對就退出程序悯舟。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

my_age = 28
count = 0
while count < 3:
    user_input = int(input("input your guess num:"))

    if user_input == my_age:
        print("Congratulations, you got it !")
        break
    elif user_input < my_age:
        print("Oops,think bigger!")
    else:
        print("think smaller!")
    count += 1 #每次loop 計(jì)數(shù)器+1
else:
    print("猜這么多次都不對,你個(gè)笨蛋.")

十三、作業(yè)

13.1砸民、作業(yè)一:博客

13.2抵怎、作業(yè)二:編寫登陸接口

  • 輸入用戶名密碼
  • 認(rèn)證成功后顯示歡迎信息
  • 輸錯三次后鎖定

13.3、作業(yè)三:多級菜單

  • 三級菜單
  • 可依次選擇進(jìn)入各子菜單
  • 所需新知識點(diǎn):列表岭参、字典
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末反惕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子演侯,更是在濱河造成了極大的恐慌姿染,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秒际,死亡現(xiàn)場離奇詭異悬赏,居然都是意外死亡狡汉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門闽颇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轴猎,“玉大人,你說我怎么就攤上這事进萄∧聿保” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵中鼠,是天一觀的道長可婶。 經(jīng)常有香客問我,道長援雇,這世上最難降的妖魔是什么矛渴? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮惫搏,結(jié)果婚禮上具温,老公的妹妹穿的比我還像新娘。我一直安慰自己筐赔,他們只是感情好铣猩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茴丰,像睡著了一般达皿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贿肩,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天峦椰,我揣著相機(jī)與錄音,去河邊找鬼汰规。 笑死汤功,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溜哮。 我是一名探鬼主播滔金,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茬射!你這毒婦竟也來了鹦蠕?” 一聲冷哼從身側(cè)響起冒签,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤在抛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后萧恕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刚梭,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肠阱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朴读。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屹徘。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖衅金,靈堂內(nèi)的尸體忽然破棺而出噪伊,到底是詐尸還是另有隱情,我是刑警寧澤氮唯,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布鉴吹,位于F島的核電站,受9級特大地震影響惩琉,放射性物質(zhì)發(fā)生泄漏豆励。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一瞒渠、第九天 我趴在偏房一處隱蔽的房頂上張望良蒸。 院中可真熱鬧,春花似錦伍玖、人聲如沸嫩痰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽始赎。三九已至,卻和暖如春仔燕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背五辽。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留罪郊,地道東北人悔橄。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓挣柬,卻偏偏與公主長得像邪蛔,于是被迫代替她去往敵國和親侧到。 傳聞我的和親對象是個(gè)殘疾皇子床牧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 一、python概述 1著蛙、什么是python? Python是一種解釋型顷蟆、面向?qū)ο笳寿恕討B(tài)數(shù)據(jù)類型的高級程序設(shè)計(jì)語言...
    帥氣的Lucky閱讀 440評論 0 0
  • 一、Python介紹 Python的創(chuàng)始人為吉多·范羅蘇姆(Guido van Rossum)漫贞。1989年的圣誕節(jié)...
    EC君_王磊閱讀 65,481評論 3 33
  • 目前Python主要應(yīng)用領(lǐng)域: 云計(jì)算: 云計(jì)算最火的語言迅脐, 典型應(yīng)用OpenStack WEB開發(fā): 眾多優(yōu)秀的...
    Clemente閱讀 973評論 0 1
  • 主語: 唐 白居易 《除蘇州刺史別洛城東花》詩:“亂雪千花落豌骏,新絲兩鬢生肯适。”
    Peregrination閱讀 347評論 0 0
  • 人世間,盡是無奈之事樱溉。 人生如此撩嚼,狗亦如此挖帘。 網(wǎng)上一網(wǎng)友講過一個(gè)他和一條流浪狗的故事: 幾年前拇舀,他參加從武漢到拉薩...
    悅?cè)灰恍?/span>閱讀 4,287評論 0 0