從能作什麼到如何去作,一文帶你快速掌握Python編程基礎與實戰

摘要:Python語言的教程雖然隨處可見,可是忙於平常業務/學習的你或許:一直想要「找個時間學一點」,可是又不知道該從何下手?本文將從Python能作什麼,如何學習Python以及Python的基礎知識爲你的Python之路點上一盞明燈。mysql

本文內容根據演講視頻以及PPT整理而成。算法

本文的分享主要圍繞如下幾個方面:sql

  1. Python能作什麼?(常見應用場景介紹)
  2. 如何學習Python?
  3. Python語法基礎實戰
  4. Python面向對象編程實戰
  5. 練熟基礎:2048小遊戲項目的實現與實戰

1、Python能作什麼?

clipboard.png

一種編程語言每每能夠應用於多方面,有些方面比較經常使用,有些方面極爲經常使用。上圖中標紅的部分是Python極爲經常使用的領域。首先,利用Python能夠進行簡單腳本編程,好比使用Python編寫2048小遊戲或12306的自動搶票軟件。其次,可使用Python進行系統編程,開發系統應用。第三點,Python一個較爲經常使用的功能就是開發網絡爬蟲。網絡爬蟲的用途是進行數據採集,也就是將互聯網中的數據採集過來。網絡爬蟲的難點其實並不在於爬蟲自己,因爲網站方爲了不被爬取回採起各類各樣的反爬蟲措施,而若是想要繼續從網站爬取數據就須要解決這些反爬蟲措施,因此網絡爬蟲的難點在於反爬的攻克和處理。第四點,Python極經常使用於WEB開發,能夠藉助Python開發WEB站點,好比我的博客、在線教育網站以及論壇等。第五點,在運維方面,Python能夠用於自動化運維,能夠經過寫Python腳本實現對於服務器集羣進行自動化管理。第六點,Python能夠用於網絡編程,好比Socket編程等。第七點,Python極經常使用的一個方向就是數據挖掘、機器學習等大數據與人工智能領域方向的程序開發,好比在人工智能領域,使用Python就能夠很容易地實現算法模型,而且藉助Python能夠很容易地處理相應的數據。數據庫

做爲系列文章的首篇,本文將爲你們分享Python的基礎知識。而學習Python基礎的第一步就是認識Python能夠幹什麼,經過上面的內容,你們能夠了解到Python語言能夠作不少事情,或者能夠說Python基本上是一門全能的語言。Python在各個領域都很優秀,而最重要的一點就是Python比較易學。綜上所述,Python是一門很是棒的語言。編程

2、如何學習Python?

首先與你們分享一些方法論,究竟應該如何學習Python?其實學習任何一門知識,方法都是相似的,有些同窗習慣直接看書或看視頻,這些方法都不錯,可是在學習的過程當中須要掌握一些技巧,這樣學習起來會事半功倍。數組

成體系地學,不搞「題海戰術」安全

首先,要學就要成體系地學,不搞「題海戰術」。遇到新知識就去查,而後就知道了,反覆這樣就是所謂的「題海戰術」,這樣作的好處就是用到了就會去尋找,可是缺點就是腦海裏面的知識體系會很是亂,並且越學越亂,由於太多東西在腦海中不成體系地堆積致使很是難以利用,因此須要成體系地學習。所謂成體系地學習,就好比在學習基礎時能夠先掌握數據類型、控制結構、函數以及模塊等,將這些知識造成體系。構建知識體系就像寫書同樣,在寫書的過程當中不可能想到哪裏就寫到哪裏,而應該有一個大體的框架。成體系地學習的好處就是不管怎樣學習都不會亂。並且最開始的體系不必定是很是完備的,好比在剛開始學習編程語言的時候可能並不知道迭代器和生成器,但這並不會影響知識體系的創建,而在後續學到迭代器和生成器的時候,再將這一部分的知識加入到知識體系中就能夠了。可是這樣的前提就是在腦海中必定要有一個很是清晰的體系結構,學到的新知識均可以納入到體系中,若是遇到了知識體系中沒有的內容就能夠對應地進行補充,這樣就造成了很是清晰的體系結構,這樣的學習方法收益會比較大。服務器

