學習python,從入門到放棄(11)
學習python,從入門到放棄(11)
函式的定義與呼叫
函式一定要遵循先定義後呼叫的原則,就是要定義函式的程式碼要比呼叫函式的程式碼先執行,再簡單一定就是定義程式碼要寫在呼叫程式碼上面。函式在定義階段只檢測語法不執行程式碼的,只有在呼叫函式的時候才會執行。函式名其實相當於是變數名指向的是記憶體中函式體程式碼所在的位置。
def func():
print('hello world')
func() # hello world
函式的分類
-
內建函式
python直譯器提前定義好可以直接呼叫的函式,可以直接呼叫使用。
-
自定義函式
自己編寫的函式分為無參函式、有參函式和空函式。
無參函式在定義階段,括號內是沒有引數的。
def func(): print('hello world') func() # hello world
有參函式在定義階段是有引數的,呼叫時括號內也必須傳引數。
def func(a): print('hello world', a) func(111) # hello world 111
空函式則是在程式碼定義階段函式體程式碼用pass或者...佔位
def func(): pass
空函式用於前期快速的羅列出程式中大致的功能,讓程式整體框架清晰 空函式大量的使用在專案前期的功能框架搭建。
函式的返回值
函式的返回值其實就是在呼叫函式之後返回的結果,在自定義函式中,當函式體程式碼沒有 return 關鍵字的時候 返回值是 None。
def func():
print('hello world')
print(func()) # None
函式體程式碼寫了 return 但是沒有跟任何值得時候 返回值也是 None
def func():
print('hello world')
return
print(func()) # None
函式體程式碼寫了return並且跟了資料,那麼寫什麼就返回什麼。
def func(): a = 'hello world' return a print(func()) # hello world
函式的引數
-
簡介
函式的引數可以分為兩大類,函式在定義階段寫的引數叫做形式引數也叫形參。函式在呼叫階段寫的引數叫做實際引數也叫實參。
-
關係
形參類似於是變數名、實參類似於是變數的值,在呼叫函式的時候傳入實參,會與形參臨時繫結,函式執行結束之後自動解除繫結。
def func(a, b): # 形參 print(a, b) func(1, 2) # 實參
位置引數
在函式定義階段括號內從左往右依次填寫的變數名
def func(a, b): # a和b就是位置形參
print(a, b)
func(1, 2) # 1和2就是位置實參
位置形參與位置實參在繫結關係的時候就是按照從左往右的順序依次繫結,位置形參與位置實參的個數要一致,多一個少一個都不行。
關鍵字引數
出現在實參中,指名道姓的給形參傳值,不需要遵循位置。
def index(a, b):
print(a, b)
index(b=111, a=222) # 指名道姓的說形參a接收資料222 b接收資料111
# index(b=333, 222) # 報錯 關鍵字引數必須放在位置引數的後面
# index(222, a=111) # 報錯 形參只能指向一個實參
index(222, b=111) # 可以 相當於位置引數
實參222會按照位置繫結給形參 a,然後又通過關鍵字引數給形參a重複綁值,是不被允許的。
預設引數
出現在形參中,在函式定義階段就已經給一些形參賦值了,後續如果不傳值則使用預設的,後續如果傳值則使用傳入的,預設引數的出現也打破了形參與實參之間個數一致的情況,預設引數必須定義在位置引數的後面
def register(name, age, gender='猛男'):
"""
函式的形參在命名的時候也應該見名知意
"""
print("""
學員姓名:%s
學員年齡:%s
學員性別:%s
""" % (name, age, gender))
register('jason', 18) # 不傳就使用預設的
'''
學員姓名:jason
學員年齡:18
學員性別:猛男
'''
register('kevin', 28)
'''
學員姓名:kevin
學員年齡:28
學員性別:猛男
'''
register('jerry',22,'美女') # 傳了就使用自己的
'''
學員姓名:jerry
學員年齡:22
學員性別:美女
'''
可變長引數
可變長引數,無論傳多少位置實參都可以正常執行。
def func(*a):
print(a)
func() # ()
func(1,2) # (1, 2)
func(1,2,3,4,5,6) # (1, 2, 3, 4, 5, 6)
星號,可以接收多餘的位置引數,並組織成元組的形式賦值給星號後面的變數名。
雙星號用於接收多餘的關鍵字引數 並且組織成字典的形式賦值給雙星號後面的變數名。
def func(**k):
print(k)
func() # {}
func(a=1,b=2) # {'a': 1, 'b': 2}
func(a=1,b=2,c=3,d=4) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
可變長形參
可變長形參,無論接收多少個任意型別的引數都可以正常執行函式。
def func(*a,**k):
print(a,k)
func() # () {}
func(1,2,3,4,name='jason',age=18) # (1, 2, 3, 4) {'name': 'jason', 'age': 18}
如果不確定這個函式將來需要多個實參,那麼可以採用可變長形參的方法。
星號和雙星號不單單可以在形參中使用,還可以在實參中使用。
星號在實參中,可以將列表或者元組打散成位置引數一一傳入,可以看成是星號會將列表和元組的括號去除,暴露出裡面一個個元素。
def index(*args, **kwargs):
print(args, kwargs)
index(*['jason', 'kevin', 'tony', 'oscar', 'jerry']) # ('jason', 'kevin', 'tony', 'oscar', 'jerry') {}
index(*('jason', 'kevin', 'tony', 'oscar', 'jerry')) # ('jason', 'kevin', 'tony', 'oscar', 'jerry') {}
index(['jason', 'kevin', 'tony', 'oscar', 'jerry']) # (['jason', 'kevin', 'tony', 'oscar', 'jerry'],) {}
print(*[1,2,3]) # print(1,2,3)
雙星號號在實參中,可以將字典打散成關鍵字引數一一傳入
def index(*args, **kwargs):
print(args, kwargs)
index(**{'name':'jason','age':18,'pwd':123}) # () {'name': 'jason', 'age': 18, 'pwd': 123}
index({'name':'jason','age':18,'pwd':123}) # ({'name': 'jason', 'age': 18, 'pwd': 123},) {}
總結
今天學習了函式的相關知識,讓我對函式有了更深的瞭解。