一、函數
1、what
具備某一功能的工具===》函數
工具的使用:
事先准備好工具==========》函數的定義
遇到應用場景拿來就用====》函數的調用
2、why
1、程序的組織結構不清晰,可讀性差
2、如果要用到重復的功能,只能拷貝功能的實現代碼=》代碼冗余
3、可擴展性差
3、how
函數的使用原則:先定義,后調用
定義函數:
def 函數名(參數1,參數2,參數3,...):
"""文檔注釋"""
代碼1
代碼2
代碼3
...
return 返回值
調用函數:
函數名(值1,值2,值3,...)
ps:函數名盡可能寫成動詞,不要寫成名詞
二:函數的基本使用
1、定義函數:申請內存空間把函數體代碼保存下來,然后把內存地址綁定給函數名-》函數名=函數的內存地址
def sayhi(): print('*'*10) print('hello') print('*'*10) print(sayhi)#打印出來的是函數名的內存地址
2、調用函數: 函數名()=> 函數的內存地址(),會觸發函數體代碼的運行
sayhi() sayhi() sayhi()#可以多次調用,調用一次函數運行一次
三:定義函數的三種格式
1、 無參函數(就是函數沒有參數)
def sayhi(): print('='*100) sayhi()
2、 有參函數
def sayhi(s,n): # s = '-' # n = 20 print(s*n) print('hello') print(s*n) sayhi('-',20)
3、 空函數
def func(): pass
四:函數的調用
return : 函數內可以有多個return,但只要執行一次函數就立刻結束,並會把return后的值當作本次調用的結果返回
函數可以有三種形式的返回值
1、return 值:返回的就是該值本身
2、return 值1,值2,值3:返回一個元組
3、沒有return:默認返回None
五:函數調用的三種格式
1、 語句形式:單純地調用一下函數就完了
def sayhi(s,n): print(s*n) print('hello') print(s*n) sayhi('*',30)
2、 表達式形式:
def max2(x,y): if x > y: return x else: return y res=max2(11,22) * 12 print(res)
3、 可以把函數的調用當作值傳給另外一個函數
def sayhi(s,n): print(s*n) print('hello') print(s*n) sayhi('*',30) print(sayhi('*',30))
總結:
函數的使用一定要分兩個階段去看:
1、定義階段:只檢測語法,不執行代碼
2、調用階段:執行函數體代碼
如果發生的語法錯誤,定義階段就會立馬檢測出來
def func():
print("hello" #語法錯誤
如果發生的不是語法錯誤,而是邏輯錯誤,只能在調用階段檢測到
def func():
xxx #邏輯錯誤
func()
ps:調用函數時還沒定義的函數一定會報錯,一定要搞清楚函數定義的兩個階段
示范1: def bar(): print(' bar') def foo(): print(' foo') bar() foo() #foo bar 示范2: def foo(): print(' foo') bar() def bar(): print(' bar') foo() #foo bar 這里的def bar()在函數定義階段就已經定義好了
六:函數的參數分為兩大類
1、形參:在定義函數時,括號內定義的變量名,稱之為形式參數,簡稱形參=》變量名
2、實參:在調用函數時,括號內傳入的值,稱之為實際參數,簡稱實參=》變量值
七:在python中參數的種類
1、位置參數:
(1)位置形參:在函數定義階段按照從左到右的順序依次定義形參(變量名),稱之為位置形參
特點:必須被傳值
def func(x,y): print(x,y) func(1,2) func(1) # 少一個不行 func(1,2,3) # 多一個也不行
(2)位置實參:在函數調用階段按照從左到右的順序依次定義實參(傳入的變量值),稱之為位置實參
特點:按照位置傳值,一一對應
func(1,2,3,4,5,6)#數量由傳入的變量名而定
2、關鍵字實參:在函數調用階段按照key=value的形式為指定的形參名傳值,該形式稱之為關鍵字實參
特點:在傳值時可以完全打亂順序,但是仍然能夠指名道姓地為指定的形參傳值
func(x=1,y=2)
注意:可以混用位置實參與關鍵字實參,但是
1 位置實參必須放在關鍵字實參的前面
2 不能為同一個形參重復賦值
def func(name, age, salary): print(name) print(age) print(salary) func('egon', 18, salary=3.1) # func('egon',salary=3.1,age=18) # func('egon',salary=3.1,18) # 錯誤,SyntaxError # func('egon',18,age=19,salary=3.3)# 錯誤,TypeError
3、默認形參:在函數定義階段就已經為某個形參賦值,該形參稱之為有默認值的形參,簡稱默認形參
特點: 定義階段就已經被賦值意味着在函數調用階段可以不用為其賦值
def func(x,y=2): print(x,y) func(1) #1 2 func(1,33333)#1 33333
注意:
(1)默認形參應該放在位置形參的后面
def func(y=2,x): # 錯誤 pass
func(1,2)
(2) 默認形參的值通常應該是不可變類型
#達不到用意
def func(name,hobby,hobbies=[]): hobbies.append(hobby) print("%s 的愛好是:%s" %(name,hobbies)) func("egon",'play') #egon 的愛好是:['play'] func('lili','music') #lili 的愛好是:['play', 'music'] func("jack",'read') #jack 的愛好是:['play', 'music', 'read'] #達到用意 def func(name,hobby,hobbies=None): if hobbies is None: hobbies=[] hobbies.append(hobby) print("%s 的愛好是:%s" %(name,hobbies)) func("egon",'play') #egon 的愛好是:['play'] func('lili','music') #lili 的愛好是:['music'] func("jack",'read') #jack 的愛好是:['read']
(3) 默認形參的值只在函數定義階段被賦值一次,函數定義之后的改變對默認形參沒有影響
m=333 def func(x,y=m): # y=333 print(x,y) m=44444 func(1) #調用后打印1 333 在定義階段把y賦值為333,調用時如果y不再傳值的話就不受影響 func(1,2) #調用后打印1 333 在定義階段把y賦值為333,調用時如果傳值,按照傳的值來
#默認形參示范
def register(name,age,gender='male'): print(name) print(age) print(gender) register('tom',21,) register('egon',18,'female') #可以傳值改變默認值,也可以不傳就用默認值
ps:位置形參,一定要傳值
默認形參,可以不傳值