不只要「摹」,還要「臨」網絡

其次,不只要「摹」,還要「臨」。「臨摹」是練習書法的手段,所謂「臨」就是看着字帖中的字,憑着印象在紙上書寫而且儘可能復現字帖中的字;所謂「摹」就是在字帖上面蒙上一層薄白紙,而後在上面跟着字帖直接描。在「臨」與「摹」中,顯而後者更爲簡單。其實,學習任何一門知識都同樣,不只要「摹」,還要「臨」。在學習Python等編程語言時,一些同窗可能學習時看看視頻就過去了,這樣顯然是不可取的,好一點的同窗會在看過視頻以後,跟着視頻把代碼敲一遍,可是這樣只是進行了「摹」,應該在此基礎之上加上「臨」的步驟,也就是關上視頻、合上書本以後,憑藉記憶對代碼進行復現,去想本身的代碼須要實現哪些功能,這樣才能將知識真正地吸取。這樣練習久了以後就會發現本身的能力提高得很是快。框架

通全部不如精一物,精一物方可通全部

第三個學習方法就是通全部不如精一物,精一物方可通全部。你們在學習的時候可能會遇到不少的框架,可是其實並不須要掌握全部的框架,好比對於爬蟲而言,既能夠學習Scrapy,也能夠學習urllib,還能夠學習其餘的框架。其實並不用掌握全部的框架,學習時能夠深刻地掌握其中一兩個框架,以後就會發現全部的框架都是萬變不離其宗的。精通一兩個框架以後,其餘的框架也會很容易掌握。學習編程語言也是同樣的,當你精通了PHP或者Java,Python也能很快學會,可是若是同時學習Java、Python和PHP,最終可能致使每一門語言都不精通。其實學習過程的曲線在剛開始的基礎階段上升會很是慢,可是隻要上手以後,進度就會很是快,因此你們在學習基礎的時候必定不要着急。

走心學,忌浮躁

第四個學習方法就是走心學,忌浮躁。學習的時候必定要投入心思,不要着急,儘可能地將知識掌握和精通。更加具體的學習方法,你們能夠關注雲棲社區上的這個聚能聊:https://yq.aliyun.com/roundta...

3、Python語法基礎實戰

在Python語法的基礎實戰這部分將與你們分享數據類型、控制結構、函數與模塊、文件操做與數據庫操做以及異常處理等內容。

Python基礎知識入門

在Python中輸出直接使用print()函數,若是在Python文件中重複四次print("Hello Python"),那麼輸出時就是四次「Hello Python」。若是想讓某一行代碼不起做用,可使用註釋。在Python中有兩種比較常見的註釋方案,第一種是單行註釋,在行首加「#」,這樣就會註釋掉這一行代碼;第二種是多行註釋,多行註釋通常使用「'''」或「"""」(三引號)實現,直接將須要註釋的代碼段的首部和尾部加上三個引號便可。

數據類型

在學習任何一門編程語言時,都須要瞭解這門編程語言有哪些數據類型。在Python中,常見的數據類型有數、字符串、列表、元祖、集合以及字典等。

數:就是數學上的數字,好比「a=7」就是將數字7賦值給a,這裏的等號是賦值的意思。想要查看對應的數據是什麼類型可使用type()函數查看,好比7就是int整形,7.0就是float浮點型。

字符串:一系列字符所組成的序列叫作字符串。字符串通常使用引號將其引發來,這裏使用單引號和雙引號都可。好比:

a1='abc'
a2="abc"
a3='''ab
c'''

上述代碼所表達的內容是相同的,區別在於使用單引號和雙引號所引發來的內容不能直接換行,而使用三引號就能夠。

列表:存儲多個元素的容器,列表中的元素能夠被從新賦值,也就是說列表中的元素是能夠變化的。創建列表能夠經過「[]」實現,在其中能夠放置數據。好比:a=[]表示a是一個空列表。再好比a=[a1,a3],列表中每一個元素之間使用逗號隔開,a這個列表中包含了a1和a3兩個元素。取其中的元素能夠經過下標實現,好比a[1]就能夠取出a1的值。而列表中的元素能夠被從新定義,好比使用a[1]="hello" 就能夠對本來a[1]的位置進行賦值,這就說明了列表中的元素是能夠變化的。

