Python學習-Python簡介和基礎入門
1.Python簡介
1.1 Python是什麼
相信混跡IT界的很多朋友都知道,Python是近年來最火的一個熱點,沒有之一。從性質上來講它和我們熟知的C、java、php等沒有什麼本質的區別,也是一種開發語言,而且已經進階到主流的二十多種開發語言的top 5
來頭不小啊!二十多種主流的開發語言,我該從哪一個開始呢?人生苦短,let‘s python!
我還是要推薦下我自己建立的Python學習交流群935711829,這是Python學習交流的地方,不管你是小白還是大牛,小編都歡迎,不定期分享乾貨,包括我整理的一份適合零基礎學習Python的資料和入門教程。
1.2 Python的由來和發展趨勢
Python的前世源自鼻祖“龜叔”。1989年,吉多·範羅蘇姆(Guido van Rossum)在阿姆斯特丹為了打發無聊的聖誕節,決心開發一個新的指令碼解釋程式,自此Python和創始人“龜叔”開始進入公眾視野。他希望這個新的叫做Python的語言,能符合他的理想:創造一種C和shell之間,功能全面,易學易用,可拓展的語言。
1991年,第一個Python編譯器誕生。它基於C語言實現,並能夠呼叫C語言的庫檔案。後面歷經版本的不斷換代革新,Python走到了非常具有里程碑意義的一個節點,即2004的2.4版本誕生了目前最流行的WEB框架Django!六年後Python發展到2.7版本,這是目前為止2.x版本中最新且較為廣泛使用版本。
2.7版本的誕生不同於以往2.x版本的垂直換代邏輯,它是2.x版本和3.x版本之間過渡的一個橋樑,以便最大程度上繼承3.x版本的新特性,同時儘量保持對2.x的相容性。
因此3.x版本在2.7版本之前就已經問世,從2008年的3.0版本開始,python3.x系呈迅猛發展之勢,版本更新活躍,一直髮展到現在最新的3.5.2版本。3.5版本也是目前3.x系列中主流且廣泛使用的版本,後續相關程式的demo,預設均基於3.5版本展開。
1.3 Python 2 VS Python 3
許多初學者會糾結於從2.x版本還是3.x版本開始python學習之路。這裡簡要對比下個人學習瞭解到的兩者的差異:
3.x版本中 PRINT IS A FUNCTION,使用起來更簡單方便;
3.x版本中預設使用unicode編碼,媽媽再也不用擔心你的程式編碼問題了;
3.x版本中某些庫進行了改名,具體還有待在後續學習中深入展開;
目前3.x版本還不能完全支援Twisted module,這恐怕是3.x版本中最大的遺憾。也不要過於糾結這點,據說官方正在彌補這個不足,同時也相信能有辦法解決的:)
In summary : Python 2.x is legacy, Python 3.x is the present and future of the language. 長江後浪推前浪,python的未來是屬於3.x系列的,官方宣佈2020年之後不再支援2.x系列中最nb的2.7版本,2.x版本將逐漸壽終正寢,最終被銘刻在開發語言的豐碑上。
所以學習3.x版本沒錯的!
1.4 Python的優缺點
二十多種主流開發語言,python何以能在20多年間以如此迅猛之勢橫掃七大洲八大洋呢?這都是它自身優良的特性決定的.
Python優點:
1.“優雅”、“明確”、“簡單”
這是python的定位,使得python程式看上去簡單易懂,初學者容易入門,學習成本更低。但隨著學習的不但深入,python一樣可以滿足勝任複雜場景的開發需求。引用一個說法,Python的哲學是就是簡單優雅,儘量寫容易看明白的程式碼,儘量寫少的程式碼。
2. 開發效率高
python作為一種高階語言,具有豐富的第三方庫,官方庫中也有相應的功能模組支援,覆蓋了網路、檔案、GUI、資料庫、文字等大量內容。因此開發者無需事必躬親,遇到主流的功能需求時可以直接呼叫,在基礎庫的基礎上施展拳腳,可以節省你很多功力和時間成本,大大降低開發週期。
3. 無需關注底層細節
Python作為一種高階開發語言,在程式設計時無需關注底層細節(如記憶體管理等)。
4. 功能強大
Python是一種前端後端通吃的綜合性語言,功能強大,php能勝任的角色它都能做,至於後端如何勝任,需要在後續學習中逐步領悟。
5. 可移植性
Python可以在多種主流的平臺上執行,開發程式時只要繞開對系統平臺的依賴性,則可以在無需修改的前提下執行在多種系統平臺上,具體有待後續學習中深入展開。其他優點有待繼續發掘。
一個硬幣總有兩面,那麼Python有缺點嗎?答案是肯定的,總結如下:
Python缺點:
1. 程式碼執行速度慢
因為Python是一種高階開發語言,不像c語言一樣可以深入底層硬體最大程度上挖掘榨取硬體的效能,因此它的執行速度要遠遠慢於c語言。另外一個原因是,Python是解釋型語言,你的程式碼在執行時會一行一行地翻譯成CPU能理解的機器碼,這個翻譯過程非常耗時,所以很慢。而C程式是執行前直接編譯成CPU能執行的機器碼,所以非常快。
但需要注意的是,這種慢對於不需要追求硬體高效能的應用場合來講根本不是問題,因為它們比較的數量級根本不是使用者能直觀感受到的!想想程式執行所需的時間數量級?例如開發一個下載MP3的網路應用程式,C程式的執行時間需要0.001秒,而Python程式的執行時間需要0.1秒,慢了100倍,但由於網路更慢,需要等待1秒,使用者體驗幾乎沒有差別,除非你用非常精確的計時器來計時。
2. 釋出程式時必須公開原始碼
什麼?有沒有搞錯?是的,釋出程式時我們必須公開原始碼!還是因為Python是一種解釋性語言,沒有編譯打包的過程(據說最新的python可以打包,但本質上還是把原始碼和直譯器打在一起,沒有太大實際意義)。想想我們的shell指令碼是不是也是這個情況,你能在不釋出原始碼的情況下發佈一個黑盒子程式來讓別人正常使用麼?
這個缺點僅限於你想單純靠賣開發出來的軟體產品掙錢的時候。但在這個開發互聯的時代,不靠賣產品本身來賺錢的商業模式越來越主流了,所以問題也不是沒法解決。
總結起來,Python的優點多於缺點,而且缺點在多數它能勝任的情況下不是根本性問題,瑕不掩瑜,盡情享受它給我們帶來的樂趣和便利吧!
1.5 Python的適用領域
Python典型的適用領域如下:
1. 雲端計算開發
雲端計算領域最火的語言,典型代表openstack。
2. web開發
眾多優秀的web框架,眾多優秀的大型web站點(Youtube,instagrm,豆瓣等)均基於python開發。
3. 系統運維
各種自動化工具的開發,CMDB、監控告警系統、堡壘機、配置管理&批量分發工具等均可以搞定。這是自己需要重點學習的領域。
4. 科學計算、人工智慧
據網上了解用於圍棋大戰的谷歌阿發狗就使用了python開發(但估計只是部分而已)。
5. 圖形GUI處理
暫時沒多少體會,後續領悟吧。
6. 網路爬蟲
不知道給網路爬蟲單獨歸類是否合適,姑且這樣吧。這年頭網路爬蟲無處不在,很多都是基於python開發,包括谷歌的爬蟲。估計這是爬蟲工程師的必備工具吧。
1.6 哪些地方在用Python
來幾個鮮活的知名公司應用案例,以示敬意:
谷歌:Google app engine、google earth、爬蟲、廣告等
Youtube: 世界最大的線上視訊網站基於python開發,好強大
Instagram:美國最大的圖片分享網站,全部基於python開發
facebook:大量的基礎庫基於python開發
Redhat:yum包管理工具基於python開發
國內知名網際網路公司的應用:豆瓣、知乎的網站,還有很多主流的網際網路公司(阿里、騰訊、百度、金山、搜狐、盛大、網易、新浪、網易、果殼、土豆等)通過python來完成各種任務。
2.Python基礎
2.1 程式設計開發規範
作為一門開發語言,python自然也有自己的程式設計規範,以下是特有且必須遵循的規範:
1. 程式碼開頭
python中程式碼必須頂格編寫,除非被作為語句巢狀在條件判斷或條件迴圈中。
2. 程式碼層級
程式碼與程式碼之間的邏輯層級關係(涉及邏輯判斷、包含關係等情況)通過空格來界定,第一層頂格編寫,第二層(被包含或者邏輯判斷後的執行動作)開頭預留4個空格(如果不考慮跨平臺可以使用tab)
3. 對齊方式
同一個層級的程式碼必須嚴格對齊,如第一層都是頂格,第二層都是4個空格開頭,第三層則是8個空格,以此類推。
4. 註釋
單行註釋用#開頭,單獨一行作為註釋或者在程式碼後面通過#跟上註釋均可,多行註釋在首尾處用成對的三引號引用即可,可以是成對的三個單引號或者三個雙引號。
5. 程式碼塊
目前來看if邏輯判斷和for迴圈條件後面均以冒號結尾,然後通過4個空格開始下一層級的實際執行動作語句編寫。這部分在冒號後面接上的語句稱為程式碼塊。
6. 程式命名
編寫的python程式必須以.py結尾。
7. 專案規範
啟動一個專案開發時先在開發工具中建立project,然後根據需要建立目錄,最後在目錄下建立當前活動的py程式。
2.2 變數
python中的變數也用於儲存臨時值以便後續靈活呼叫,在定義時只能使用字母、數字、下劃線的任意組合,且不能以數字開頭,不能以python內建的關鍵字來命名變數(如and,import,global,finally等,有待後續學習加深印象)。對變數進行字串型別的賦值時,字串需要用成對的引號引起來,可以是單引號、雙引號或者三引號。
建議通過以下兩種形式來定義較為複雜的變數,便於閱讀:
1. 駝峰體
即每個單詞的首字母大寫,其他小寫,如MappingTable
2. 下劃線
不同單詞之間通過下劃線分開,如mappting_table
2.3 字元編碼
字元編碼經歷了ASCII碼->unicode->UTF-8的演變過程,python 2.x預設使用ASCII編碼,而3.x預設使用UTF-8編碼。由於字元編碼事關重大,一言不合就會導致亂碼,因此強烈建議統一使用萬用的utf-8編碼。怎麼使用呢?
1. 程式開頭明確顯式定義
1 2 |
|
windows下程式設計可忽略第一行,但為了保留移植性建議始終宣告變數。
2. 在程式直譯器中選擇utf-8字元編碼
以上兩個條件缺一不可,雖然python 3.x版本預設使用utf-8編碼,但還是建議在程式中宣告編碼格式。
以上是結果,下面談談為什麼強烈建議使用urf-8編碼,以及為什麼utf-8編碼就可以通吃。
眾所周知計算機是美國人發明的,因此最早就只有包括所有字母的大小寫、數字、必要的特殊符號等合計才127個字元被編碼到計算機裡,這個編碼就是ASCII編碼。由於需要進行編碼的字元才有127個,因此用7個二進位制位就足以搞定了,但8個二進位制位才能構成一個完整的位元組,因此索性用8個二進位制位來進行編碼,剩餘的一位只好浪費掉。所以ASCCI碼只佔用一個字元。
隨著計算機技術的推廣和普及,其他不以英語為官方語言的國家也開始使用計算機了。那麼現在問題來了,一個位元組的8個bit位只能表示非常有限的字元(設計時只包括所有字母的大小寫、數字、必要的特殊符號,其中整數還不能超過255),既有的ASCII編碼表裡沒有包含其他國家的語言字元,但顯然也沒法強迫全球都使用英語,於是各個國家開始進行本土化改良,設計能滿足自己國家需要的編碼,如國內的GB2312。這裡的改良涉及兩個要點,一是原有的一個位元組的編碼空間要擴充為兩個位元組甚至更多,二是新的編碼還不能與既有的ASCII編碼衝突,否則老美要跟你捉急了!你可以想象,中國搞定了一套,日本也搞定了一套,接著是韓國、越南等巴拉巴拉,大家都有自己的編碼標準,各自為政,遇到多語言混合使用的場景這編碼表還不炸開鍋,連同計算機一起傻掉!這時Unicode應運而生。Unicode把所有語言都統一到一套編碼裡,用兩個甚至更多的位元組來進行編碼(通常用兩個位元組,搞不定時再喊人加砝碼呀),這樣就不會再有亂碼問題了。
Unicode搞定了多國語言亂碼和編碼統一的問題,但你會發現如果需要處理的內容全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的儲存空間,在儲存和傳輸上就不太經濟划算。OK,Unicode的演進改良版utf-8就是來解決這個問題的。utf-8的優勢在於它使用“可變長編碼”,在繼續沿用ASCII編碼基礎上來對1個位元組不能搞定的那些語言字元進行編碼設計,這樣英文還是用1個位元組,遇到中文就用3個或者更多的位元組來處理。這樣既可以保障空間和效能的最大化,還能兼顧老美的老巢和其他非英文的編碼相容問題,一舉三得!所以你會發現ASCII其實是utf-8的子集,utf-8向下相容。
2.4 Python直譯器
python是一門解釋性語言,自然不能缺瞭解釋器(類似於JVM)。官方支援Cpython、Jpython、Ironpython和pypy等,預設使用基於C語言實現的Cpython。它也是最為廣泛使用的直譯器。程式執行時會把.py檔案轉換成.pyc位元組碼檔案,然後執行在python虛擬機器上。
2.5 構建Python的開發環境
構建好包括直譯器(虛擬機器)和開發工具IDE在內的Python的開發環境才便於展開程式開發之旅。
其中直譯器(虛擬機器)從python官方下載安裝即可,需要注意的是建議安裝3.5版本,windows下安裝後需要把python的bin目錄和scripts目錄追加到系統環境變數path和使用者變數path中。我的win 7使用者不是以administor,補充追加了使用者變數後才能在cmd下傻瓜式地輸入python。linux下系統預設是2.x的版本,安裝3.5版本時需要先將舊版本重新命名為其他目錄(如python2.6)後再安裝,安裝完畢無需額外設定環境變數。
好的程式猿都得有自己好使的IDE,python程式建議使用pycharm工具來進行開發。從官網下載安裝社群版即可,需要注意的是選擇後本地的直譯器和專案的預設字元編碼。其他一些好玩的特性、快捷鍵等只有後續逐步體會了。
2.6 模組初識
python內建了很多模組,同時也可以自定義編寫一些好玩的模組,使用模組時需要通過關鍵字import匯入。匯入後python會從系統變數的路徑中從前往後一次查詢,首次成功查詢匹配後不再進行後續查詢。因此如果需要使用自定義模組,需要特別關注自定義模組的存放位置,底線是隻存放在系統變數的一個路徑下,否則可能得到意外的結果。
系統變數的路徑可通過以下方式檢視:
以上是windows下3.5版本的輸出結果,linux平臺或者其他版本的輸出有所差別,以實際為準。
2.7 使用者輸入和格式化輸出
使用者輸入通過input來實現,示例如下:
YourName=input("Please input you name here: ")
簡單的輸出通過print來實現,示例如下:
print("Hi,", YourName) #呼叫輸出上面使用者輸入的變數YourName
注意:
1. 3.x版本中input預設接收使用者輸入的型別為字串,如果需要使用其他的資料型別則需要進行轉換,如 UserAge=int(input("Please input your name:"))
2. print輸出中可以接上轉義符號\來實現更多的輸出顯示效果,如 \n表示換行,\t為製表符。
print的使用進階——字串的格式化輸出:
python中,對字串進行格式化輸出與c語言是相同的,即藉助%來實現。%s表示與字串替換,%d表示用整數替換,%f表示用浮點數替換,如果輸出的字串中本身就需要%(比如輸出比率),則需要用連續的兩個%%來輸出%。
示例程式如下:
1 2 3 4 5 |
|
從以上示例程式可看出,利用print進行格式化輸出的基本格式是在需要替換輸出的位置用%s,%d等佔位符,然後在後面通過%來接上實際替換後需要輸出的內容,如果需要替換輸出的元素不止一個,則需要在%後面通過一對圓括號把實際替換後需要輸出的內容包含進來,同時在每個元素之間用逗號隔開。
2.8 Python的執行邏輯
Python的執行工作邏輯如下:
記憶體載入程式碼->語法分析->直譯器載入->生成位元組碼->執行位元組碼->生成機器碼->CPU執行
3.開始你的Python開發之旅
3.1 第一個Python程式--HelloWorld
python的第一個程式也從hello world開始把:
1 2 3 |
|
執行結果:
"C:\Program Files\Python35\python.exe" D:/python/Day1/test/HelloWorld.py
Hello world!
Process finished with exit code 0
3.2 If-else判斷
3.2.1 If-else語法規範
以下是if-else判斷的語法結構規範
1 2 3 4 5 6 7 8 |
|
3.2.2 示例程式
以下為一個演示兩層if-else迴圈的程式:
1 2 3 4 5 6 7 8 9 10 11 |
|
說明:該示例程式僅為演示多層if-else的語法結構,程式本身的設計存在漏洞;空格縮排在pycharm IDE環境中會被自動處理,但在普通檔案編輯器中需要手動設定。 以下為改良版示例程式,通過引入對if的多條件判斷來避免上述程式的漏洞:
1 #!/usr/bin/env python 2 #! -*- coding:utf-8 -*- 3 username=input("Please input you username:\n") 4 passwd=input("Please input you password:\n") 5 if username == "Bob" and passwd == "password": 6 print("Welcome login, %s!" %username) 7 else: 8 print("Invalid username or password, please check your input!")
此時只有使用者名稱和密碼同時輸入正確了才會給出相應提示,否則均提示口令無效,避免暴力破解。
3.2.3 if-elif-else擴充套件
上述判斷均為單一式的if-else判斷,以下為if-elif-else的判斷擴充套件: 語法結構:
1 2 3 4 5 6 7 8 |
|
不過這種結構僅僅適用於單一條件存在多種case情況下,語法結構看起來還是比較簡單,當然頂格、左縮排4個空格和冒號這些規範一樣要遵循。 還是來一個示例程式加深理解:
1 2 3 4 5 6 7 8 9 |
|
3.3 For迴圈
3.3.1 for迴圈語法規範
For迴圈的基本語法規範是:
1 2 |
|
其中variable表示命名的變數,一般程式中使用i,j等等,XXX表示變化的範圍,可以是list列表,一般會考慮使用range函式,來表示一個整數序列,如range(5)就表示小於5的整數序列,即0-4。 語法規範中同樣需要for語句後面的結尾冒號,以及迴圈體中的4個空格的左縮排。
3.3.2 示例程式
猜數字遊戲,通過系統生成一個隨機數作為預設年齡,對使用者提供3次猜的機會,前兩次如果沒有猜中給出數字範圍大小的提示,如果第3次還沒有猜中則給予鼓勵提示,同時打印出這個預設的數字,當然三次當中有任何一次猜中會給使用者猜中提示的:
1 #!/usr/bin/env python 2 #! -*- coding:utf-8 -*- 3 import random #匯入隨機數模組 4 Age=random.randrange(10)#隨機生成一個小於10的整數(0-9,不包括負數),並賦值給Age 6 for i in range(3): 7 if i < 2: 8 guess_number=int(input("Please input the age of my dog you guess:\n")) 9 if guess_number > Age: 10 print("The age you guess is a little big, think smaller!\n") 11 elif guess_number < Age: 12 print("The age you guess is a little small, think bigger!\n") 13 else: 14 print("Bingo, you got the number,congratulations!\n") 15 break 16 else: 17 guess_number=int(input("Please input the age of my dog you guess:\n")) 18 if guess_number == Age: 19 print("Bingo, you got the number,congratulations!\n") 20 else: 21 print("Oh,you just got bad luck, come to try again, you can do it! The actual age of my dog is %d...\n"% Age)
注意:
1.為便於程式除錯可先對Age賦值固定的數字
2.前兩次如果猜中了就需要退出迴圈,這裡使用了break關鍵字,意思是跳出整個迴圈,與之相對應的還有continue關鍵字,用於跳出當次迴圈,二者的使用區別還有待進一步深入學習
OK,現在來改進下程式, 當用戶連續三次猜錯後繼續給機會,讓使用者選擇是繼續猜還是直接退出,如果繼續則再一次獲得三次猜的機會,如此迴圈下去。還是用for迴圈吧:
1 #!/usr/bin/env python 2 #! -*- coding:utf-8 -*- 3 Age=22 4 counter=0 5 for i in range(10): 6 if counter < 3: 7 guess_number=int(input("Plese input your guess number:\n")) 8 if guess_number == Age: 9 print("You got the number, congratulations!") 10 break 11 elif guess_number > Age: 12 print("The number you guessed is too big, guess a smaller one\n") 13 else: 14 print("The number you guessed is too small, guess a bigger one\n") 15 counter += 1 16 elif counter == 3: 17 continue_flag=input("Do you want to continue? Please type Y to continue or N to quit:\n ") 18 if continue_flag == "Y": 19 counter = 0 20 else: 21 print("Bye") 22 break 23 else: 24 print("You've tried too many times.")
這裡為了保證每一個輪迴中的第四次(上述程式中的第四次和第八次)能讓程式繼續迴圈,引入了另外一個變數來進行計數並重置。把for迴圈換作while迴圈看起來差不多:
1 #!/usr/bin/env python 2 #! -*- coding:utf-8 -*- 3 Age=22 4 i=0 5 counter=0 6 while counter < 10: 7 if i < 3: 8 guess_number=int(input("Plese input your guess number:\n")) 9 if guess_number == Age: 10 print("You got the number, congratulations!") 11 break 12 elif guess_number > Age: 13 print("The number you guessed is too big, guess a smaller one\n") 14 else: 15 print("The number you guessed is too small, guess a bigger one\n") 16 i += 1 17 else: 18 continue_flag=input("Do you want to continue? Please type Y to continue or N to quit:\n ") 19 if continue_flag == "Y": 20 i = 0 21 else: 22 print("Bye") 23 break 24 counter +=1
小結
1. Python是一門主流且發展迅猛的開發語言,目前存在2.x和3.x兩個版本分支,前端後端都能勝任,功能強大,在互利網公司應用廣泛,值得託付;
2. Python程式的開發需要安裝直譯器和IDE,建議使用pycharm,2.x和3.x下的預設字元編碼不同,永遠推薦使用utf-8編碼,包括程式編碼和解釋的編碼兩個層面;
3. 系統自帶模組和自定義編寫的模組均可以通過import匯入使用;
4. 在進行python程式開發時,注意程式碼需要分層體現,第一層程式碼頂格編寫,第二層(用在第一次出現的流程控制語句中的程式碼塊)左縮排4個空格;
5. input用於接收使用者輸入,預設輸入的資料型別是字串,可通過int關鍵字轉換為整數。print可進行簡單輸出,如要格式化輸出則需要藉助%s %d %f等來實現,具體視資料型別而定;
6. 流程控制語句if-else判斷和for、while迴圈都需要注意程式碼書寫格式,流程控制語句關鍵字一定是以冒號結尾,具體的流程控制程式碼塊則需要左縮排處理,第一層左縮排4個空格,第二層8個空格,以此類推;
7.continue和break可分別用於退出當前(當次)流程控制和整個迴圈,課堂上演示了在for迴圈中的使用,在if-else判斷中不能使用。