python筆記4 - 函數
函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。
函數能提高應用的模塊性,和代碼的重復利用率。你已經知道Python提供了許多內建函數,比如print()。但你也可以自己創建函數,這被叫做用戶自定義函數。
定義一個函數
你可以定義一個由自己想要功能的函數,以下是簡單的規則:
- 函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號()。
- 任何傳入參數和自變量必須放在圓括號中間。圓括號之間可以用於定義參數。
- 函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。
- 函數內容以冒號起始,並且縮進。
- return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。
語法
def functionname( parameters ): #定義一個函數,functionname是函數名,函數名不能重復 "函數_文檔字符串" function_suite #函數體 return [expression] #return返回值,若無return,則該函數返回為None
參數
以下是調用函數時可使用的正式參數類型:
- 位置參數
- 默認參數
- 關鍵字參數
- 不定長參數(可變參數)
位置參數
位置參數須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣,位置參數為必填項。
調用plus函數,需要傳入2個參數,否則報語法錯誤,如下:
def plus(x,y): #函數名plus,形參:x,y,簡單來說就是函數接收的參數 print(x+y) #函數體,打印x+y的值 plus(3, 4) #函數調用,3和4就是實參,就是傳入的參數,執行結果是:7
傳入錯誤的參數個數,如下:
def plus(x,y): print(x+y) plus(3, 4, 5) 報錯信息如下: File "E:/python_workspace/base-code/day4/函數my.py", line 69, in <module> plus(3, 4, 5) TypeError: plus() takes2 positional arguments but 3 were given
不按照正確的順序傳入參數,打印的結果如下:
def plus(name, age): print(name, age) plus(12, ‘lhl‘) #name=12,age=lhl,明顯輸入不合法
位置參數 - 關鍵字傳參
使用位置參數調用函數時,如果有多個位置參數的話,記不住哪個位置傳哪個了怎麽辦,可以使用位置參數的名字來指定調用,如下:
#有多個位置參數,可能會越來越多,使用固定的位置參數時,記不住或者傳錯了位置,可以使用位置參數的名字來指定調用,叫關鍵字傳參 def plus(name, age, sex, city, phone, money, color, time): print(name, age, sex, city, phone, money, color, time) plus(‘zhangsan‘,18, ‘man‘, color=‘black‘, money=44444, time=time.time(),phone=13400000000,city=‘beijing‘)
執行結果顯示與函數參數位置對應: zhangsan 18 man beijing 13400000000 44444 black 1497020260.7982826
默認參數
調用函數時,默認參數的值如果沒有傳入,則被認為是默認值。這樣就算你在調用的時候沒傳入這個參數,它也是有值的,默認參數不是必填項,如下:
def plus(name, sex, age=18): #age位默認參數,默認值是18 print(name, sex, age) plus(‘zhangsan‘,‘man‘) #調用函數時,未輸入age的值,則默認age值為18
執行結果:
zhangsan man 18
調用函數時,給默認參數傳值,且默認參數在位置參數後面,如下:
def plus(name, sex, age=18): #age位默認參數,默認值是18,age必須位於位置參數後面 print(name, sex, age) plus(‘zhangsan‘, ‘man‘, age=28) #調用函數時,輸入age的值,則默認age為輸入的值
執行結果:
zhangsan man 28
調用函數時,默認參數位於 位置參數前面,則報語法錯誤,信息如下:
def plus(name, age=18, sex): #age位默認參數,默認值是18,age必須位於位置參數sex 前面,則語法錯誤 print(name, sex, age) plus(‘zhangsan‘, ‘man‘) #調用函數時,未輸入age的值,則默認age的值 報錯信息如下: File "E:/python_workspace/base-code/day4/函數my.py", line 67 def plus(name, age=18, sex): #age位默認參數,默認值是18,age必須位於位置參數sex 前面,則語法錯誤 ^ SyntaxError: non-default argument follows default argument
非固定參數:
上面的兩種位置參數和默認參數都是參數個數是固定的,如果說我一個函數,參數不是固定的,我也不知道以後這個函數會擴展成啥樣,可能參數越來越多,這個時候如果再用固定的參數,那後面程序就不好擴展了,這時候就可以用非固定參數了,非固定參數有兩種,一種是可變參數,一種是關鍵字參數。
可變參數:
可變參數用*來接收,後面想傳多少個參數就傳多少個,如果位置參數、默認值參數、可變參數一起使用的的話,可變參數必須在位置參數和默認值參數後面。可變參數也是非必傳的。
def post(*args): #參數個數不固定時,使用*args可變參數,參數組,返回結果是元組,也為非必填參數 print(args) #打印結果是元組:(‘001‘, ‘login‘, ‘post‘),該函數沒有返回值,返回值為None post() #調用函數,不傳參數,打印結果為空的元組 print(post(‘001‘, ‘login‘, ‘post‘)) 執行結果: () (‘001‘, ‘login‘, ‘post‘) None
可變參數與位置參數、默認參數一起使用,如下:
#可變參數使用*來接收,*可變參數名, 必須放在位置參數、默認參數後面,默認參數必須放在位置參數後面 def plus(name, sex, age=18, *args): print(name) print(sex) print(age) print(args) plus(‘zhangsan‘, ‘man‘, ‘black‘, 44444, 13400000000, ‘beijing‘) #默認參數可以不傳 執行結果: zhangsan man black (44444, 13400000000, ‘beijing‘)
關鍵字參數:
關鍵字參數使用**來接收,後面的參數也是不固定的,不限長度,也可以和位置參數、默認參數、可變參數一起使用,關鍵字參數必須在最後面。
使用關鍵字參數的話,調用的時候必須使用關鍵字傳參。關鍵字參數也是非必傳的。如下:
def other(**kwargs): #關鍵字參數,傳入值通過key=value方式傳入,返回結果是字典類型,也為非必填參數 print(kwargs) other(name=‘byz‘, age=18) 執行結果: {‘name‘: ‘byz‘, ‘age‘: 18}
與位置參數、默認參數、可變參數一起使用,如下:
def other(name, age, sex=‘男‘, *args, **kwargs): #關鍵字參數,傳入值通過key=value方式傳入,返回結果是字典類型,也為非必填參數 print(name) print(age) print(sex) print(args) print(kwargs) other(‘zhangsan‘, 24, ‘red‘, ‘sun‘, 110, city=‘beijing‘, score=99) 執行結果: zhangsan 24 red (‘sun‘, 110) {‘city‘: ‘beijing‘, ‘score‘: 99}
return 語句
return語句[表達式]退出函數,選擇性地向調用方返回一個表達式。不帶參數值的return語句返回None。之前的例子都沒有示範如何返回數值,下例便告訴你怎麽做:
def sum(args1, args2): total = args1 + args2 print(‘total :‘, total) #函數內打印出total的值 return total #函數返回total,若輸入的args1、args2位int類型, 則該函數返回int;若輸入的位int+float,則返回結果為float print(sum(12, 13.1)) 執行結果: total : 25.1 25.1
全局變量和局部變量
定義在函數內部的變量擁有一個局部作用域,定義在函數外的擁有全局作用域。
局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個程序範圍內訪問。全局變量如果要在函數中修改的話,需要加global關鍵字聲明,如果是list、字典和集合的話,則不需要加global關鍵字,直接就可以修改,如下:
name = ‘marry‘ #字符串全局變量 names = [] #list全局變量 print(name) print(names) def test(): global name #修改全局變量-name的值就需要用global關鍵字聲明下name為全部變量 name = ‘Sriba‘ #修改全局變量name的值 names.append(name) #修改全局變量names的值 return names test() print(‘修改後‘, name) print(‘修改後names‘, names) 執行結果: marry [] 修改後 Sriba 修改後names [‘Sriba‘]
修改全局變量List類型的值,如下:
names = [1, 2, 3, 4] #list全局變量 print(names) def test(): names = [‘a‘, ‘b‘, ‘c‘, ‘d‘] #修改全局變量names的值不需要用global關鍵字聲明, 直接進行修改 return names print(‘修改後names:‘, test()) 執行結果: [1, 2, 3, 4] 修改後names: [‘a‘, ‘b‘, ‘c‘, ‘d‘]
後續有遞歸調用~~~
python筆記4 - 函數