1. 程式人生 > >python學習筆記11(函式)

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))