什麼是函數?它有什麼作用?
函數是一個整體,你可以把你經常用的代碼定義成一個函數,當你去調用這個函數的時候,就相當於用了整個函數裏面的代碼,裏面的代碼就是封裝代碼。注意,函數是一個整體,所以裏面的變量是局部變量,在外面是用不了的,比如說我在函數裏面設置a=5,在函數外面我們就用不了這個變量a
定義方法及調用方法如下:
def zhouyu(): #定義一個zhouyu的函數 print("i am zhouyu") #zhouyu函數內的封裝代碼 zhouyu() #調用zhouyu這個函數
執行結果
這個是沒有參數的函數,一般情況下,函數裏面可能有一些數是有變化的,這個數是就是參數,這個數可以由上面代碼的結果,或者用戶輸入的值傳到這個函數裏面,代替這個參數讓函數變得更可用。比如:
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放入到這個函數代碼中去執行,就會出現以下結果:
像上面的情況來說,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)
執行結果是
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的數據類型
如果你想返回一個列表,可以用以下方法代碼如下:
def sum_function(a,b): sum1 = a + b return {a,b,sum1} a = sum_function(100,200) print(a) print(type(a))
字典也是同理
如果你默認返回多個值的話,方法會把它封裝成一個元組如下代碼:
def sum_function(a,b): sum1 = a + b return a,b,sum1 print(sum_function(100,200))
下面說一下函數的嵌套
下面代碼是把把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()
上面的執行結果就可以說明函數是可以嵌套的。
下面說一下缺省參數,缺省參數就是參數有默認的值,如果你沒有給這個參數值,這個參數就用它默認的值。如下代碼中,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是用來接收多餘的參數的,我們可以看看執行結果
上面的代碼中,把多餘的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)
執行結果如下:
上面可以知道,其實我們的*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,像這種過程,我們稱這爲拆包