函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的**段。
函式能提高應用的模組性,和**的重複利用率。你已經知道python提供了許多內建函式,比如print()。但你也可以自己建立函式,這被叫做使用者自定義函式。
你可以定義乙個由自己想要功能的函式,以下是簡單的規則:
任何傳入引數和自變數必須放在圓括號中間。圓括號之間可以用於定義引數。
函式的第一行語句可以選擇性地使用文件字串—用於存放函式說明。
函式內容以冒號起始,並且縮排。
return [表示式]結束函式,選擇性地返回乙個值給呼叫方。不帶表示式的return相當於返回 none。
定義乙個函式只給了函式乙個名稱,指定了函式裡包含的引數,和**塊結構。
這個函式的基本結構完成以後,你可以通過另乙個函式呼叫執行,也可以直接從python提示符執行。
所有引數(自變數)在python裡都是按引用傳遞。如果你在函式裡修改了引數,那麼在呼叫這個函式的函式裡,原始的引數也被改變了。
以下是呼叫函式時可使用的正式引數型別:
必備引數須以正確的順序傳入函式。呼叫時的數量必須和宣告時的一樣。
呼叫printme()函式,你必須傳入乙個引數,不然會出現語法錯誤
關鍵字引數和函式呼叫關係緊密,函式呼叫使用關鍵字引數來確定傳入的引數值。
使用關鍵字引數允許函式呼叫時引數的順序與宣告時不一致,因為 python 直譯器能夠用引數名匹配引數值。
呼叫函式時,預設引數的值如果沒有傳入,則被認為是預設值。下例會列印預設的age,如果age沒有被傳入
你可能需要乙個函式能處理比當初宣告時更多的引數。這些引數叫做不定長引數,和上述2種引數不同,宣告時不會命名。
python 使用 lambda 來建立匿名函式。
lambda函式的語法只包含乙個語句,如下:
lambda[arg1 [,arg2,.....argn]]:expressionreturn語句[表示式]退出函式,選擇性地向呼叫方返回乙個表示式。不帶引數值的return語句返回none。
乙個程式的所有的變數並不是在哪個位置都可以訪問的。訪問許可權決定於這個變數是在**賦值的。
變數的作用域決定了在哪一部分程式你可以訪問哪個特定的變數名稱。兩種最基本的變數作用域如下:
定義在函式內部的變數擁有乙個區域性作用域,定義在函式外的擁有全域性作用域。
區域性變數只能在其被宣告的函式內部訪問,而全域性變數可以在整個程式範圍內訪問。呼叫函式時,所有在函式內宣告的變數名稱都將被加入到作用域中。
#coding: utf-8
defprinter (str):
"列印傳入的字串到標準顯示裝置上:
str
return
#呼叫函式
printer("
呼叫使用者自定義函式!")
printer(
"再次呼叫同一函式")
#關鍵字引數
printer(str="
my string! ")
defchangme(mylist):
"函式內取值
",mylist
return
#呼叫函式
mylist=[10,20,30]
changme(mylist)
"執行函式後的值:
",mylist
def printinfo(name ,age=24):
"列印任何傳入的字串
"name:
",name
"age:
",age
return
#使用關鍵字引數順序不重要
printinfo(age=50,name="
alice")
#預設引數,使用預設引數
printinfo(name='
derrick')
def printinfo_(arg,*vartuple):
"列印任何傳入的引數
"輸出:
arg
for var in
vartuple:
var
return
#呼叫不定長引數函式
printinfo_(10,23,45)
sum=lambda arg1,arg2:arg1+arg2
"相加的值為:
",sum(10,34)
"相加的值為:
",sum(23,45)
defsum(arg1,arg2):
#返回兩個引數的和
toatal=arg1+arg2
'函式內:
',toatal
return
toatal
total=sum(12,11)
模組讓你能夠有邏輯地組織你的python**段。
把相關的**分配到乙個 模組裡能讓你的**更好用,更易懂。
模組也是python物件,具有隨機的名字屬性用來繫結或引用。
簡單地說,模組就是乙個儲存了python**的檔案。模組能定義函式,類和變數。模組裡也能包含可執行的**。
想使用python原始檔,只需在另乙個原始檔裡執行import語句
python的from語句讓你從模組中匯入乙個指定的部分到當前命名空間中。
把乙個模組的所有內容全都匯入到當前的命名空間也是可行的
變數是擁有匹配物件的名字(識別符號)。命名空間是乙個包含了變數名稱們(鍵)和它們各自相應的物件們(值)的字典。
乙個python表示式可以訪問區域性命名空間和全域性命名空間裡的變數。如果乙個區域性變數和乙個全域性變數重名,則區域性變數會覆蓋全域性變數。
每個函式都有自己的命名空間。類的方法的作用域規則和通常函式的一樣。
python會智慧型地猜測乙個變數是區域性的還是全域性的,它假設任何在函式內賦值的變數都是區域性的。
因此,如果要給全域性變數在乙個函式裡賦值,必須使用global語句。
global varname的表示式會告訴python, varname是乙個全域性變數,這樣python就不會在區域性命名空間裡尋找這個變數了。
例如,我們在全域性命名空間裡定義乙個變數money。我們再在函式內給變數money賦值,然後python會假定money是乙個區域性變數。然而,我們並沒有在訪問前宣告乙個區域性變數money,結果就是會出現乙個unboundlocalerror的錯誤。取消global語句的注釋就能解決這個問題。
dir()函式乙個排好序的字串列表,內容是乙個模組裡定義過的名字。
返回的列表容納了在乙個模組裡定義的所有模組,變數和函式。
根據呼叫地方的不同,globals()和locals()函式可被用來返回全域性和區域性命名空間裡的名字。
如果在函式內部呼叫locals(),返回的是所有能在該函式裡訪問的命名。
如果在函式內部呼叫globals(),返回的是所有在該函式裡能訪問的全域性名字。
兩個函式的返回型別都是字典。所以名字們能用keys()函式摘取。
當乙個模組被匯入到乙個指令碼,模組頂層部分的**只會被執行一次。
因此,如果你想重新執行模組裡頂層部分的**,可以用reload()函式。該函式會重新匯入之前匯入過的模組。
包是乙個分層次的檔案目錄結構,它定義了乙個由模組及子包,和子包下的子包等組成的python的應用環境。
考慮乙個在phone目錄下的pots.py檔案。這個檔案有如下源**:
#!/usr/bin/python# -*- coding: utf-8 -*-defpots():print"i'm pots phone"同樣地,我們有另外兩個儲存了不同函式的檔案:
現在,在phone目錄下建立file __init__.py:
當你匯入phone時,為了能夠使用所有函式,你需要在__init__.py裡使用顯式的匯入語句,如下:
frompotsimportpotsfromisdnimportisdnfromg3 importg3當你把這些**新增到__init__.py之後,匯入phone包的時候這些類就全都是可用的了。
money = 2000defaddmoney():
#想改正**就取消以下注釋:
global
money
money = money + 1
money
addmoney()
money
#dir()函式
import
math
content =dir(math)
print content
Python基礎語法05 函式模組
函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的 段。函式能提高應用的模組性,和 的重複利用率。你已經知道python提供了許多內建函式,比如print 但你也可以自己建立函式,這被叫做使用者自定義函式。你可以定義乙個由自己想要功能的函式,以下是簡單的規則 任何傳入引數和自變數必須放在圓括...
Python基礎語法函式
python中的函式與數學中的函式不同,它不再只是公式,而是實實在在有著自己特定功能的 其實在潛移默化中我們已經有所接觸了。比如print 函式,range 函式,type 函式等。函式各式各樣,或簡單或複雜,但其本質卻好是相通的 給函式一些資料,函式進行處理,輸出你想要的東西。函式名後面的括號裡放...
函式模板基本語法
template class t intmyadd t a,t b intmyadd int a,char c void test02 函式模板允許過載 程式執行時編譯器先索引普通函式,之後才呼叫模板,如果要考慮模板函式優先,可以呼叫時加上語句 myadd a,b 編譯器 彙編器將 s彙編檔案鏈結生...