元組:存儲多個元素的容器,可是元組中的元素不能夠被從新賦值。好比c=(7,"cd",9),c存儲了一組數據,若是想要對c中任意位置賦值成爲其餘的數據,都是不能夠的,由於元組內的數據是不能被更改的。因此,元組通常在對數據安全要求較高時使用,這也是元組與列表的區別。

字典:字典至關於關聯數組,所謂關聯數組就是裏面須要存儲一對信息的數組。列表和元組存儲的元素都是一個,而字典存儲的元素都是一對信息如d={"name":"weiwei","sex":"boy","job":"teacher"}這樣的{鍵:值, 鍵:值, ...}。在取值的時候直接使用字典名["對應鍵名"]便可,好比對於上訴d這個字典,使用d["name"]就能夠取到"weiwei"這個值。

集合:集合也是用於存儲一組數據的,只不過集合的特性是不容許出現重複的元素,這一點你們早在高中就已經學習了。因此,集合的一個很是簡單的應用就是去重,之因此說這個方法簡單,是由於去重還有不少的實現方法,好比布隆過濾器等都是很是好的去重方式。在Python中直接經過set就能夠直接創建集合,好比e=set("abcdefgabc"),而集合是經過「{}」存儲的,只不過大括號裏面直接存儲元素。而當輸出e時就會發現,本來重複的內容就只保留一個。此外,集合還能夠用於差集的運算,好比e=set("abcgjkhsgkjha"),f=set("jikhsdghsdueigdsfzau")直接使用g=e-f就能夠得到e與f的差集。

運算符

以上的這些數據類型歸根結底都是數據。數據是靜態的,而經過運算符進行運算就可讓這些數據動起來。Python裏面的運算符有哪些呢?首先就是你們很是熟悉的「+-/%」,這些運算都知足數學規律。除了「+-/%」以外,還有字符串鏈接符「+」,若是想要將兩個字符串鏈接起來只須要用「+」便可。

縮進問題

可能某些同窗對於Python的縮進比較反感,會以爲縮進很麻煩而且很是容易出錯。可是實際上,縮進很美,當打開Python項目時就會發現層次感很強,會感覺到代碼的美感,哪些代碼屬於同一層級是一目瞭然的。縮進所須要掌握的規律就是最開始的代碼頂格,第二點就是同一層級的代碼在同一個縮進幅度上,下一個層級的代碼在下一個縮進幅度上。當掌握了縮進規律以後,再去寫Python代碼就會很容易了。

控制結構
所謂控制結構就是程序的執行結構,程序能夠像流水帳同樣順序執行下去,也能夠跳躍、循環以及分支執行,這些多種的執行方式叫作控制結構。實際上,Python中最經常使用的控制結構只有三種就是:順序結構、選擇結構和循環結構,固然還有一些不經常使用的控制結構好比中斷結構等。

順序結構沒必要多講,就是按照順序寫,程序也就按照順序執行。在Python中,分支結構一般使用if語句實現,若是if的條件爲真,則執行下面對應的代碼,不然繼續向下看是否有分支結構,若是有則繼續執行,不然就執行這一部份內容;若是if的條件爲假,就不執行下面對應的代碼。以下示例代碼:

a=1000
b=1
if(a>19 and a<30):
    print(a)
    if(b<9):
        print(b)
elif(a>9 and a<=19):
    print("a>9 and a<=19")
elif(a<9):
    print("a<9")
else:
    print("gsdajk")

上述代碼中第3行的if條件斷定結果爲真,程序會執行第4行至第6行代碼。若是第3行的if斷定爲假,則繼續向下面找尋分支。第7行和第9行都存在elif,其意思就是在不知足if的狀況下若是知足elif的條件,就執行elif下面的代碼,若是上述兩行的elif條件都不知足,在第11行還有一個else,其意思就是在上述條件都不知足的狀況下,執行else下面的代碼。上述代碼最終將會輸出「gsdajk」。這裏值得說明的一點就是若是實際狀況不須要,能夠沒有elif以及else等語句,也就是能夠單獨使用if語句。

