函數基礎學習01

2022-07-01 21:00:40

函數的本質

1.函數的含義

​ 函數可以看成是工具,提前定義好,之後反覆使用

2.為什麼要有函數呢?

​ 舉例說明:假使我們在修水管的時候需要用到扳手,但是我們沒有提前準備好,只能現場製造,然後製造好了這次使用過後就扔掉了,那麼我們下次使用的時候又沒有準備又得現場製造,這樣每次反覆操作,過程繁瑣,費時又費力。那運用到我們函數的身上函數就相當於那個扳手。

'''
1.提前定義好一個方法
2.後面用的時候,可以反覆使用,無論在那個地方都可以呼叫
3.函數必須要提前定義好,之後才能使用
'''
def my_len():  # 函數的定義(提前準備工具的過程)
    print('aaaa')

my_len()  # 函數的使用,也稱函數的呼叫(開始選擇工具並使用)

my_len()

函數的語法結構

def 函數名(引數1,引數2....):
    '''函數功能的註釋,告訴別人這個函數是幹嘛用的'''
    函數體(實現功能的程式碼)
    return 返回值

語法結構中各個資料的含義:

1.def 是定義函數的關鍵字

2.函數名 與變數名的命名一致,最好做到見名知意

3.括號 在定義函數的時候函數名後面必須要有括號

4.引數 定義函數括號內的引數可以寫多個不限制引數的個數,同樣也可以一個都不寫,用於接收外界傳遞給函數體程式碼內部的資料

5.函數作用 用於介紹函數的功能,教你怎麼用,用在什麼地方

6.函數體程式碼 整個函數最核心的區域,各種功能的實現

7.return 控制函數的返回值,呼叫函數之後的返回值,就是函數體執行完後返回的結果,可以設定你想要的結果,不要也可以,總結就是執行完函數體後有沒有反饋

函數的定義與呼叫

1.函數必須先定義後使用,定義函數的程式碼必須要在呼叫函數之前先執行

2.定義函數使用def關鍵字,呼叫函數使用函數名加括號,括號裡可能會因為需求會傳引數進去

3.函數在定義階段只檢測函數體程式碼語法,不執行函數體程式碼,函數體的程式碼知道有在呼叫的階段才會正真的去執行函數體程式碼,注意它檢測函數體程式碼的語法問題,就是檢測函數的語法,例如一些if、for等,語法要沒問題才可以

4.函數名到底是是什麼?

​ 函數名系結的是一個記憶體地址,裡面存放的是函數體程式碼,想要使用這段程式碼的話需要用函數名加括號進行呼叫

def func():
    print('from func')
func
'''
這個時候返回的是什麼呢?
其實這個時候func相當於一個變數名,只是拿了一下,沒有用,並沒有進行列印或者賦值因此是沒有錯誤的
'''
def func():
    print('from func')
print(func())
'''
函數名加括號執行優先順序最高,在執行的時候先執行函數名加括號,先出來func()的列印結果,然後再執行Print
'''
def func():
    print('from func')
print(func)  # <function func at 0x0000022307409550>
'''
那麼函數名到底是什麼??通過列印我們可以看到結果是一個地址,其實這個就是一個記憶體地址他跟普通的變數名稍微有一點不同繫結的是記憶體地址裡面的某一個東西,如果要用的話可以加括號使用
但是其實它跟變數名差不多,變數名是繫結的一個資料值而它繫結的是一串程式碼,如果要使用的話加括號就是使用這個函數,就是說如果你想拿到這串程式碼的話你的使用這個函數名加()
函數名與變數名的區別就是,一個綁的是一個具體的資料值,一個綁的是一串程式碼,使用的時候一個直接使用變數名就可以,使用函數的時候需要用函數名加括號
'''

函數的分類

1.內建函數

​ 直譯器提前定義好的函數,使用者可以直接呼叫

​ 內建方法與內建函數的區別:內建函數是直譯器提前定義好的,在任何地方都可以使用,而內建方法它得跟在具體得資料型別後面才可以使用

2.自定義函數

​ 2.1 空函數:沒有函數體程式碼使用pass頂替,暫時沒有任何功能

def func():
    pass
'''主要用於前期得搭建,提示主要功能,先整一個框架出來,後期再慢慢的新增功能程式碼'''

​ 2.2 無參函數

def func():
    print('aaa')
'''
空函數也算是無參函數的一種
無參函數在使用的時候就是直接使用無需呼叫引數進去,直接拿著函數名()就執行就好了
'''

​ 2.3 有參函數

def func(a,b):
    print('aaa')
'''
指函數定義階段括號內填寫的引數
在呼叫的時候必須傳入引數(資料值)才可以,不給引數(資料值)就會報錯不能使用
'''

函數的返回值

1.什麼是返回值?

​ 返回值就是呼叫函數之後產生的結果,可以有也可以沒有,獲取函數返回的方式是固定的

2.函數的返回值

'''
1.函數體程式碼沒有return關鍵字,預設返回None
'''
def func():
    print('from func')
res = func()
print(res)
# 先執行func(),然後將函數執行的返回值賦值給變數名,但是此時函數沒有返回值,因此返回的是None
'''
2.函數體程式碼有return關鍵字:有但是後面沒有寫  也返回None
'''
def func():
    print('from func')
    return
res = func()
print(res)  # None
'''
3.函數體程式碼有return關鍵字:並且有值,函數體程式碼有return,return後面是啥就返回啥
'''
def func():
    print('from func')
    return 123
