python基礎--函數
特性:
1. 減少重復代碼
2. 使程序變的可擴展
3. 使程序變得易維護
在Python中,定義一個函數要使用def語句,依次寫出函數名、括號、括號中的參數和冒號:,然後,在縮進塊中編寫函數體,函數的返回值用return語句返回。
函數分類
內置函數
自定義函數
python解釋器已經為我們定義好了的函數即內置函數。
可以直接使用的函數,如len(),sum(),max()
自定義函數規則:
函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號 ()。
任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數。
函數內容以冒號起始,並且縮進。
return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。
#語法
def 函數名(參數1,參數2,參數3,...):
‘‘‘註釋‘‘‘
函數體
return 返回的值
def hello():
print("hello word")
hello()
在python中函數要先定義後才能調用
def hello():
print("hello")
word()
hello()
def hello():
print("hello")
hello()
def word():
print("word")
報錯word未定義
def hello():
print("hello")
word()
def word():
print("word")
hello()
正常運行
可以把函數的運行分成兩部
函數的定義
函數的調用
定義時對函數進行語法分析,不執行函數
調用時檢測邏輯是否正確返回結果
上面是不帶參數的函數
還有帶參數的函數
def mysum(a,b):
res = a + b
print(res)
mysum(1,2)
a,b叫形參(函數定義時的參數)
1,2叫實參(函數調用時傳遞的參數)
形式參數(變量)只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變量。
默認參數
如果在傳參數時有一個參數是相同的或者很少變可以寫成默認參數
例如:
def register(name,age,country="CN"):
print(name)
print(age)
print(name)
print(country)
register("Jack",16)
register("Mike",18,"USA")
運行結果如下
關鍵字參數(鍵-值對參數)
正常情況下,給函數傳參數要按順序,不想按順序就可以用關鍵參數,只需指定參數名即可,關鍵字參數必須放在位置參數之後。
結果
總結:
一、位置參數
調用函數時根據函數定義的參數位置來傳遞參數
二、關鍵字參數
用於函數調用,通過“鍵-值”形式加以指定。可以讓函數更加清晰、容易使用,同時也清除了參數的順序需求。
三、默認參數
用於定義函數,為參數提供默認值,調用函數時可傳可不傳該默認參數的值(註意:所有位置參數必須出現在默認參數前,包括函數定義和調用)
默認參數的使用:就是某一個參數只有在少數情況下需要修改!
默認參數跟位置參數同時存在的話,要把默認參數放在後邊啊,放在前邊的話,如果只傳一個參數進去,編譯器也不知道你是誰。
默認參數不可以是可變對象。因為可變對象有可能在函數中值發生改變,也就不是默認值了。
非固定參數(可變參數)
如果函數在定義時不確定用戶想傳入多少個參數,就可以使用非固定參數
結果
如果可變參數不傳參數則為空元組
def register(name,age,args): # args 會把多傳入的參數變成一個元組形式
print(name,age,args)
register(‘Jack‘,20,"python","php","java")
register(‘Mike‘,18)
還可以有一個*kwargs
kwargs 會把多傳入的參數變成一個dict形式
#如果為空則返回空元組 空字典
kwargs 會把多傳入的參數變成一個dict形式
def register(name,age,args,**kwargs):
print(name,age,args,kwargs)
register("Jack",20,"CN","Python",sex="Male",province="jiangsu")
#如果為空則返回空元組 空字典
register("Mike",16)
參數組合
具體的使用中,經常會不止使用到一種參數。這些參數是有順序的:
位置參數,默認參數,可變參數,鍵值對參數(關鍵字參數)
局部變量
函數內部可以使用全局變量
如果在函數內部進行賦值改變則只在函數內部起作用
結果如下:
name = "我是全局變量"
def change_name(name):
print("使用傳遞的全局變量:",name)
name = "我是函數的局部變量"
print("使用函數內部的變量", name)
change_name(name)
print("外部打印:",name)
全局與局部變量
在函數中定義的變量稱為局部變量(作用於本函數),在函數外部定義的變量稱為全局變量(作用於整個程序)。
全局變量作用域是整個程序,局部變量作用域是定義該變量的函數。
當全局變量與局部變量同名時:
在定義局部變量的函數內,局部變量起作用;在其它地方全局變量起作用。
作用域
在 Python 函數中會創建一個新的作用域,只在函數體內起作用
當在函數體中遇到變量時,Python 會首先在該函數的命名空間中尋找變量名,如果找不到就找全局變量
strs = "teststring"
print(id(strs))
def foo():
print(strs)
print(id(strs))
foo()
print(id(strs))
可以看出地址不改變
如果在函數內重新賦值會是什麽情況那?
strs = ‘abc‘
print(id(strs))#abc的地址
def foo():
strs = ‘cde‘
print(id(strs))#輸出新創建的地址
print(strs)#新創建的地址的內容即cde
foo()
print(id(strs))#全局變量abc的地址
print(strs)#全局變量不會改變
輸出結果
全部變量可以被訪問(如果是可變類型,甚至可以被修改)。foo(),實際上是在棧中創建了一個和全局變量相同名字的局部變量,通過在函數 foo 中打印局部命名空間可以印證這一點。在函數執行完後執行完後輸出全局變量可以看到,全局命名空間裏變量 strs 的值並沒有改變地址也不會變。
python基礎--函數