循環結構也是一個極爲重要的結構。在Python中,循環結構有相應的方法去實現,經常使用的有兩種:while和for語句。while語句的格式以下所示:

a=0
while(a<10):
    print("hello")
    a+=1

首先寫while的條件,所謂的條件就是while括號中的表達式。若是條件爲真就意味着知足了while的條件,這樣就會執行while下面的代碼段,而在執行時不是僅執行一次就結束,而是隻要while循環的條件一直知足,這段代碼就會一直執行。上述代碼中,a的初始值爲0,循環結構中將會打印「hello」並使得a自增1,當a<10時循環結構就會一直執行,因此將會輸出10次「hello」。當到執行到第10次以後,a就不知足小於10的條件了,因而就會跳出循環。

除了while循環以外,還有for循環。for循環的寫法稍有不一樣,經常使用的格式是for i in x,x通常而言是一組數據。for循環遍歷列表示例以下,該程序將會循環輸出列表中的各個元素。

a=["aa","b","c","d"]
for i in a:
    print(i)

for進行常規循環的寫法是for i in range(),也就是從X到Y的意思。好比for i in range(2,5)就是遍歷二、三、4,這裏值得注意的就是遍歷不到最後的元素,在該例子中遍歷不到5。以下列代碼將會輸出10次「hello」。

for i in range(0,10):
    print("hello")

中斷結構是一種特殊的控制結構,就是在程序執行過程當中進行中斷,通常而言都是在循環過程當中進行中斷。一般,中斷結構有兩種寫法:break與continue。break的含義是直接退出循環,整個循環都會中斷。continue指的是中斷單次循環,會繼續下一次循環。

a=["aa","b","c","d"]
for i in a:
    if(i=="c"):
        break
    print(i)

上述代碼使用break中斷循環,使用i循環遍歷a列表,若是i=="c"則中斷循環,直接break。上述代碼的結果就是輸出aa與b,可是不會輸出c以後的元素,由於當循環遍歷到c時就會break,而後終止整個循環。

a=["aa","b","c","d"]
for i in a:
    if(i=="c"):
        continue
    print(i)

而當將break替換爲continue後,運行該段代碼的輸出結果除了aa、b以外,還會輸出d,這是由於continue僅中斷單詞循環,不會影響下一次循環。上述代碼在遍歷到數組中元素c時,會中斷因此不輸出c,而後循環還會繼續。
使用Python輸出乘法口訣表

for i in range(1,10):
    for j in range(1,i+1):
        print(str(i)+"*"+str(j)+"="+str(i*j),end="  ")
    print()

如上述代碼所示,乘法口訣表分爲行和列的控制,最外層循環控制行數,因此外層循環是for i in range(1,10),就是從1一直遍歷到10。而對於列的控制就須要內層循環,顯然就是在i層下面再進行一層循環,如上述代碼中的for j in range(1,i+1),由於當遍歷到1的時候,結果是11,不須要繼續寫12,因此這裏只須要遍歷到i+1便可。具體的輸出只須要進行簡單的數學運算和字符串拼接便可,在print輸出以後若是不經過end控制是會默認更換一行的,這樣輸出的結果不夠美觀,上述代碼的寫法可使得同一行print輸出的結果之間隔一個空格。而在完成了j的遍歷以後須要另起一行,因此須要print()。運行結果以下圖所示:
clipboard.png
在理解了乘法口訣表的實現以後,你們應該思考如何將乘法口訣表逆序輸出,造成倒三角形式。顯然,只須要對代碼作以下修改便可:

for i in range(9,0,-1):
    for j in range(i,0,-1):
        print(str(i)+"*"+str(j)+"="+str(i*j),end="  ")
    print()