res = func()
print(res)  # 123
'''
4.函數體程式碼有return關鍵字:寫什麼就返回什麼,如果是變數名,那麼就要找到那個變數名,變數名系結的值是什麼就返回什麼
'''
def func():
    print('from func')
    name = 'jason'
    return name
res = func()
print(res)  #jason
'''
5.函數體程式碼有return關鍵字並且後面寫了多個資料值(名字)逗號隔開,返回之後自動變成元組(預設情況下),如果想返回其他型別就要去自己加上他們該有的特徵
'''
def func():
    return 1, 2, 3, 4, 5
'''
6.函數體程式碼遇到return關鍵字會立刻結束函數體程式碼的執行
'''
def func():
    print('aaa')
    return 123
    print('bbb')
func()
# return類似於迴圈中的break,函數體程式碼執行結束的標誌

函數的引數

1.形式引數

​ 函數在定義階段括號內填寫的引數,簡稱:「形參」

2.實際引數

​ 函數在呼叫的階段填寫的引數,簡稱「實參」

3.形參與實參的關係

​ 形參相當於是變數名,實參相當於是資料值,在函數呼叫的階段形參會臨時與實參進行繫結,函數執行結束立即解除。

​ 動態繫結 動態解除

函數的位置引數

1.位置形式引數

​ 在函數定義階段括號內從左往右依次填寫的變數名稱之為位置形參

2.位置實際引數

​ 在函數呼叫階段括號內從左往右依次填寫的變數名稱之為實際引數。實參可以是資料值也可以是繫結了的資料值的變數名。

ps:給位置形參傳值時候必須個數一致,多不行少也不行,得正正好。

函數的關鍵字引數

關鍵字實參

​ 在函數呼叫階段括號內以什麼等於什麼的形式傳值稱之為關鍵字實參

'''
1.指名道姓是傳值,打破了位置得限制
'''
def func(a, b):
    print(a, b)
func(a=1, b=2)
func(b=1, a=2)
'''
1.第一個是關鍵字實參給到了b,第二個是位置實參也給到了b,這麼做是不可以的
2.同一個形參同一時間不可以多個給值
3.位置實參必須在關鍵字實參前面
  ps:也可以記為,無論是形參還是實參,越短得越靠前(這個長短不是長短得長短,而是它們得複雜程度)
'''
def func(a, b):
    print(a, b)
func(b=1, 2)  # positional argument follows keyword argument

def func(a, b):
    print(a, b)
# func(1, 2)
# func(b=1,a=2)
# func(b=1,2)
# func(2,b=1)
func(666,a=1)


函數的預設值引數

預設值形參

​ 在函數定義階段括號內以什麼等於什麼的形式填寫的形參稱之為預設值形參

'''
    在生活中,我們經常會碰到註冊一些賬號的時候,有些東西我們如果不填的話,進去主頁以後然後更改資訊的時候會發現會有預設值,一些女性軟體可能在初始的時候預設為女性,就是提前定義好,預設是這個值,如果想要別的值可進行重新定義
    碰到預設值引數的時候,如果不填的話就是預設的值,如果填了的話就是此時的值
    引數的放置情況還是按照複雜程度從短到長放置
'''
def register(name, age, gender='male'):
    print(f"""
        --------infor-------
        name:{name}
        age:{age}
        gender:{gender}
        --------------------
    """)
register('zhangran', 18, 'female')
register('mengmeng', 16, 'female')
register('jerry', 23)

函數的可變長引數

可變長形參

​ 可以打破形參與實參的個數限制,隨意傳值

​ 君子協定:*args,**kwargs

'''
定義一個函數,無論接收多少位置實參都可以執行
*X 不是變數名,變數名是以字母數位下劃線組成的
在形參中的作用:接收多餘的位置引數並組織成元組的形式賦值給*後面的變數名
'''
def func(*X):
    print(X)
func()  # ()
func(1)  # (1,) 函數中是沒有位置引數的,所以它是一個對於的引數
func(1, 2)  # (1, 2)
func(1, 2, 3, 4)  # (1, 2, 3, 4)
'''
定義一個函數,無論接收多少關鍵字實參,都可以執行
**在形參中的作用:接收多餘的關鍵字引數並組織成字典的形式賦值給**後面的變數名
'''
def func(**Y):
    print(Y)
func(name='jsaon')  # {'name': 'jsaon'}
func(name='jsaon',age=18)  # {'name': 'jsaon', 'age': 18}
func(name='jsaon',age=18,gender='male')  # {'name': 'jsaon', 'age': 18, 'gender': 'male'}
'''
能夠定義一個函數,無論怎麼傳值都可以執行
'''
def func(*X, **Y):
    print(X)
    print(Y)
func()  # () {}   沒有位置形參也沒有關鍵字形參,返回一個空括號,返回一個空字典
func(1)  # (1,) {}   沒有位置形參也沒有關鍵字形參,但是1是位置實參,所以放到了多餘的位置形參裡,沒有多餘的關鍵字形參,返回一個空字典
func(1, 2)  # (1, 2) {}   沒有位置形參也沒有關鍵字形參,但是1,2是位置實參,所以放到了多餘的位置形參裡,以元組的方式返回,沒有多餘的關鍵字形參,返回一個空字典
func(a=1)  # () {'a': 1}   沒有位置形參也沒有關鍵字形參,沒有多餘的位置實參,返回一個空括號,a=1是多餘的關鍵字實參,所以放到多餘的關鍵字形參裡
func(a=1, b=2)  # () {'a': 1, 'b': 2}   沒有位置形參也沒有關鍵字形參,沒有多餘的位置實參,返回一個空括號,a=1,b=2是多餘的關鍵字實參,所以放到多餘的關鍵字形參裡