python基礎06 函式
函式最重要的目的是方便我們重複使用相同的一段程式。
將一些操作隸屬於乙個函式,以後你想實現相同的操作的時候,只用呼叫函式名就可以,而不需要重複敲所有的語句。
函式的定義
首先,我們要定義乙個函式, 以說明這個函式的功能。
def
square_sum
(a,b)
: c = a**
2+ b**
2return c
這個函式的功能是求兩個數的平方和。
首先,def,這個關鍵字通知python:我在定義乙個函式。square_sum是函式名。
括號中的a, b是函式的引數,是對函式的輸入。引數可以有多個,也可以完全沒有(但括號要保留)。
我們已經在迴圈和選擇中見過冒號和縮進來表示的隸屬關係。
c = a**
2+ b**
2# 這一句是函式內部進行的運算
return c # 返回c的值,也就是輸出的功能。python的函式允許不返回值,也就是不用return。
return可以返回多個值,以逗號分隔。相當於返回乙個tuple
(定值表)。
return a,b,c # 相當於 return (a,b,c)
在python中,當程式執行到return的時候,程式將停止執行函式內餘下的語句。return並不是必須的,當沒有return, 或者return後面沒有返回值時,函式將自動返回none。none是python中的乙個特別的資料型別,用來表示什麼都沒有,相當於c中的null。none多用於關鍵字引數傳遞的預設值。
函式呼叫和引數傳遞
定義過函式後,就可以在後面程式中使用這一函式
print square_sum(3,
4)
python通過位置,知道3對應的是函式定義中的第乙個引數a, 4對應第二個引數b,然後把引數傳遞給函式square_sum。
(python有豐富的引數傳遞方式,還有關鍵字傳遞、表傳遞、字典傳遞等,基礎教程將只涉及位置傳遞)
函式經過運算,返回值25, 這個25被print列印出來。
我們再看下面兩個例子:
第乙個例子,我們將乙個整數變數傳遞給函式,函式對它進行操作,但原整數變數a不發生變化。
第二個例子,我們將乙個表傳遞給函式,函式進行操作,原來的表b發生變化。
對於基本資料型別的變數,變數傳遞給函式後,函式會在記憶體中複製乙個新的變數,從而不影響原來的變數。(我們稱此為值傳遞)
但是對於表來說,表傳遞給函式的是乙個指標,指標指向序列在記憶體中的位置,在函式中對錶的操作將在原有記憶體中進行,從而影響原有變數。(我們稱此為指標傳遞)
python基礎07 物件導向的進一步拓展
呼叫類的其它資訊
上一講中提到,在定義方法時,必須有self這一引數。這個引數表示某個物件。物件擁有類的所有性質,那麼我們可以通過self,呼叫類屬性。
這裡有乙個類屬性laugh。在方法show_laugh()中,通過self.laugh,呼叫了該屬性的值。
還可以用相同的方式呼叫其它方法。方法show_laugh(),在方法laugh_100th中()被呼叫。
通過物件可以修改類屬性值。但這是危險的。類屬性被所有同一類及其子類的物件共享。類屬性值的改變會影響所有的物件。
init()方法
init()是乙個特殊方法(special method)。python有一些特殊方法。python會特殊的對待它們。特殊方法的特點是名字前後有兩個下劃線。
如果你在類中定義了__init__()這個方法,建立物件時,python會自動呼叫這個方法。這個過程也叫初始化。
這裡繼承了bird類,它的定義見上一講。
螢幕上列印:
summer.__init__(more_words)
物件的性質
我們講到了許多屬性,但這些屬性是類的屬性。所有屬於該類的物件會共享這些屬性。比如說,鳥都有羽毛,雞都不會飛。
在一些情況下,我們定義物件的性質,用於記錄該物件的特別資訊。比如說,人這個類。性別是某個人的乙個性質,不是所有的人類都是男,或者都是女。這個性質的值隨著物件的不同而不同。李雷是人類的乙個物件,性別是男;韓美美也是人類的乙個物件,性別是女。
當定義類的方法時,必須要傳遞乙個self的引數。這個引數指代的就是類的乙個物件。我們可以通過操縱self,來修改某個物件的性質。比如用類來新建乙個物件,即下面例子中的li_lei,那麼li_lei就被self表示。我們通過賦值給self.attribute,給li_lei這一物件增加一些性質,比如說性別的男女。self會傳遞給各個方法。在方法內部,可以通過引用self.attribute,查詢或修改物件的性質。
這樣,在類屬性的之外,又給每個物件增添了各自特色的性質,從而能描述多樣的世界。
在初始化中,將引數input_gender,賦值給物件的性質,即self.gender。
li_lei擁有了物件性質gender。gender不是乙個類屬性。python在建立了li_lei這一物件之後,使用li_lei.gender這一物件性質,專門儲存屬於物件li_lei的特有資訊。
物件的性質也可以被其它方法呼叫,呼叫方法與類屬性的呼叫相似,正如在printgender()方法中的呼叫。
python基礎8 反過頭來看看
最初的「hello world」,走到物件導向。該回過頭來看看,教程中是否遺漏了什麼。
我們之前提到一句話,「everything is object」. 那麼我們就深入體驗一下這句話。
需要先要介紹兩個內建函式,dir()和help()
dir()用來查詢乙個類或者物件所有屬性。你可以嘗試一下
>>
>
print
dir(
list
)help
()用來查詢的說明文件。你可以嘗試一下
>>
>
print
help
(list)(
list是python內建的乙個類,對應於我們之前講解過的列表)
list是乙個類
在上面以及看到,表是python已經定義好的乙個類。當我們新建乙個表時,比如:
>>
>nl =[1
,2,5
,3,5
]實際上,nl是類list的乙個物件。
實驗一些list的方法:
>>
>
print nl.count(5)
# 計數,看總共有多少個5
>>
>
print nl.index(3)
# 查詢 nl 的第乙個3的下標
>>6)
# 在 nl 的最後增添乙個新元素6
>>
>nl.sort(
)# 對nl的元素排序
>>
>
print nl.pop(
)# 從nl中去除最後乙個元素,並將該元素返回。
>>
>nl.remove(2)
# 從nl中去除第乙個2
>>
>nl.insert(0,
9)# 在下標為0的位置插入9
總之,list是乙個類。每個列表都屬於該類。
python補充中有list常用方法的附錄。
運算子是特殊方法
使用dir(list)的時候,能看到乙個屬性,是__add__()。從形式上看是特殊方法(下劃線,下劃線)。它特殊在哪呢?
這個方法定義了"+"運算子對於list物件的意義,兩個list的物件相加時,會進行的操作。
>>
>
print[1
,2,3
]+[5
,6,9
]
運算子,比如+, -, >, <, 以及下標引用[start:end]等等,從根本上都是定義在類內部的方法。
嘗試一下
>>
>
print[1
,2,3
]-[3
,4]
會有錯誤資訊,說明該運算子「-」沒有定義。現在我們繼承list類,新增對"-"的定義
內建函式len()用來返回list所包含的元素的總數。內建函式__sub__()定義了「-」的操作:從第乙個表中去掉第二個表**現的元素。如果__sub__()已經在父類中定義,你又在子類中定義了,那麼子類的物件會參考子類的定義,而不會載入父類的定義。任何其他的屬性也是這樣。
定義運算子對於複雜的物件非常有用。舉例來說,人類有多個屬性,比如姓名,年齡和身高。我們可以把人類的比較(>, <, =)定義成只看年齡。這樣就可以根據自己的目的,將原本不存在的運算增加在物件上了。
下一步希望你已經對python有了乙個基本了解。你可能躍躍欲試,要寫一些程式練習一下。這會對你很有好處。
但是,python的強大很大一部分原因在於,它提供有很多已經寫好的,可以現成用的物件。我們已經看到了內建的比如說list,還有tuple等等。它們用起來很方便。在python的標準庫里,還有大量可以用於作業系統互動,internet開發,多執行緒,文字處理的物件。而在所有的這些的這些的基礎上,又有很多外部的庫包,定義了更豐富的物件。
比如numpy, tkinter, django等用於科學計算,gui開發,web開發的庫,定義了各種各樣的物件。對於一般使用者來說,使用這些庫,要比自己去從頭開始容易得多。我們要開始攀登巨人的肩膀了。
Android基礎知識點彙總
resources.getsystem getdisplaymetrics density 可以不用 context 也能獲取螢幕密度哦 通過過載 viewgroup 的 dispatchdraw 可以實現乙個簡單的蒙版效果。例如下拉重新整理時,可以在 contentview 上加一層遮罩。canv...
Python基礎知識點
python2與python3編碼相容性 python2如果沒有指定編碼格式,預設的編碼是ascii,不進行轉換會出現unicodedecodeerror錯誤,為了使得python2與3進行相容,可以用如下 實現 import sys from django.utils import six if ...
Nginx基礎知識點彙總3
問題 客戶端與 nginx 伺服器之間的請求資料需要加密處理。解決方案 啟用 ngx http ssl module 或 ngx stream ssl module 其中之一的 nginx ssl 模組對資料進行加密 例項在 server 塊級指令中設定監聽啟用 ssl 加密的 8843 埠。使用的...