對於控制結構而言,你們須要重點掌握循環和分支。
函數與模塊
函數至關於功能的封裝。舉例而言,某個程序段可能會被常常調用,若是不進行功能封裝,那麼每次調用這個功能時就須要從新實現一遍該段程序,這就會帶來不少麻煩。而如今能夠將這個常常被調用的程序段封裝成一個函數,若是須要實現這個功能就能夠直接調用這個封裝好的函數。接下來就與你們分享與函數相關的內容。
做用域:做用域通常而言指的是變量的做用範圍。

i=10
def func():
    print(i)
func()

如上述代碼,將10賦值給i以後,i的做用範圍就是後面的所有代碼,一直到程序結束爲止,那麼這些被覆蓋到的範圍就是變量i的做用域。而在下面的代碼中,當i在函數裏面被定義,而且沒有用global關鍵字聲明,正常狀況下其做用範圍僅限於該函數。

def func():
    i=10
    print(i)
func()

上述代碼中,i的做用範圍僅限於func()函數中。而若是變量在函數外部定義,那麼在函數內部可使用該變量,可是卻沒法直接修改該變量的值。若是對其進行修改就會形成命名空間衝突,出現錯誤。解決上述問題的答案其實很簡單,就是將變量用global關鍵字聲明爲全局變量便可。

i=10
def func():
    global i
    print(i)
func()

上述代碼中的i就是全局變量,當將變量聲明爲全局變量以後就不會受局部變量的影響了。
函數定義的格式:函數定義的格式就是如何將一串代碼封裝爲成函數的方式。函數是經過def關鍵字定義的,函數定義格式以下:

def 函數名(參數):
    函數體

下面的代碼創建了函數abc(),函數的參數能夠沒有,但須要注意即便沒有參數也須要加括號。示例代碼中至關於將兩個print語句進行了封裝。若是想要將上述兩個print語句統一進行一次執行時只須要調用abc()函數便可。在調用函數時只須要使用「函數名(參數)」。

def abc():
    print("abcde")
    print("456")
abc()

函數參數:若是函數沒有參數,那麼這個函數就是固定的,由於該函數內部的代碼是固定的,因此不管怎樣執行都是一樣的結果。而如何使得函數可以實現具體問題具體分析呢?此時能夠爲其傳入相應的參數,這樣函數就能夠根據所傳入的參數進行相應的數據處理。參數就至關於函數與外界溝通的接口。參數分爲形參和實參,通常而言在函數定義的時候使用參數就是形參,所謂形參就是「形式上的參數」;在函數調用的時候使用的就是實參,而所謂的實參就是「實際的參數」。以下的代碼段中實現了兩個數據比較大小的功能:

def func2(a,b):
    if(a>b):
        print(str(a)+"比"+str(b)+"大")
    else:
        print(str(b)+"比"+str(a)+"大或者"+str(b)+"與"+str(a)+"相等")

上述代碼中封裝了一個名爲func2的函數,裏面傳遞兩個參數,參數的名字能夠自行定義,函數裏面則能夠根據具體的形參進行判斷。上述代碼中若是a>b,輸出「a比b大」,不然就輸出「b比a大或者b與a相等」。對於上述函數,每次調用時能夠傳遞不一樣的參數進去,進而根據具體狀況具體分析,並獲得相應的結果。綜上所述,函數就是將一串代碼進行封裝,即函數通常用於功能的封裝。
模塊:模塊就至關於函數的再次封裝。Python中有一些經常使用的模塊,這些經常使用的模塊存在於Python的安裝目錄之下,其中有一個名爲「lib」的目錄,該目錄通常就用於放置模塊,並且你們也能夠本身寫模塊,這樣的模塊就叫作自定義模塊。
在Python中想要使用模塊須要掌握兩個知識點:導入和使用。通常而言有幾種方法導入模塊,第一種方法就是使用import語句直接導入某個模塊,第二種方法就是從某個模塊中僅導入某個方法。以下代碼所示,能夠從time模塊中導入sleep方法,也可使用from time import *將time模塊的全部方法都導入進來。

import random
from time import sleep
from time import *
a=["中獎","不中獎","不中獎"]
print(random.choice(a))

