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