简明python教程 --C++程序员的视角(二):函数及作用域
函數(shù)通過def關(guān)鍵字定義。def關(guān)鍵字后跟一個函數(shù)的標(biāo)識符名稱,然后跟一對圓括號。圓括號之中可以包括一些變量名,該行以冒號結(jié)尾。接下來是一塊語句,它們是函數(shù)體。
函數(shù)的基本概念
1 位置:從左往右進行匹配(默認(rèn)方式)?
2 關(guān)鍵字參數(shù):通過參數(shù)名進行匹配
?? func(name = value)
3 默認(rèn)參數(shù):為沒有傳入值的參數(shù)定義參數(shù)值
?? def func(name = value)
4 打包參數(shù):(函數(shù))收集任意多參數(shù)位置參數(shù)def func(*name)或關(guān)鍵字參數(shù)def func(**name)?
5 解包參數(shù):(調(diào)用者)傳遞任意多(位置/關(guān)鍵字)參數(shù)位置參數(shù)func(*name)或關(guān)鍵字參數(shù)func(**name)?
在不能預(yù)測將要傳入?yún)?shù)的數(shù)目時,是很方便的,如min()
| def是可執(zhí)行語句 | 在if語句、while循環(huán)中甚至是其他的def中嵌套是合法的? if test:? ???? def func():???? ...? else:? ???? def func():???? ...? func() |
| def創(chuàng)建了一個函數(shù)對象,并將其賦值給一個變量名 | 函數(shù)對象可以賦值給其他的變量名,保存在列表中? othername = func? othername() |
| 參數(shù)傳遞:通過將對象賦值給本地變量來實現(xiàn) | 不可變參數(shù)是通過“值”進行傳遞? 可變參數(shù)是通過“指針”進行傳遞 |
| 模擬輸出參數(shù)(“通過引用進行調(diào)用”的參數(shù)傳遞) | def multiple(x,y):...;return x,y;? X,L = multiple(X,L) |
| 避免可變參數(shù)的修改 | 如果不想要函數(shù)內(nèi)部在原處的修改影響傳遞給它的可變對象: 傳遞拷貝L = [1,2];changer(X,L[:]) 或者def changer(a,b): b = b[:];... 或者L = [1,2];changer(X,tuple(L)) |
| 參數(shù)匹配方式 | |
| 函數(shù)可以通過lambda表達式創(chuàng)建 | ? |
| yield語句 | ? |
?
作用域的基本概念
global并不是類型的聲明,而是命名空間的聲明?
全局變量在函數(shù)內(nèi)被賦值,必須經(jīng)過聲明?
global X;X += 1或者import thismod;thismod.X += 1全局變量名在函數(shù)的內(nèi)部引用,可以不經(jīng)過聲明一個模塊文件一旦被導(dǎo)入了,其全局變量也就變成了這個模塊對象的一個屬性:導(dǎo)入者自動得到了全局變量的訪問權(quán)。但是別直接修改另一個文件中的變量。?
文件間進行通信的最好辦法是通過調(diào)用函數(shù),傳遞參數(shù),然后得到返回值。可以使用accessor函數(shù)管理這種變化。
# first.py
X = 99def setX(new)
??? global X
??? X = new
# second.py
| 函數(shù)內(nèi)部被賦值的變量名,默認(rèn)為本地變量 | 賦值操作:=語句,import語句,def語句,參數(shù)傳遞? L.append(X)并不會將L劃分為本地變量,而L = X卻可以 |
| global聲明了一個模塊級的變量并被賦值 | |
| 委任一個單個模塊文件去定義所有的全局變量 | 全局變量的值取決于函數(shù)調(diào)用的順序,而函數(shù)自身是任意順序進行排列的,會引發(fā)問題, |
| 最小化文件間變量的修改 |
?
函數(shù)定義
寫在文件中沒有問題:
?
不過在交互式中新手會。。。
?
函數(shù)形參
參數(shù)在函數(shù)定義的圓括號對內(nèi)指定,用逗號分割。
(雖然一直很想要這樣的字符串處理方式!但是作為一個C++程序員,不太習(xí)慣不打括號改打冒號,并且真心每次都很想打分號= =)
?
局部變量
在函數(shù)內(nèi)改變局部變量x的值的時候,在主塊中定義的x不受影響。結(jié)果:
?
使用global語句
如果你想要為一個定義在函數(shù)外的變量賦值,那么你就得告訴Python這個變量名不是局部的,而是?全局?的。我們使用global語句完成這一功能。沒有g(shù)lobal語句,是不可能為定義在函數(shù)外的變量賦值的。
使用global語句可以清楚地表明變量是在外面的塊定義的。結(jié)果:
可以使用同一個global語句指定多個全局變量。例如global x, y, z。
?
默認(rèn)參數(shù)值
可以在函數(shù)定義的形參名后加上賦值運算符(=)和默認(rèn)值,從而給形參指定默認(rèn)參數(shù)值。默認(rèn)參數(shù)值應(yīng)該是不可變的。
如果我們不提供一個值,那么默認(rèn)地,字符串將只被打印一遍。
?
?
關(guān)鍵參數(shù)
如果你的某個函數(shù)有許多參數(shù),而你只想指定其中的一部分,那么你可以通過命名來為這些參數(shù)賦值——這被稱作?關(guān)鍵參數(shù)?——我們使用名字(關(guān)鍵字)而不是位置(我們前面所一直使用的方法)來給函數(shù)指定實參。
這樣做有兩個優(yōu)勢:
?
return語句
注意,沒有返回值的return語句等價于return?None。None是Python中表示沒有任何東西的特殊類型。例如,如果一個變量的值為None,可以表示它沒有值。除非你提供你自己的return語句,每個函數(shù)都在結(jié)尾暗含有return None語句。
通過運行print someFunc(),你可以明白這一點,函數(shù)someFunc沒有使用return語句,pass語句在Python中表示一個空的語句塊。
?
DocStrings
Python有一個很奇妙的特性,稱為?文檔字符串?,它通常被簡稱為?docstrings。DocStrings是一個重要的工具,由于它幫助你的程序文檔更加簡單易懂,你應(yīng)該盡量使用它。你甚至可以在程序運行的時候,從函數(shù)恢復(fù)文檔字符串!
在函數(shù)的第一個邏輯行的字符串是這個函數(shù)的?文檔字符串?。注意,DocStrings也適用于模塊和類,我們會在后面相應(yīng)的章節(jié)學(xué)習(xí)它們。
文檔字符串的慣例是一個多行字符串,它的首行以大寫字母開始,句號結(jié)尾。第二行是空行,從第三行開始是詳細的描述。?強烈建議你在你的函數(shù)中使用文檔字符串時遵循這個慣例。
你可以使用__doc__(注意雙下劃線)調(diào)用printMax函數(shù)的文檔字符串屬性(屬于函數(shù)的名稱)。
請記住Python把?每一樣?xùn)|西?都作為對象,包括這個函數(shù)。
我們會在后面的類一章學(xué)習(xí)更多關(guān)于對象的知識。
如果你已經(jīng)在Python中使用過help(),那么你已經(jīng)看到過DocStings的使用了!它所做的只是抓取函數(shù)的__doc__屬性,然后整潔地展示給你。
你可以對上面這個函數(shù)嘗試一下——加上語句help(printMax):
自動化工具也可以以同樣的方式從你的程序中提取文檔。因此,我?強烈建議?你對你所寫的任何正式函數(shù)編寫文檔字符串。隨你的Python發(fā)行版附帶的pydoc命令,與help()類似地使用DocStrings。
from:?http://www.cnblogs.com/wei-li/archive/2012/03/24/2415728.html
總結(jié)
以上是生活随笔為你收集整理的简明python教程 --C++程序员的视角(二):函数及作用域的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简明python教程 --C++程序员的
- 下一篇: 简明python教程 --C++程序员的