python之函數

什麼是函數?它有什麼作用?

函數是一個整體,你可以把你經常用的代碼定義成一個函數,當你去調用這個函數的時候,就相當於用了整個函數裏面的代碼,裏面的代碼就是封裝代碼。注意,函數是一個整體,所以裏面的變量是局部變量,在外面是用不了的,比如說我在函數裏面設置a=5,在函數外面我們就用不了這個變量a

定義方法及調用方法如下:

def zhouyu(): #定義一個zhouyu的函數
    print("i am zhouyu") #zhouyu函數內的封裝代碼
zhouyu() #調用zhouyu這個函數

執行結果

wKioL1m90U6jOd-CAAAdStJVpBI940.png


這個是沒有參數的函數,一般情況下,函數裏面可能有一些數是有變化的,這個數是就是參數,這個數可以由上面代碼的結果,或者用戶輸入的值傳到這個函數裏面,代替這個參數讓函數變得更可用。比如:

def sum_2_nums(a,b):
    sum1 = a + b
    print("%d + %d = %d"%(a,b,sum1))
sum_2_nums(100,200)

從上面的代碼可以看出,我們定義了一個函數sum_2_nums,這個函數有兩個參數,一個是a,一個是b,(注意:參數一般是寫在函數的括號裏面的)這兩個參數就可以在封閉代碼上應該了,如上面代碼的第二行就可以知道a,b這兩個參數被應用了,下面我們看第四行代碼,可以看到這個函數被調用了,與之前調用的不同的是這個函數被調用的時候,還加上了兩個數字,一個是100,一個是200,其實可以是這樣的,我們調用這個函數的時候,代碼就會去找有沒有這個函數,如果有,就會執行這個函數,很顯然,是有這個函數的,而且這個函數需要我們提供兩個參數,一個爲a,一個爲b,那麼我們在調用這個函數的時候,就得提供兩個參數,如上代碼,我們提供的參數就是100和200函數就會把a=100,b=200放入到這個函數代碼中去執行,就會出現以下結果:

wKioL1m92BLDjy_gAAADfcwDbXo983.png

像上面的情況來說,a,b就是形參,而100,200就是實參,形參其實就是一個形象的參數,就是虛擬的,而實參就是實實在在的參數,比如100,200就是實際的參數。

如果你把上面代碼的100,200換成別的,那a和b的值也會隨着變化。

下面說return這個的作用

return就是把一個方法的執行結果返回出來,比如下面我們想獲取sum1的結果,可以通過return獲取

def sum_function(a,b):
    sum1 = a + b
    return sum1
print(sum_function(100,200))

如果你沒有加入return sum1的話,你去執行這個代碼,sum_function(100,200)這個方法的結果是空的,也就是None,就什麼都沒有打印出來,因爲這個函數沒有返回任何數據。當然,也有另外一種方法,就是把這個sum1定義成一個全局變量,可以通過以下代碼:

def new_sum(number):
    global sum2
    sum2 = number + 3
new_sum(50)
print(sum2)

執行結果是

wKioL1m-HlqyOggsAABOBvP1gBY767.png

global其實就是聲明一個全局變量,這樣我們就可以在外面應這個變量啦

有同學可能會說,那我要它的返回值幹嘛,請看下面,如果new_sum想要拿到上一個方法的結果來當成我這個方法的變量,怎麼辦,因爲函數裏面的變量是局部變量,在外面是獲取不到的,所以我們通過返回值來獲取我們想要的東西:

def sum_function(a,b):
    sum1 = a + b
    return sum1
def new_sum(number):
    sum2 = number + 3
    print(sum2)
a = sum_function(100,200)
new_sum(a)

當上面的代碼執行到第7行代碼的時候,就會去調用sum_function這個函數,並傳入了兩個數值,100和200.這時候就會去執行sum_function這個函數,因爲這個函數裏面有return,所以就會去return出來的值賦給了a,這樣a就有值了,然後再把a的值賦給了new_sum這個函數

注意返回值可以多個,但是return只能有一個,因爲方法在執行的時候,看到return它就不執行下面的代碼,直接退出方法啦,那如果我們想返回多個值怎麼辦呢,返回值可以爲任何類型,比如元組,字典,列表。這樣的話,我們就可以把多個值放在字典或者元組或者列表裏面

代碼如下:

def sum_function(a,b):
    sum1 = a + b
    d = {a,b,sum1}
    return d
a = sum_function(100,200)
print(a)
print(type(a))

這樣我們返回的就是一個set的數據類型

wKioL1m97t6SyTHVAABdh5CQfgw963.png

如果你想返回一個列表,可以用以下方法代碼如下:

def sum_function(a,b):
    sum1 = a + b
    return {a,b,sum1}
a = sum_function(100,200)
print(a)
print(type(a))

wKiom1m97-OxhFqHAABOrUdqGgc884.png

字典也是同理

