# python基礎之函式,python小白必備!!
阿新 • • 發佈:2020-07-05
python之函式
什麼是函式?函式是一段可常用的程式碼,為了日後可以經常性的去呼叫。python自身有很多內建函式,比如說input,print,我們也可以自己去定義函式
建立函式
python中,
def
關鍵字用來宣告函式
下面一步步來認識建立函式
首先函式的格式是:
def 函式名(引數1,引數2.....引數n):
函式中的語句
def nothing(): pass #我建立了一個叫nothing的函式,nothing()中我沒有設定引數,語句是一個pass,pass並不是只能用於函式中, #if中用pass也可以,相當於空。 #按照中文意思來說就是我過了,給系統表達你不用理我,但我是合法的意思, #而實際操作意義是,我只是想用一個pass來暫時建立這個函式的基本骨架,讓系統先不要報錯,回過頭來我再完善語句
def average_pn(a,b):
result = (a + b)/2
print(result)
average_pn(2,4)
#結果是3
#這裡我定義了一個叫average_pn求正數平均數的函式,
#我還設定了兩個引數,這兩個引數是抽象意義來說的,
#那麼我這個函式的演算法是兩個數相加除以2,最後打印出來。
#呼叫average_pn()函式後,寫入具體資料實現函式的功能
上面的這個函式中,結果直接打印出來,但是在實際意義上來講,我們希望他是返回一個值,然後我們給返回的值進行變數的賦值,繼續完成我們程式下面的操作,所以說直接print
實際操縱意義不大,更應該是返回一個值,而對於返回值下面又會繼續用程式碼來說明。
返回值return
用於將函式的結果返回出來
- 函式可以沒有返回值,那麼其實就相當於返回了 None
- 當return執行時,函式會不留情面的立刻結束
def average_pn(a,b): if a == b: return a elif a<0 or b<0: return else: result = (a+b)/2 return result avg = int(average_pn(1,13)) print(avg) #結果是7 #ps :這裡解釋一下為什麼我要int轉換型別,因為在python3中/除出來就算是整數也是會個小數 #詳情看看這個網址 https://blog.csdn.net/weixin_40485502/article/details/82832450 #這裡我定義了一個只能求正數平均數的函式 average(a,b),並設定了兩個引數。 #當判斷a等於b的時候,就不需要進行計算,返回a即可; #當發現a小於0或b小於0的時候,即不合法的輸入的時候,直接返回None, #其他則是有效結果進行相加求平均數。
有三種情況會返回None :沒有return(就是沒寫return),return為空(就是隻寫return),第三種就是return None
全域性變數和區域性變數
全域性變數:函式外面的變數,在任何地方都可以訪問的變數
區域性變數:函式裡面的變數,只能放在函式內部使用
a = 12 #全域性變數
def show():
b = 5 #區域性變數
print(a)
print(b)
show()
#結果是:
# 12
# 5------呼叫了上面函式的時候,函式裡面定義b,列印b,並且列印了全域性變數a
print(a) #12 直接列印全域性變數a
print(b) # 這裡會報錯,可以理解為在主函式中用不了你這個區域性變數,會提示b未定義
# 可以這麼通俗的理解,a就是公共衛生間,b是你家裡的衛生間,
#如果有個你不認識的人去用你家裡的衛生間,你肯定也會報警;但是你家裡的人去公共衛生間那麼不會報警。
同名變數的遮蔽
當全域性變數和區域性變數同名時,會優先使用區域性變數--有人管這叫
就近原則
a = 12
def show():
a = 5
print(a)
show() #結果是5
print(a) #結果是12
#這裡呼叫函式的時候,函式中print(a),這個a是優先使用區域性變數的a
#這裡有個很重要的點,不要理解為函式中a = 5是為全域性變數賦值為5了,
#因為下面那一句print(a)結果還是12,只是函式中就近原則使用了局部變數,
#換句話來說就是在本地產生了一個新的a,上面全域性變數我沒動你(這也是python不用宣告的一個小"bug"吧)
如果你真想對全域性變數賦值,而不是產生一個新的a,可以用global關鍵字,下面看程式碼演示
a = 12
def show():
global a
#不希望遮蔽,而是修改全域性變數,你要宣告一下,告訴系統我想改變的是全域性變數a,而並不是產生一個新的a
a = 5
print(a)
print(id(a)) ##這裡列印此時a的id
show()
print(a)
print(id(a)) ##這裡列印此時a的id
## 結果是兩個都是5,兩個都是一樣的id,證明只是修改了全域性變數,並不是產生了一個新的a,這兩個a是一樣的
#當然你也可以通過global關鍵字在函式裡面創造全域性變數
def show():
global a
a = 5
print(a)
#結果是5,這裡直接上函式,在函式裡面定義了一個全域性變數a,告訴系統我建立的就是一個全域性變數a,那麼最後自然也能打印出來
總結:global關鍵字是對全域性變數的一種保護。
其實寫程式要儘可能少的去使用全域性變數,不然會容易起衝突,會容易互相汙染,而
global
存在的意義則是要保護這麼個全域性變數,防止有人不知道他所定義的這個變數是全域性變數從而去修改了他。當你用global
關鍵字的時候就是提醒系統我知道我在操作全域性變數這件事,你不用管我,我知道我自己在幹什麼再囉嗦一句,精闢一句,
global
的實際存在意義是為了在多人協作專案中防止"天下大亂"。
引數
引數用於向函式內部傳遞資料
預設引數
def show(a,b = 100):
print(a,b)
show(1,5) #1,5
show(1) #1,100
show() #報錯
#這裡我建立了一個叫show()的函式,設定了兩個引數:a,b。
# a的值沒有給出預設由操作者寫入資料,b的值給出了預設等於100。什麼意思呢?當使用這個函式的時候:
1.a的值你一定要給我,b的值你可以不給我
2.b的值你不給我,我就用我預設的值100執行 print
也就是說你去這個show餐廳點餐,要求點兩個菜,有一個菜a你是必須要自己點的,菜b我可以幫你點,你不點我就幫點了這個,當然你也可以自己點,我會優先遵從你的點法。
預設引數雖然好,可是也要注意一下 以下的事情
def show(a=10,b)
print(a,b)
show(12)
#這裡我像上面那樣設定了一個函式兩個引數,但不同的是,我設定的是a的預設值,此時我只想傳一個引數,因為a默認了嘛,我以為他能傳一個引數就能傳給b,但是報錯了。
#報錯:non-default argument follows default argument
?為什麼
# 這裡注意一點,注意a的位置,a是在b的前面的,a設定了預設值,雖然設定了預設值,可是當我傳一個引數的時候,系統就會摸稜兩可,自我掙扎,你這是傳給a,還是傳給b呢,我知道你可能想傳給b,可是a在b的前面,你這樣傳我很難做。然後就報錯了