函數基本學習之一
函數的本質
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是多餘的關鍵字實參,所以放到多餘的關鍵字形參里