random模塊主要用於隨機數的處理。上述代碼使用random實現了一個抽獎功能,首先導入了random,而後創建一個列表,裏面有「中獎」和「不中獎」選項,random.choice(a)將會隨機在列表a中選擇一個選項並輸出對應的結果。time模塊也有一些比較經常使用的功能,好比time.sleep(),其實現了延時功能。若是想要修改模塊的源代碼,只須要在lib目錄下找到相應的模塊進行修改便可。

此外,第三方的模塊通常放置在lib目錄下的site-packages中。

3、文件操做與數據庫操做

文件操做

文件的打開:使用Python打開文件方法的格式就是open(文件地址,操做形式),open函數的參數中的操做形式有:w(寫入)、r(讀取)、b(二進制)、a(追加),其中的a表示能夠實現追加寫入,這樣就不會丟失原來的內容,若是使用w就是全新寫入,將會覆蓋本來的內容。

fh=open("D:/個人教學/Python/20180120內訓/第1天代碼/文本1.txt","r",encoding="utf-8")
#

    文件讀取
    data=fh.read()
    line=fh.readline()

上述代碼中的操做形式是「r」,也就是讀取文檔,而且能夠經過encoding設置編碼格式,好比utf-8或者gbk等,這樣就能夠打開文件。以後就能夠經過read()或者readline()等方法進行讀取。read()指的是將文件中的內容所有讀取出來,readline()則是一行行地讀取。

x=0
fh=open("D:/個人教學/Python/20180120內訓/第1天代碼/文本1.txt","r",encoding="gbk")
while True:
    line2=fh.readline()
    if(len(line2)==0):
        break
    print(line2)
    x+=1
fh.close()

上述代碼中使用readline()一行行地讀取文件,這裏經過設置while循環來讀取文件所有內容,若是某一行的長度爲0則說明文件已經讀完,此時就能夠break,而若是不爲0則說明還有內容,就能夠繼續讀取下一行。上述代碼中還經過變量x統計共讀取了多少次,在文件讀取完後經過fh.close()關閉文件。結果輸出後還能夠經過x獲取讀取的總行數。
clipboard.png

文件的寫入(w/a+):在進行文件寫入時,在open函數中的操做形式的參數應該爲「w」或者「a」,參數中的文件地址則是輸出地址。以下代碼段所示:

-

data="一塊兒學Python!"

fh2=open("D:/個人教學/Python/20180120內訓/第1天代碼/文本3.txt","w")
fh2.write(data)
fh2.close()

在文件地址中,不可以使用「」,而應該使用「\」或者「/」。在打開文件以後使用write方法將數據寫入以後,將文件關閉便可。若是操做形式爲「w」,將會把本來的文件內容替換掉,也就是全新寫入的意思,而若是使用「a+」就是在本來內容的基礎上進行追加。

數據庫操做

Python除了用於操做文件以外,還經常使用於操做數據庫,本文以操做MySQL數據庫爲例講解。在使用Python操做數據庫以前須要先安裝pymysql模塊,在cmd命令行中輸入「pip install pymysql」便可完成該模塊的安裝。

clipboard.png

在安裝完pymysql以後,還須要將其中的源代碼進行必定的修改,由於使用其默認編碼會出現錯誤。在site-packages下面找到pymysql,並找到connections.py文件,搜索「charset=」關鍵詞就能夠定位到須要進行修改的地方。

clipboard.png

在connections.py中的charset=部分本來是沒有編碼的,如今加上編碼這樣就不會出錯了,這裏的編碼通常建議使用「utf8」。須要注意的是寫入「utf8」而非「utf-8」,經過這樣的設置基本上就能夠解決亂碼的問題。
使用Python進行數據庫的操做的前提是須要一個MySQL數據庫,至於MySQL數據庫的安裝和配置不是本文所關心的對象,你們能夠自行學習。在擁有了MySQL數據庫以後首先應該進行數據庫的鏈接。

import pymysql
conn=pymysql.connect(host="127.0.0.1",user="root",passwd="root",db="mypydb")
#執行sql語句-無返回
conn.query("INSERT INTO mytb(title,keywd) VALUES('new title','23456')")
conn.commit()
#執行SQL語句-有返回
cs=conn.cursor()
cs.execute("select * from mytb")
for i in cs:
    print("當前是第"+str(cs.rownumber)+"行")
    print("標題是:"+i[0])
    print("關鍵詞是:"+i[1])
