今日內容總結1.1
今日內容總結
在昨日的內容總結中我們提到:函式類似於工具,提前定義好後可以重複使用。而函式體程式碼的重複執行與迴圈體程式碼時不一樣的。迴圈體程式碼是在相同的位置重複執行,函式體程式碼是在不同的位置重複執行。也就是說,昨日開始,我們就踏入開始學函式的大門了。所以今日重點,甚至最近幾日的重點都在與函式。
函式的定義與呼叫
1.函式一定要遵循先定義後呼叫的原則,也就是說,定義的函式程式碼一定要比呼叫函式程式碼先執行。首先是因為我們的python是解釋性語言。逐行翻譯,其次,用生活中的例子來說,我們使用工具之前,是要先有這個工具,才會使用。沒有工具時,也是先創造工具,再使用這個工具的。
2.函式在定義階段只檢測語法,不執行程式碼。
3.函式體程式碼只有在呼叫函式的時候才會執行。呼叫方式是函式名加括號,如果有引數還要傳遞引數。
4.函式名其實相當於是變數名指向的是記憶體中函式體程式碼所在的位置
函式的分類
函式分為內建函式和自定義函式
1.內建函式,內建函式就是python直譯器提前定義好可以直接呼叫的函式。比如之前的基本資料型別的內建方法,就是內建函式
2.自定義函式,也是程式設計師自己編寫的函式。自定義函式又分為無參函式,有參函式,空函式。程式碼示例:
# 無參函式 def output(): print('好好學習') output() # 好好學習 # 無參函式就是在函式定義階段括號內沒有引數,而呼叫無參函式括號內不需要寫引數 # 有參函式 def output(a): print('好好學習', a) output(666) # 好好學習 666 # 有參函式在函式定義階段括號內有引數,類似於變數名,而我們呼叫函式時,括號內也必須有引數,呼叫有參函式時,括號內的引數類似於變數值 # 空函式 def output(): pass # 空函式在定義階段函式體程式碼是用pass或者...佔位。前期能夠通過空函式快速的羅列出程式中大致的功能,讓程式整體框架清晰,空函式大量的使用在專案前期的功能框架搭建。
函式的返回值
函式的返回值其實就是在呼叫函式之後返回的結果,程式碼示例:
# 函式需要先定義後呼叫,函式體中 return 語句的結果就是返回值。如果一個函式沒有 reutrn 語句,其實它有一個隱含的 return 語句,返回值是 None,型別也是 'NoneType'。而return語句的作用,是結束函式呼叫、返回值。類似於迴圈裡面的break。 def showplus(x): print(x) return x + 1 num = showplus(6) # 6 add = num + 2 print(add) # 9
函式返回值的獲取,就是如上述程式碼中的:變數名 = 函式呼叫
無論定義的是返回什麼型別,return 只能返回單值,但值可以存在多個元素。
函式的引數
函式的引數
函式的引數可以分為兩大類。1.函式在定義階段括號內寫的引數稱之為'形式引數',簡稱為形參。2.函式在呼叫階段括號內寫的引數稱之為'實際引數',簡稱為實參
形參與實參的關係,程式碼示例:
def hello(str):
print(str)
hello('hello,world') # hello,world
我們可以看到在函式hello中,str作為一個引數,是形參,這形參個型別取決於你呼叫時輸入的實參型別,我們這裡呼叫函式hello時,傳入了一個字串'hello,world',那麼這個實參的型別就是字串,所以形參str的型別也是字串,所以當我們呼叫函式hello時傳入‘hello,world’,就會執行函式裡面的print語句。值得注意的是,我們在定義函式時形引數量只有一個,因此在呼叫函式時傳入實參也必須是一個!如果傳入的實引數量多餘形引數量會出現錯誤。
由上述示例我們會發現,形參類似於是變數名、實參類似於是變數的值。在呼叫函式的時候傳入實參 會與形參臨時繫結,函式執行結束之後自動解除繫結。
位置引數
1.位置形參
位置形參在函式定義階段括號內從左往右依次填寫的變數名,程式碼示例:
def index(a,b): # a和b就是位置形參
pass
2.位置實參
位置實參在函式呼叫階段括號內從左往右依次傳入的真實資料,程式碼示例:
index('jason', 666): # jason和666就是位置實參
位置引數的特徵,1.位置形參與位置實參在繫結關係的時候就是按照從左往右的順序依次繫結。2.位置形參與位置實參的個數要一致,多一個不行少一個也不行
關鍵字引數
關鍵字引數就是在呼叫函式時,傳入實參時帶引數名,用這樣的方式傳入的實參叫做關鍵字引數。關鍵字引數出現在實參中,指名道姓的給形參傳值,不需要遵循位置。程式碼示例:
# 可以不遵循位置
def output(a, b):
print(a, b)
output(b=666, a='jason') # jason 666
預設引數
預設引數就是定義函式時,形參給定一個值。在函式定義階段就已經給一些形參賦值了,後續如果不傳值則使用預設的,後續如果傳值則使用傳入的,預設引數必須定義在位置引數的後面,預設引數的出現也打破了形參與實參之間個數一致的情況程式碼示例:
def output(a, b, hobby='run'):
print(a, b, hobby)
output('jason', 18, 'stady') # jason 18 stady 傳了就使用自己的
output('jason', 18) # jason 18 run 不傳就使用預設的
可變長引數
定義一個函式,無論傳多少位置實參都可以正常執行。程式碼示例:
# *號在形參中
def output(*a):
print(a)
output() # ()
output(1, 2) # (1, 2)
output(1, 2 , 3, 'jason', 666) # (1, 2, 3, 'jason', 666)
# 可以接收多餘的位置引數 並組織成元組的形式賦值給*號後面的變數名
# **在形參中
def output(a, b, **k):
print(a, b, k)
output(1, 2) # 1 2 {}
output(1, 2, name = 'jason') # 1 2 {'name': 'jason'}
output(1, 2 , name = 'jason',age = 18, hobby = 'run') # 1 2 {'name': 'jason', 'age': 18, 'hobby': 'run'}
# 用於接收多餘的關鍵字引數 並且組織成字典的形式賦值給**後面的變數名。
# 定義一個函式,無論傳入多少關鍵字引數都可以正常執行
可變長形參
可變長形參,無論接收多少個任意型別的引數都可以正常執行的函式。程式碼示例:
def output(*a, **k):
print(a, k)
output() # () {}
output(1, 2, name = 'jason') # (1, 2) {'name': 'jason'}
output(1, 2, 4, name = 'jason',age = 18, hobby = 'run') # (1, 2, 4) {'name': 'jason', 'age': 18, 'hobby': 'run'}
# 後在定義函式的時候,如果不確定這個函式將來需要多個實參,那麼可以採用上述的方法
今日補充
*和**不單單可以在形參中使用 還可以在實參中使用。程式碼示例:
def output(*a, **k):
print(a, k)
# *號在實參中
output(*['jason', 'handsome', 'nb', 666]) # ('jason', 'handsome', 'nb', 666) {}
output(*('jason', 'handsome', 'nb', 666)) # ('jason', 'handsome', 'nb', 666) {}
output(['jason', 'handsome', 'nb', 666]) # (['jason', 'handsome', 'nb', 666],) {}
# 可以將列表或者元組打散成位置引數一一傳入。可以看成是*號會將列表和元組的括號去除,暴露出裡面一個個元素
# **號在實參中
output(**{'name': 'jason', 'age': 18, 'hobby': 'run'}) # () {'name': 'jason', 'age': 18, 'hobby': 'run'}
output({'name': 'jason', 'age': 18, 'hobby': 'run'}) # ({'name': 'jason', 'age': 18, 'hobby': 'run'},) {}
# 可以將字典打散成關鍵字引數一一傳入