前面我們寫過九九乘法表,但如果我要七七乘法表或五五乘法表的話,你會看到三者代碼極其類似,只是循環變量不同,那麼如何做到代碼重用,而不是簡單拷貝黏貼修改呢,其實可是使用函數完成這一功能!
先來試着看一看這個函數:
def table(row,col,sep=3):
for i in range(1, row + 1):
for j in range(1, col + 1):
if j <= i:
print("%d*%d = %2d" % (i, j, i * j), end='%*s'%(sep,' '))
print('')
#一次編碼,到處運行
table(8,8)
table(5,5,8)
下面就來介紹一下今天的內容--》python函數:
1.函數定義
函數就是完成特定功能的代碼塊,本質上是對代碼的封裝。
語法格式:
def 函數名([參數1],[參數2]....[參數n]): 函數體
-
函數名命名規則同變量名,要滿足標識符命名規則
-
不能和系統函數重名,否則系統函數無法使用
-
函數定義分兩部分函數頭和函數體
-
函數體,就是實現功能的代碼段,以:開頭,必須縮進
-
函數名的命名風格:一般建議用下劃線分隔的小寫單詞組成:say_hello
函數的優點:
-
代碼可複用
-
代碼可維護性高
-
容易排錯
-
可讀性好
-
利於團隊開發
2 函數參數
2.1 實參和形參
-
形參:就是函數定義時小括號裏的變量
-
實參:函數調用的時候,小括號裏的表達式
-
函數可以沒有形參和實參
2.2 參數分類
-
位置參數,要求實參順序必須和形參順序完全一致,由形參順序決定實參順序
def say_hello(name,age,home): print('大家好,我是{},我今年{}歲了,我來自{}'.format(name,age,home)) say_hello('王二妮',18,'湖北武漢') #實參個數、順序必須和形參一致
-
關鍵字參數,函數調用時,實參可以是鍵值對,鍵就是形參名字,這樣的調用,實參不必關心形參的順序。
def say_hello(name,age,home): print('大家好,我是{},我今年{}歲了,我來自{}'.format(name,age,home)) say_hello(name='王二傻',home='大連',age=20) #三個關鍵字參數 say_hello('大傻',home='美國',age=30) #兩個關鍵字參數 sya_hello('二傻',24,home='何方') #一個關鍵字參數
-
默認值,如果形參在定義的時候給定一個值,那麼函數在調用時就可以不傳實參,可以簡化調用
def my_power(x,n=2): return (x) ** n my_power(3) my_power(4,0.5) def test(a=[]): a.append('end') print(a) test([1,2,3]) test() #['end'] test() #['end','end']
-
默認值參數必須放到最右邊
-
如果傳了實參,那麼實參優先,不會使用默認值
-
默認值只計算一次
-
默認值必須是不可變對象
-
-
可變參數,傳入的參數個數是可變的,可以是1個、2個到任意個,還可以是0個。
#使用*接收任意數量的位置參數 #注意:*的不定長參數被當做元組處理
def demo(a,b,*args): print(a,b,args) demo(12,33,90) demo(1,2,3,4,5) a=(1,2,3) demo(*a) #使用**接收任意數量的關鍵字參數 #注意:**的不定長參數被當做字典處理 def demo1(a,**args): print(a,args) demo1(1,name='kk',age=3) b = {'a':20,'b':12,'c':32} demo(**b)
2.3 參數組合
-
形參順序須按照以下順序:位置參數、默認值參數、*args,**kwargs
3 函數調用
-
函數調用必須在函數定義之後
-
函數調用必須能夠正確傳遞實參
def demo(a,b,c=0,*arg1,**arg2): print(a,b,c,arg1,arg2) demo(1,3,k=4) demo(1,2,3,4,5) demo(1,b=3,c=3,d=5) demo(*(1,2,3),**{'name':12}) #任何函數都可通過這種形式傳遞參數
4 返回值
可以通過return語句返回計算結果。
-
return的作用一個是終止函數的執行,所有執行了return後,其後的語句不會被執行
-
如果沒有return語句,則默認返回的是None
-
return還可以返回給調用者數值
-
return可以返回一個值,如果要返回多個值,那麼返回的是一個元組
語法:
def demo2(): return 1 def demo3(): return 1,2,3 print(demo2()) print(demo3()) #(1,2,3)
5 文檔字符串
函數文檔字符串documentation string (docstring)是在函數開頭,用來解釋其接口的字符串。簡而言之:幫助文檔
-
包含函數的基礎信息
-
包含函數的功能簡介
-
包含每個形參的類型,使用等信息
文檔字符串書寫規則:
-
必須在函數的首行
-
使用三引號註解的多行字符串(''' ''') 或(""" """)
-
函數文檔的第一行一般概述函數的主要功能,第二行空,第三行詳細描述。
def test(): """ 函數名:test 功能:測試 參數:無 返回值:無 """ print("函數輸出成功") #使用__doc__屬性查看文檔字符串 print(test.__doc__)
6.參數傳遞
python的參數傳遞是簡單的值傳遞,當然這裏的值是指變量的引用(地址),不是變量的值。不存在值傳遞和引用傳遞的區分。簡而言之,python的參數傳遞可以稱之爲對象引用傳遞,對象可以分爲:
-
不可變對象:int、float、None、complex、bool、tuple、str,range
-
在函數內部不可能修改函數外部的變量
-
-
可變對象: dict、list
-
可以在函數內部修改
-
7 空函數
藉助於pass語句實現,函數體不完成任何功能,只有一個pass語句
def test():
pass
8 匿名函數
不再使用def 函數名()這種形式定義函數,而是使用lambda來創建匿名函數
特點:
-
lambda只是一個表達式,函數體比def簡單的多
-
lambda的函數體不再是代碼塊
-
lambda只有一行,增加運行效率
語法:
lambda [arg1,arg2....argn]:函數體
add = lambda a,b:a + b
print(add(3,5))
9.函數類型
函數也是一種類型,我們自定義的函數就是函數對象,函數名保存了函數對象的引用(地址)
def test():
print('我是測試函數')
print(test) #函數名是變量,指向了函數對象
pf = test #pf變量也指向了函數對象,所以也可以通過pf調用test函數
pf()
10.傳入函數
一個函數就可以接收另一個函數作爲參數,這種函數就稱之爲高階函數,也可以稱之爲傳入函數。可以實現通用編程,排序等複雜功能
總結
本節給大家介紹了 Python 函數的使用,對於初步瞭解的同學可能不大友好,還需要自己把不明白的地方多看多查資料深入瞭解。
參考:
https://www.runoob.com/python/python-functions.html
https://www.liaoxuefeng.com/wiki/1016959663602400/1017105145133280