1. 程式人生 > 實用技巧 ># python基礎之函式,python小白必備!!

# python基礎之函式,python小白必備!!

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的前面,你這樣傳我很難做。然後就報錯了