conn.close()

如上述代碼所示,使用pymysql下面的connect方法就能夠進行鏈接。connect方法中的參數的含義:host表明主機IP地址,user表明用戶名,passwd表明密碼,db表明所選擇的數據庫。在Python中操做數據庫也是使用SQL語句,而這裏的SQL語句能夠分爲兩種,一種無返回結果,一種有返回結果。好比插入數據等操做無返回結果,查詢則屬於有返回結果的,而這兩種語句的使用方法是不一樣的。對於無返回結果的SQL語句,在使用時只須要使用query方法就能夠執行。上述代碼中指的是插入一條數據,插入完成以後使用commit方法就能夠完成提交;對於有返回結果的SQL語句,首先須要經過conn的cursor方法創建遊標,以後使用execute方法執行SQL語句,這樣就能夠遍歷遊標,查詢結果存儲在cs中,使用for i in cs就可逐個將查詢結果取出來。

異常處理

在Python中常常會出現這樣或那樣的錯誤,有些錯誤是不可避免的,甚至是未知的。對於未知的錯誤,當Python執行時遇到後就會自動終結。而若是但願在遇到錯誤以後程序可以繼續運行則須要使用異常處理。異常處理的格式以下:

try:
    程序
except Exception as 異常名稱:
    異常處理部分

try後面的代碼段就是嘗試着去執行這段程序,若是出現異常則會觸發except從句。except後面是對應的Exception類型,這裏有一種的「必殺技」,就是直接使用Exception——通用異常,只要發生異常,Exception都會將其捕獲到。as表示對於異常起一個別名,而接下來就是對應的異常處理的代碼。

  • try:
  • for i in range(0,10):

    >         print(i)
     >         if(i==4):
     >             print(jkj)
     >     print("hello") except Exception as err:
     >     print(err)

如上述代碼段,當i循環到4的時候將會出現異常,由於jkj沒有在程序中定義。若是沒有異常處理,程序將會直接終結,而使用了異常處理以後,當發生異常也不會直接標紅,而是將異常輸出。

clipboard.png

異常處理的目的是讓程序在出現異常的狀況下繼續執行下去,因此須要將異常儘可能細化,使異常處理與所須要監控的代碼更加緊密。對於上述代碼進行異常處理細化以後以下:

for i in range(0,10):
    try:
        print(i)
        if(i==4):
            print(jkj)
    except Exception as err:
        print(err)
print("hello")

這樣即便出現了異常,也能夠繼續下一次循環。因此須要注意,異常處理須要儘可能細化,儘可能放於代碼裏層,放於外層可能沒法實現完美的異常處理。

4、Python中面向對象編程實戰

上述內容幫助你們瞭解了Python在語法層面的基礎知識,接下來爲你們分享Python中面向對象編程實戰。面向對象編程通常區別於面向過程,其更適合於中大型的項目的開發。

認識類和對象

面向對象編程主要是經過「類」和「對象」實現的。舉例而言,具體的某我的就是「對象」,小明是一個對象,小張也是一個對象,而將「對象」共有的特色抽象出來就可以造成「類」,好比小張和小明都是「人」,那麼「人」就是一個「類」,因此「類」就是類型的意思。只不過面向對象的類是自定義的。「類」是抽象出來的,「對象」則是具體的。

若是想要創建一個類則可使用class字段進行聲明:

class 類名:
    類裏面的內容

以下示例代碼,創建了一個名爲cl1的類,類中的內容是「pass」,就是一個佔位符,不會起到任何做用,但若是沒有pass則會出現縮進錯誤。

class cl1:
    pass

而將類實例化成爲對象可使用類名後面加括號並直接賦值給一個對象,如a=cl1(),那麼a就是cl1這個類的一個對象。

構造函數

構造函數也叫做構造方法。所謂構造方法就是專門用於初始化的方法。這裏還須要介紹self,通常在類中的方法必須加上self參數,其表明類自己。在Python中__init__(self,參數)就是構造方法,構造方法的名字是固定的,在括號裏面加上self以及對應的參數便可。構造函數的實際意義就是初始化。

