python學習筆記11(函式)
函式
概述: 在一個完整的專案中,某些功能會反覆的使用。那麼會將功能封裝成函式,當我們要使用功能的時候直接呼叫函式即可
本質:函式就是對功能的封裝
優點
1、簡化程式碼結構,增加了程式碼的複用度(重複使用的程度)
2、如果想修改某些功能或者除錯某個BUG,只需要修改對應的函式即可
定義函式:
格式:
def 函式名(引數列表):
語句
return 表示式
註釋:
def :函式程式碼塊以def關鍵字開始
函式名: 遵循識別符號規則
(): 是引數列表的開始和結束
引數列表(引數1,引數2,……,引數n): 任何傳入函式的引數和變數必須放在圓括號之間,用逗號分隔。函式從函式的呼叫者哪裡獲取的資訊
冒號:
語句: 函式封裝的功能
return: 一般用於結束函式,並返回資訊給函式的呼叫者
表示式: 即為要返回給函式的呼叫者的資訊
注意: 最後的return 表示式,可以不寫,相當於return None
函式的呼叫
格式: 函式名(引數列表)
函式名: 是要使用的功能的函式函式名字
引數列表: 函式的呼叫者給函式傳遞的資訊,如果沒有引數,小括號也不能省略
函式呼叫的本質: 實參給形參賦值的過程
示例:
#定義了一個無參無返回值的函式 def myPrint(): print("sunck is a very good man!") print("sunck is a nice man!") print("sunck is a handsome man!") #呼叫函式 myPrint()
形參(形式引數):
概述: 定義函式時小括號中的變數,本質是變數,引數必須按順序傳遞,個數目前要對應
def myPrint(str, age, hoby):
print(str, age) #並不會報錯
def myPrint(str, age):
print(str, age)
實參(實際引數): 呼叫函式時給函式傳遞的資料,本質是值
myPrint("sunck is a good man", 18)
函式返回值
#實現給函式兩個數,返回這兩個數的和 def mySum(num1, num2): #將結構返回給函式的呼叫者 return num1 + num2 #執行完return語句,該函式就結束了,return後面的程式碼不執行 print("**********") res = mySum(1, 2) print(res) #輸出:3
引數傳遞
值傳遞: 傳遞的是不可變型別(string、tuple、number是不可變的)
def func1(num):
print(id(num))
num = 10
print(id(num))
temp = 20
print(id(temp)) #輸出:1758097008
func1(temp) #num = temp #輸出:1758097008 1758096688
print(temp) #輸出:20,num只在函式內部存在,函式呼叫結束後不存在
引用傳遞: 傳遞的可變型別(list、dict、set是可變的)
def func2(lis):
lis[0] = 100
li = [1,2,3,4,5]
func2(li)
print(li) #輸出:[100, 2, 3, 4, 5]
a = 10
b = 10
print(id(a), id(b)) #輸出:1758096688 1758096688
b = 40
print(id(a), id(b)) #輸出:1758096688 1758097648
關鍵字傳遞: 允許函式呼叫時引數的順序與定義不一致
def myPrint(str, age):
print(str, age)
#使用關鍵字引數
myPrint(age = 18, str = "sunck is a good man")
預設引數: 呼叫函式時,如果沒有傳遞引數,則使用預設引數
#以要用預設引數,最好將預設引數放到最後
def myPrint(str, age = 18):
print(str, age)
myPrint("kaige")
#輸出:kaige 18
不定長引數: 能處理比定義時更多的引數
加了星號(*)的變數存放所有未命名的變數引數,如果在函式呼叫時沒有指定引數,它就是一個空元組
def func(name, *args):
print(name)
print(type(args))
for x in args:
print(x)
func("sunck", "good", "nice", "handsom")
#輸出:sunck <class 'tuple'> good nice handsom
def mySum(*l):
sum = 0
for i in l:
sum += i
return sum
print(mySum(1,2,3,4,5,6,7)) #輸出:28
** 代表鍵值對的引數字典,和*所代表的意義類似
def func2(**kwargs):
print(kwargs)
print(type(kwargs))
func2(x=1, y=2, z=3) #輸出:{'x': 1, 'y': 2, 'z': 3} <class 'dict'>
匿名函式: 不使用def這樣的語句定義函式,使用lambda來建立匿名函式
特點:
1、lambda只是一個表示式,函式體比def簡單
2、lambda的主體是一個表示式,而不是程式碼塊,僅僅只能在lambda表示式中封裝簡單的邏輯
3、lambda函式有自己的名稱空間,且不能訪問自由引數列表之外的或全域性名稱空間的引數
4、雖然lambda是一個表示式且看起來只能寫一行,與C和C++行內函數不同。
格式: lambda 引數1,引數2,……,引數n:expression
sum = lambda num1, num2:num1 + num2
print(sum(1,2))