如果你默認返回多個值的話,方法會把它封裝成一個元組如下代碼:

def sum_function(a,b):
    sum1 = a + b
    return a,b,sum1
print(sum_function(100,200))

wKiom1m98ZfDq6IkAAA8BR5TGwc092.png

下面說一下函數的嵌套

下面代碼是把把print_line函數嵌套在print_5_line函數上

def print_line():
    print("-"*50)
def print_5_line():
    i = 1
    while i <= 5:
        print_line()
        i = i + 1
print_5_line()

wKioL1m9_Y-AwvD4AABsErVGNm4474.png

上面的執行結果就可以說明函數是可以嵌套的。

下面說一下缺省參數,缺省參數就是參數有默認的值,如果你沒有給這個參數值,這個參數就用它默認的值。如下代碼中,zhouyu函數有兩個形參a和b,也就是說我們去調用它的時候要傳入兩個參數,那爲什麼代碼去調用zhouyu的時候只傳入一個參數卻沒有報錯呢,因爲b=12是缺省參數,也就是說,如果只傳入一個參數,那麼b就會使用默認值也就是12,所以執行結果是sum = 13。

def zhouyu(a,b=12):
    sum1 = a + b
    print("sum = %d" %sum1)
zhouyu(1)

如果你調用zhouyu的時候傳入兩個參數,那b=12就不生效啦,如下:

def zhouyu(a,b=12):
    sum1 = a + b
    print("sum = %d" %sum1)
zhouyu(1,22)

執行結果是sum = 23

這裏要注意一下,缺省參數只能放在最後,不能放在中間或者前面,如下面代碼,一定會報錯的:

def zhouyu(a=12,b):
    sum1 = a + b
    print("sum = %d" %sum1)
zhouyu(1,22)

如果你有三個參數呢最後兩個是缺省參數,然後你只想讓第三個參數不要用默認值,用你傳入的值,怎麼辦呢,可以看看下面代碼:

def zhouyu(a,b=12,c=22):
    sum1 = a + b + c
    print("sum = %d" %sum1)
zhouyu(1,c=33)

從上面代碼可以看出b的默認值是12,c的默認值是22,那如果你想改變c的值而不改變b的值的話,你可以在傳入參數的時候寫上c=33,這樣c就不會應用默認值22,而用33,像這種我們就稱c=33是命名參數

這裏我們是明確知道我們想要傳入幾個參數,那麼,如果我們不知道自己想傳入幾個參數怎麼辦呢

def long_argue(a,b,*argue):
    print(a)
    print(b)
    print(argue)
long_argue(1,2,3,4)

上面代碼中,*argue是用來接收多餘的參數的,我們可以看看執行結果

wKioL1m-TxSDXsaUAABeebFGZP4264.png

上面的代碼中,把多餘的3,4傳入到argue這個參數裏面,變成了一個元組,那麼它有什麼用呢,比如說,我們想讓很多個值相加,可是不知道大概有多少個值,就可以通過這個來實現。如下代碼:

def long_argue(a,b,*argue):
    for i in argue:
        sum1 = sum1 + i
    sum1 = sum1 + a + b
long_argue(1,2,3,4)

由上面的代碼就可以知道,把多餘的3,4傳入給了argue,這樣argue就是一個元組啦,如果要讓他們想加的話,就得把元組裏面的值一個一個的取出來,並讓它們相加,然後再讓結果去加上a,b這樣就可以實現多個值相加啦。

下面還有一種,就是在*argue後面加上**kwargue這個參數,那麼它又是什麼意思呢,可以看看下面代碼的解釋:

def long_argue(a,b,*argue,**kwargue):
    print(a)
    print(b)
    print(argue)
    print(kwargue)
long_argue(1,2,3,4)

執行結果如下:

wKioL1m-UUOhrVuPAABj8j_fMx4115.png

上面可以知道,其實我們的*argue是用來接收一些數值或字符串的,並把這些數據變成元組,而**argue是用來接收命名參數(什麼是命名參數可以看看上面紅色字體部分,有相關的解釋),並把這些命名參數變成字典。

如果我們有一個元組和一個字典,現在想把元組和字典都傳遞到函數中,應該怎麼做呢,可以看看以下代碼:

def long_argue(a,b,*argue,**kwargue):
    print(a)
    print(b)
    print(argue)
    print(kwargue)
A = (44,55,66)
B = {'name':'zhouyu','age':22}
long_argue(11,22,*A,**B)

如果你不在第8行代碼中,A和B前面加上*號的話,傳入參數的時候就會默認把A和B看成一個整體,也就是字符串,然後把這兩個字符串都傳入到*argue這個參數裏面去,就變成了元組的值。而上面代碼就是把*A拆成一個個數字,也就是44,55,66的數值,然後傳遞給*argue,把B拆成"name"="zhouyu","age"=22,然後傳入了B,像這種過程,我們稱這爲拆包


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章