class cl2:

def __init__(self):
    print("I am cl2 self!")

如上述代碼所示,cl2類有一個構造方法,構造方法中會輸出「I am cl2 self!」,這就意味着該類只要建立對象就會首先執行這一串代碼。若是想要給構造方法加上參數,在self後面加上參數便可,參數與參數之間經過逗號隔開。
class cl3:

def __init__(self,name,job):
    print("My name is "+name+" My job is "+job)

這樣就至關於給類加上了參數,由於在實例化該類時會須要傳遞相應的參數。這裏須要注意的是爲類加上參數,並非在類定義中的括號中加參數,在類定義中的括號是用於繼承的,而不是用於加參數的,這裏的加參數指的是在實例化時加上參數。
屬性和方法
屬性就至關因而類中的變量,方法就至關於類中的函數,屬性是靜態的,方法是動態的。舉例而言,對於「人」這個類,手、頭這些都屬於屬性,而人會說話、寫字這些都是方法。在Python裏面,屬性的使用方式通常是self.屬性便可。
class cl4:

def __init__(self,name,job):
    self.myname=name
    self.myjob=job

在上述代碼的cl4這個類的構造方法中,能夠看到傳遞了兩個參數,以後就在構造函數中變成了類的屬性。接下來在使用到時候直接調用self.屬性便可。
class cl5:

def myfunc1(self,name):
    print("hello "+name)

class cl6:

def __init__(self,name):
    self.myname=name
def myfunc1(self):
    print("hello "+self.myname)

如上述代碼所示,方法就是類裏面的函數,包括__init__()也都是方法。上述的cl6就能爲你們解釋self爲何可以存在,cl6中的__init__()和myfuncl()是兩個函數,按照道理而言,myname在不一樣的函數中都屬於局部變量,是不能通用的,那麼若是想讓局部變量在多個函數之間傳遞,那麼一種方法就是將變量存儲到類裏面,也就是建立self字段,將變量存到類裏面,而self就提供了一個區域用於存儲變量,這就是self存在的必要性。
繼承

簡單而言,繼承就是將某個類中全部的屬性和方法都拿過來直接使用,舉例而言:某一個家庭有父親、母親、兒子和女兒,父親能夠說話,母親能夠寫字,大兒子繼承了父親,女兒同時繼承了父母,而且有新能力聽東西,小兒子繼承了父親,可是優化(或減弱)了父親的說話能力,這樣的模型應該如何創建呢?被繼承的這個類被稱爲基類或者父類,繼承的類叫作子類。因此模型中的服務都是基類,兒子和女兒都是子類。
首先建立父親類,他的功能是能夠說話:
class father():

def speak(self):
    print("I can speak!")

接下來創建大兒子這個子類:

class son(father):
    pass

該類繼承了父親類,因此在son類定義的時候括號裏寫上了father。雖然son類中沒有寫任何方法,可是其仍然擁有speak方法,這是由於其集成了father類的全部方法。
母親類具有寫的能力:

class mother():
    def write(self):
        print("I can write")

女兒類同時繼承了父親和母親,這就屬於多繼承了。多繼承只須要在類定義時加多個參數便可。除了繼承了兩個基類以外,她還有新的聽的能力,這樣只須要在該類中寫一個新的方法便可。
class daughter(father,mother):

def listen(self):
    print("I can listen!")

而小兒子發生了變異,這裏的變異指的是重載或者重寫。小兒子繼承了父親類,可是優化了說的能力,因此須要實現一個同名方法,而在實際使用的時候也會調用本身所重載的speak方法。

class son2(father):
    def speak(self):
        print("I can speak 2!")

5、練熟基礎:2048小遊戲項目的實現與實戰

上面爲你們介紹的Python知識很是零散,可是也很是重要,既然想要掌握Python,就須要使用實際項目進行鞏固和提高,當將項目實現以後,對應的能力也就天然掌握了。

本文由雲棲志願小組賈子甲整理,編輯百見,原文

相關文章
相關標籤/搜索