學(xué)習(xí)一門編程語(yǔ)言,通常是學(xué)習(xí)該語(yǔ)言的以下幾個(gè)部分的內(nèi)容:
掌握上面的內(nèi)容,就算是對(duì)一門編程語(yǔ)言入門了,剩下的就是不斷的在使用和總結(jié)中去提升了。本節(jié)我們先來(lái)說(shuō)一說(shuō)學(xué)習(xí)Python時(shí)的準(zhǔn)備工作以及Python的基礎(chǔ)語(yǔ)法。 本節(jié)內(nèi)容
一、Hello, World在任意一個(gè)目錄下創(chuàng)建一個(gè)hello.py文件,我們來(lái)輸出一個(gè)經(jīng)典語(yǔ)句"Hello World!"
執(zhí)行hello.py這個(gè)python腳本的方式是:
輸出為: Hello, World 當(dāng)然也可以直接進(jìn)入python解釋器交互式終端去執(zhí)行print("Hello, World"),如下圖所示:
二、Python 2.x or Python 3.x1. Python 2.x 與 Python 3.x之間的關(guān)系我們分別使用Python2.7 和 Python3.5的解釋器提供的交互式終端來(lái)分別執(zhí)行以下兩條指令:
通過(guò)上圖的執(zhí)行結(jié)果會(huì)發(fā)現(xiàn), 實(shí)際上,Python 3.0在2008年12月就已經(jīng)發(fā)布了,Python官方在2010年年中發(fā)布2.7時(shí)宣布,2.7將是Python 2.x的最后一個(gè)主發(fā)布版本。其實(shí)Python 2.7 是向Python 3.x的一個(gè)過(guò)渡版本,里面支持了一些Python 3.x的特性。 2014年11月,Python官方宣布Python 2.7將會(huì)被支持到2020年,并再次確認(rèn)了不會(huì)有Python 2.8發(fā)布,希望用戶盡快遷移到Python 3.4+ 。3.x正在處于積極開發(fā)狀態(tài),并且在過(guò)去5年里已經(jīng)發(fā)布了多個(gè)穩(wěn)定版本,包括2012年的3.3,2014年的3.4,2015年的3.5。這意味著最近所有的標(biāo)準(zhǔn)庫(kù)更新將默認(rèn)只能在Python 3.x中可用。 2. Python 2.x 與 Python 3.x 的主要區(qū)別:1) PRINT IS A FUNCTION在Python 3.x中,輸出語(yǔ)句需要使用print()函數(shù),該函數(shù)接收一個(gè)關(guān)鍵字參數(shù),以此來(lái)代替Python 2.x中的大部分特殊語(yǔ)法。下面是幾個(gè)對(duì)比項(xiàng):
2) ALL IS UNICODEPython 2.x中使用的默認(rèn)字符編碼為ASCII碼,要使用中文字符的話需要指定使用的字符編碼,如UTF-8;Python 3.x中使用的默認(rèn)字符編碼為Unicode,就不存在這個(gè)問(wèn)題了。 3) 多變量同時(shí)賦值問(wèn)題python 2.x中如果要給多個(gè)變量同時(shí)賦值,要求=號(hào)右邊的表達(dá)式返回結(jié)果的個(gè)數(shù)要與=號(hào)左邊接收值的變量個(gè)數(shù)相等,不能多,也不能少。如:
python 3.x中允許=號(hào)昨邊的變量數(shù)小于=號(hào)右邊表達(dá)式返回的結(jié)果的個(gè)數(shù),但是需要有1個(gè)且只能有1個(gè)字典類型的變量來(lái)接收多余的返回值。與python 2.x相同的是 python 3.x中=號(hào)左邊的變量數(shù)也是不能多與=號(hào)右邊表達(dá)式的返回值個(gè)數(shù),但是錯(cuò)誤提示語(yǔ)更清晰了。
4) 某些庫(kù)改名字了
5) 選擇Python 2 還是 Python 3呢?如果是要開發(fā)一個(gè)新項(xiàng)目,不用考慮與老項(xiàng)目的兼容問(wèn)題,最好是使用Python 3,因?yàn)榫拖馪ython官方說(shuō)的那樣,Python 3才是Python語(yǔ)言的將來(lái)?,F(xiàn)在很多第三方類庫(kù)已經(jīng)完成了或者正在積極完成對(duì)Python 3的支持,只是有些項(xiàng)目由于過(guò)于龐大,很難在短時(shí)間內(nèi)完成。我們需要考慮的最大問(wèn)題在于,新項(xiàng)目中是否存在必須的第三方類庫(kù),且該類庫(kù)當(dāng)前還不支持Python 3。如果不存在這個(gè)問(wèn)題,那堅(jiān)定的選擇Python 3吧。 三、變量與常量1. 變量這是只是簡(jiǎn)單說(shuō)下Python中變量的定義和使用,方便繼續(xù)下面的內(nèi)容。事實(shí)上,Python中變量的使用確實(shí)很簡(jiǎn)單:
2. 查看變量數(shù)據(jù)類型python定義變量無(wú)需指定變量類型,python解釋器會(huì)在運(yùn)行時(shí)自動(dòng)推斷變量的數(shù)據(jù)類型。我們可以通過(guò)type()方法來(lái)查看變量類型:
3. 常量事實(shí)上,Python中沒(méi)有語(yǔ)法約束下的常量,僅僅是用完全大寫字母的變量來(lái)表示這個(gè)變量不應(yīng)該被改變。
四、接收用戶輸入很多時(shí)候都需要與用戶進(jìn)行交互,通過(guò)用戶輸入的內(nèi)容來(lái)做下一步操作。這里需要說(shuō)明的是,Python 2 與Python 3中接收用戶輸入的方法是不一樣的。 1. Python 2Python 2中接收用戶輸入時(shí),主要使用的是raw_input()函數(shù):
2. Python 3Python 3中接收用戶輸入時(shí),主要使用的是input()函數(shù):
3. 說(shuō)明
五、 指定字符編碼與解釋器1. 字符編碼的作用計(jì)算機(jī)只認(rèn)識(shí)0和1組成的二進(jìn)制序列,因此任何文件中的內(nèi)容要想被計(jì)算機(jī)識(shí)別或者想存儲(chǔ)在計(jì)算機(jī)上都需要轉(zhuǎn)換為二進(jìn)制序列。那么字符與二進(jìn)制序列怎么進(jìn)行想換轉(zhuǎn)換呢?于是人們嘗試建立一個(gè)表格來(lái)存儲(chǔ)一個(gè)字符與一個(gè)二進(jìn)制序列的對(duì)應(yīng)關(guān)系。
2. 字符編碼的簡(jiǎn)單發(fā)展過(guò)程1) ASCII碼誕生最早建立這個(gè)字符與十進(jìn)制數(shù)字對(duì)應(yīng)的關(guān)系的是美國(guó),這張表被稱為ASCII碼(American Standard Code for Information Interface, 美國(guó)標(biāo)準(zhǔn)信息交換代碼)。ASCII碼是基于拉丁字母的一套電腦編程系統(tǒng),主要用于顯示現(xiàn)代英語(yǔ)和其他西歐語(yǔ)言。它被設(shè)計(jì)為用1個(gè)字節(jié)來(lái)表示一個(gè)字符,所以ASCII碼表最多只能表示2**8=256個(gè)字符。實(shí)際上ASCII碼表中只有128個(gè)字符,剩余的128個(gè)字符是預(yù)留擴(kuò)展用的。 2) GBK等各國(guó)編碼誕生隨著計(jì)算機(jī)的普及和發(fā)展,很過(guò)國(guó)家都開始使用計(jì)算機(jī)。大家發(fā)現(xiàn)ASCII碼預(yù)留的128個(gè)位置根本無(wú)法存儲(chǔ)自己國(guó)家的文字和字符,因此各個(gè)國(guó)家開始制定各自的字符編碼表,其中中國(guó)的的字符編碼表有GB2312和GBK。 3) Unicode誕生后來(lái)隨著世界互聯(lián)網(wǎng)的形成和發(fā)展,各國(guó)的人們開始有了互相交流的需要。但是這個(gè)時(shí)候就存在一個(gè)問(wèn)題,每個(gè)國(guó)家所使用的字符編碼表都是不同的。比如我們發(fā)送一句“你好,我好喜歡你演的愛情動(dòng)作電影!”給島國(guó)的倉(cāng)老師,蒼老師電腦上用的是日本的字符編碼表,因此她的電腦無(wú)法正確顯示我們發(fā)送的內(nèi)容。這個(gè)時(shí)候,人們希望有一個(gè)世界統(tǒng)一的字符編碼表來(lái)存放所有國(guó)家所使用的文字和符號(hào),這就是Unicode。Unicode又被稱為 統(tǒng)一碼、萬(wàn)國(guó)碼、單一碼,它是為了解決傳統(tǒng)的字符編碼方案的局限性而產(chǎn)生的,它為每種語(yǔ)言中的每個(gè)字符設(shè)定了統(tǒng)一并且為之一的二進(jìn)制編碼。Unicode規(guī)定所有的字符和符號(hào)最少由2個(gè)字節(jié)(16位)來(lái)表示,所以Unicode碼可以表示的最少字符個(gè)數(shù)為2**16=65536。 4) UTF-8誕生為什么已經(jīng)有了Unicode還要UTF-8呢?這是由于當(dāng)時(shí)存儲(chǔ)設(shè)備是非常昂貴的,而Unicode中規(guī)定所有字符最少要由2個(gè)字節(jié)表示。人們認(rèn)為像原來(lái)ASCII碼中的字符用1個(gè)字節(jié)就可以了,因此人們決定創(chuàng)建一個(gè)新的字符編碼來(lái)節(jié)省存儲(chǔ)空間。UTF-8是對(duì)Unicode編碼的壓縮和優(yōu)化,它不在要求最少使用2個(gè)字節(jié),而是將所有字符和符號(hào)進(jìn)行分類:
UTF-8是目前最常用,也是被推薦使用的字符編碼。 3. Python中的字符編碼問(wèn)題我們上面提到過(guò),一般在兩個(gè)地方會(huì)用到字符編碼:
磁盤寫入或讀取數(shù)據(jù)時(shí)使用的字符編碼是由編輯器指定的工程或文件的字符編碼決定的,這與Python解釋器是無(wú)關(guān)的;但是Python程序執(zhí)行時(shí),將Python腳本文件加載到內(nèi)存時(shí)所使用的字符編碼是主要問(wèn)題所在。在Python 2中,Python解釋器默認(rèn)使用的是ASCII碼,此時(shí)如果要運(yùn)行的程序中如果有中文Python解釋器就會(huì)報(bào)錯(cuò)。
這是因?yàn)镻ython解釋器執(zhí)行該程序時(shí)試圖從ASCII編碼表中查找中文字符對(duì)應(yīng)的二進(jìn)制序列,但是發(fā)現(xiàn)找不到。此時(shí)要想該程序正常運(yùn)行,就需要在python腳本文件的開始位置聲明該文件的所使用的字符編碼:
4. 指定python解釋器通常python腳本都是跑在Linux上的,為了讓python腳本文件可以像shell腳本那樣可以直接調(diào)用執(zhí)行,我們通常需要在python文件最開始的位置指定python解釋器:
不建議寫python解釋器的絕對(duì)路徑,如:
因?yàn)檫@樣寫的話,將來(lái)要想更換python解釋器是非常麻煩的。 六、注釋關(guān)于注釋,有兩個(gè)原則:
1. 塊注釋塊注釋,顧名思義,應(yīng)該是對(duì)一個(gè)代碼塊的注釋。顯然,對(duì)某個(gè)代碼塊的注釋信息應(yīng)該寫在這個(gè)代碼塊的前面,并且縮進(jìn)到與該代碼塊相同的級(jí)別。塊注釋的每一行都要以#號(hào)加上單個(gè)空格開始(注釋中的縮進(jìn)文本除外):
2. 行內(nèi)注釋如果要注釋的代碼塊只有一行代碼,且注釋信息也很短,也可以把直接注釋要寫在代碼的后面,這就是 行內(nèi)注釋 。行內(nèi)注釋要求代碼與#號(hào)之間至少要有2個(gè)空格,同時(shí)#號(hào)與注釋內(nèi)容之間至少要有1個(gè)空格。
另外,行內(nèi)注釋并不被推薦使用。 3. 文檔字符串(docstring)文檔字符串通常用來(lái)為某個(gè)模塊、函數(shù)、類或方法提供比注釋更詳細(xì)的使用說(shuō)明、注意事項(xiàng)、使用用例等幫助信息。文檔字符串以三個(gè)引號(hào)(單引號(hào)和雙引號(hào)都可以,通常都使用雙引號(hào))將字符串包起來(lái)。由于文檔字符串表現(xiàn)形式類似于Python的多行字符串,因此很多人把它當(dāng)做Python中的多行注釋來(lái)用。 PEP 276 中對(duì)“什么是好的文檔字符串的書寫格式”進(jìn)行了一些定義:
來(lái)看下Python 3中一些內(nèi)置函數(shù)的文檔字符串實(shí)例:
七、導(dǎo)入模塊當(dāng)Python內(nèi)置的核心模塊提供的功能無(wú)法滿足我們的需求時(shí)就需要導(dǎo)入外部模塊,而導(dǎo)入模塊的功能有兩種方式:
例如,要想查看或更改python查找模塊的路徑列表就需要使用sys模塊下的path變量;若需要執(zhí)行系統(tǒng)命令可以使用os模塊下的system()方法。
八、獲取python腳本執(zhí)行時(shí)傳入的參數(shù)我們?cè)趯憇hell腳本時(shí),經(jīng)常會(huì)通過(guò)接受執(zhí)行腳本時(shí)傳入的變量來(lái)做相應(yīng)的操作,來(lái)保證腳本的靈活性。比如我們要寫一個(gè)腳本來(lái)調(diào)用ping命令對(duì)指定的域名進(jìn)行ping測(cè)試,這時(shí)候顯然將域名當(dāng)做參數(shù)傳遞給腳本要比把域名寫死在腳本中靈活的多。shell中可以只用$1,$2這樣的特殊變量來(lái)獲取傳入的參數(shù),而python中需要用sys模塊下的argv變量來(lái)獲取。
編寫一個(gè)ping.py,內(nèi)容如下:
執(zhí)行該腳本,結(jié)果如下圖所示: 九、代碼塊在Java和C語(yǔ)言中用花括號(hào){}包起來(lái)的部分就是一個(gè)代碼塊,shell腳本中的代碼塊是由專門的開始和結(jié)束標(biāo)識(shí)的,而python中的代碼塊是靠“縮進(jìn)對(duì)齊”來(lái)表示的。下面我們分別一個(gè)if-else的條件判斷來(lái)對(duì)這幾個(gè)語(yǔ)言的代碼塊表示方式做一個(gè)對(duì)比: 1. Java
2. Shell
3. Python
十、Python的執(zhí)行過(guò)程與.pyc文件在之前的文章我們已經(jīng)解釋過(guò):Python是一個(gè)動(dòng)態(tài)的、強(qiáng)類型的、解釋型的編程語(yǔ)言。而實(shí)際上,解釋型語(yǔ)言與編譯型語(yǔ)言的界限正在變得模糊。包括Python在內(nèi)的很多高級(jí)編程語(yǔ)言,會(huì)將源代碼先編譯成特定類型的中間代碼,然后再由解釋器去執(zhí)行,這樣可以提高執(zhí)行效率。Python的解釋器同時(shí)也是生成Python中間代碼的編譯器,.pyc文件就是存放Python中間代碼的文件。執(zhí)行Python代碼時(shí),如果該源碼文件導(dǎo)入了其他的.py文件,那么執(zhí)行過(guò)程中會(huì)自動(dòng)生成一個(gè)與導(dǎo)入的.py文件同名的.pyc文件。 |
|
來(lái)自: 夢(mèng)寒與鎖夢(mèng) > 《python》