python函數入門

知識內容:html

1.函數的做用python

2.函數的定義與調用app

3.函數的返回值ide

4.函數的參數函數

5.局部變量與全局變量測試

6.做用域ui

 

 

1、函數的做用spa

1.複用代碼調試

將可能重複執行的代碼封裝成函數,並在須要執行的地方調用函數,不只能夠實現代碼的複用,還能夠保持代碼的一致性,便於往後的維護code

 

2.提升可讀性

使用函數能夠提升代碼的可讀性,便於後期的代碼維護,同時也有利於軟件測試的進行

 

3.可拓展性

使用函數能夠方便地進行功能的拓展,方便地進行功能添加,由於一個函數內部發生改變了,調用它的地方均可以發生改變。

 

 

2、函數的定義與調用

1. 函數的定義

(1)函數是指將一組語句的集合經過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名便可

 

(2)在python中定義函數的語法以下:

1 def 函數名(參數): 2     # 註釋
3     函數體

在python中使用def關鍵字定義函數,而後是一個空格和函數名稱,接下來是一對圓括號,在圓括號中是函數的參數,也就是形式參數列表,

多個參數用逗號隔開,圓括號以後是冒號,而後換行,最後是註釋和函數體代碼

 

(3)定義函數注意:

函數形參不須要聲明變量,也不須要指定函數返回類型;即便函數不須要接受任何參數,也必須保留一對空的圓括號;括號後的冒號不能少;函數體相對於def關鍵字必須保證一個縮進(4個空格1個tab)

 

(4)函數名:

函數名:函數名是包含字母,數字,下劃線的任意組合,可是不能以數字開頭。雖然函數名能夠隨便取名,可是通常儘可能定義成能夠表示函數功能的,另外建議函數名不要以大寫開頭,通常類名以大寫開頭,函數名命名法則建議使用下劃線鏈接法

函數名示例:  show_result()  input_numbers()

 

2.函數調用

1 返回值=函數名(參數1,參數2) 2 函數名(參數1,參數2)

 

示例:

 1 # __author__ = "wyb"
 2 # date: 2018/3/21
 3 # 定義一個函數輸出費波納西數列小於1000的項
 4 
 5 
 6 # 定義函數:
 7 def fib(n):  8     a, b = 1, 1
 9     while a < n: 10         print(a, end=' ') 11         a, b = b, a+b 12     print() 13 
14 
15 # 調用函數
16 fib(1000) 17 
18 函數定義於函數調用
函數定義與函數調用

 

 

3.函數的分類

函數的分類:內置函數與自定義函數 

關於python的內置函數,看個人這篇博文:http://www.cnblogs.com/wyb666/p/8638891.html

 

 

 

3、函數的返回值

1.return的做用

 return的做用: 結束一個函數的執行並返回,同時還可能夠經過return返回一個任意類型的值

 

2.return返回的值

return返回的值能夠是任何數據類型,字符串、列表、字典、數字、自定義類型等均可以,能夠有一個或多個返回值,也能夠沒有返回值

函數中沒有return語句或沒有執行到return語句而返回或執行了不帶任何值的return語句,則函數默認返回空值None;當函數返回多個值時,python將這些值放入元組中,返回這個元組。

 

示例:

 1 # __author__ = "wyb"
 2 # date: 2018/3/21
 3 # 函數有一個或多個返回值
 4 
 5 
 6 def f():  7     a = 1
 8     b = 2
 9     c = 3
10     print("函數有一個或多個返回值") 11     # return a # 一個返回值
12     return a, b, c                  # 多個返回值,以元組的方式返回
13 
14 
15 print(f())
函數有一個或多個返回值
 1 # __author__ = "wyb"
 2 # date: 2018/3/21
 3 # return的做用
 4 
 5 
 6 def f():  7     print(123434)  8     # return 1 # 結束函數的執行
 9     print(23234) 10 
11 
12 print(f())
return的做用

 

總結:

返回值數=0,返回None

返回值數=1,返回object

返回指數>1,返回tuple

 

 

4、函數的參數

1.實參和形參

(1)形參:  形式參數,函數定義時圓括號內是使用逗號分開的形參列表,即函數定義的圓括號中的爲形參,只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。所以,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參

 

(2)實參:  實際參數,函數調用時圓括號內是使用逗號分開的實參列表,即函數調用的圓括號中的爲實參,實參能夠是常量、變量、表達式、函數等,不管實參是何種類型的量,在進行函數調用時,它們都必須有肯定的值,以便把這些值傳送給形參。所以應預先用賦值,輸入等辦法使實參得到肯定值

 

二者之間的區別:  形參是虛擬的,不佔用內存空間,形參變量只有在被調用時才分配內存空間,實參是變量,佔用內存空間,形參和實參之間的數據傳遞是單向的,實參能夠傳給形參,形參不能傳給實參,在大部分狀況下修改形參的值不改變對應的實參值

 

:

(1)在大部分狀況下修改形參的值不改變對應的實參值

 1 # __author__ = "wyb"
 2 # date: 2018/3/21
 3 # 形參與實參
 4 
 5 
 6 def f(a):               # a爲形參
 7     print("a is", a)  8     a += 1
 9     print("a is", a) 10 
11 
12 n = 3
13 f(n)                    # n爲實參
14 print("n is", n) 15 # 從結果能夠看出在此程序中函數內部修改了形參的值,可是
16 # 對應的實參並無發生改變
形參與實參

 

(2)可是在有些狀況下能夠經過特殊的方式在函數內部修改實參的值,若是傳遞給函數的是python可變序列,好比說列表、字符串,而且在函數內部使用下標或其餘方法使可變序列增長、刪除元素或修改元素值時,修改後的結果是能夠反映到函數以外讓實參發生修改

 1 # __author__ = "wyb"
 2 # date: 2018/3/21
 3 # 形參修改實參值(利用python可變序列)
 4 
 5 
 6 def modify(v, item):  7     v[0] = v[0] + 1     # 修改列表元素值
 8     v.append(item)      # 爲列表元素增長值
 9 
10 
11 def modify2(d): 12     d['age'] = 18
13 
14 
15 # 修改列表:
16 a = [1, 3, 6, 9] 17 print(a) 18 modify(a, 666) 19 print(a) 20 
21 # 修改字典:
22 d = {'name': 'wyb', 'age': 21} 23 print(d) 24 modify2(d) 25 print(d)
形參修改實參值(利用python可變序列)

 

2.多個參數的傳遞

能夠傳遞多個參數,多個參數之間用逗號隔開  

在傳參的角度上,調用函數時傳參數有兩種方式:  

(1)按照位置傳參數   -> 實參和形參位置一一對應

(2)按照關鍵字傳參數  -> 位置無需固定 

用法:1.位置參數必須在關鍵參數的前面

   2.對於一個參數只能賦值一次

示例:

 1 # __author__ = "wyb"
 2 # date: 2018/3/21
 3 # 傳遞多個參數,實現比大小的功能
 4 
 5 
 6 def cal_max(a, b):   # 位置參數:按順序定義參數
 7     if a > b:  8         return a  9     else: 10         return b 11 
12 
13 # 1.按照位置傳參:
14 print(cal_max(20, 30)) 15 print(cal_max(10, 20)) 16 # 2.按照關鍵字傳參:
17 print(cal_max(b=50, a=30)) 18 # 3.位置和關鍵字傳參混搭:
19 print(cal_max(10, b=30))
多個參數的傳遞

 

3.默認參數

python支持默認參數,即在定義函數時爲形參設置默認值。在調用帶有默認值參數的函數時,能夠不用爲設置了默認值的參數進行傳值,此時函數將直接使用函數定義時設置的默認值進行傳值。默認參數與下面的可變長參數都可以實現相似於函數重載的目的。

1 # 默認參數的使用:
2 def 函數名(...,形參名=默認值): 3     函數體

 

調用帶有默認參數的函數時,能夠不對默認參數進行賦值,也能夠經過顯式賦值來替換其默認值,具備極大的靈活性

1 # 默認參數實例:
2 
3 
4 def cal_sum(x, y=10): 5     return x + y 6 
7 
8 print("return of the sum(2, 3) is", cal_sum(2, 3)) 9 print("return of the sum(3) is", cal_sum(3))
默認參數實例

 

注: 參數裏既有默認參數也有普通參數時應該把普通參數放在默認參數左邊,也就是說默認參數必須出如今函數形參列表的最右端且任何一個

默認參數右邊都不能出現非默認參數(普通參數)

以下圖所示:

 

4.關鍵參數

關鍵參數主要是指調用函數時的參數傳遞方式,而與函數定義無關。經過關鍵參數能夠按參數名字傳遞值,實參順序能夠和形參順序不一致,但不影響參數值的傳遞過程,避免了用戶須要牢記參數位置和順序的麻煩,使得函數調用和參數傳遞更方便。

注: 關鍵參數即爲上面多個參數的傳遞中的按照關鍵字傳遞

 1 # __author__ = "wyb"
 2 # date: 2018/3/21
 3 # 關鍵參數示例
 4 
 5 
 6 def demo(a, b, c=5):  7     print(a, b, c)  8 
 9 
10 demo(3, 4, 2)           # 輸出: 3 4 2
11 demo(c=1, b=2, a=6)     # 輸出: 6 2 1 
關鍵參數示例

 

5.可變長參數(*args和**kwargs)

可變長參數,也有人稱之爲動態參數,分別由*args和**kwargs接收參數,前者接收任意多個實參並將其放在一個元組中,後者接受相似於關鍵參數同樣顯式賦值形式的多個實參並將其放入字典中

 1 # 元組可變長參數: 用*來標記
 2 def show_message(message, *args):  3     for name in args:  4         print(message, name)  5 
 6 
 7 # 字典可變長參數: 用**標記
 8 def check_book(**kwargs):  9     price = kwargs.get('Price', 0) 10     if price > 100: 11         print("**********The book is expensive!**********") 12     print("The book information are as follow: ") 13     for key in kwargs.keys(): 14         print(key, ": ", kwargs[key]) 15     print() 16 
17 
18 show_message("Good morning!", 'Jack', 'Tom', 'Alex') 19 check_book(author='James', Title='Economics', Price=87) 20 check_book(author='Jack', Title='Frans', Price=120, Date='2012-3-2') 21 check_book(Date='2003-8-9', author='Linda', Title='Chinese', Price=107) 22 check_book(author='Jin Lady', Title='English', Price=65) 23 check_book(author='Woz', Title='Python', Price=70) 24 check_book(author='clear', Title='Ruby', Date='2009-8-1')
可變長參數示例

上述代碼中第一個函數中的參數爲*args的用法,即不管調用該函數時傳遞了多少實參,都將其放入元組中,而後在函數中可使用for循環遍歷出其中的元素;

第二個函數值的參數則爲**kwargs的用法,即在調用該函數時自動將接受的參數轉換成字典,而後在函數中能夠直接使用get獲取字典中相應鍵對應的值。

 

 

 

5、局部變量與全局變量

1.定義

局部變量就是函數中定義的變量,其只在函數中生效,局部變量的做用域是在函數中,在函數以外沒法調用局部變量;

全局變量是在程序一開頭就定義的變量,全局變量的做用域是在整個程序中。當全局變量和局部變量同名時遵循內層屏蔽外層的原則,局部變量在函數中會屏蔽全局變量

 1 # 局部變量與全局變量  2 # 全局變量:  3 name = "wyb"  4  5  6 def func():  7 # 局部變量:  8 name = "sss"  9 print("in the func") 10 print("change name: ", name) 11 12 13 print("name is: ", name) 14 func() 15 print("name is: ", name) 16 17 # 輸出結果: 18 # name is: wyb 19 # in the func 20 # change name: sss 21 # name is: wyb

 注: 局部變量爲列表、字典、集合時局部變量就能夠在函數裏改全局變量!若是是字符串、數字類型就不能!

 

 

2.局部變量與全局變量

通常來講函數中的局部變量是沒法修改全局變量:這裏的修改指的是賦值,可是對於可變數據類型,能夠對全局變量中的某個元素進行賦值;

若是函數中無global關鍵字,優先讀取局部變量,只能讀取全局變量,沒法對全局變量進行賦值(相似name="newname"),可是對於可變數據類型(列表、字典)能夠對其中的元素進行賦值操做,詳細代碼看下面的實例:

 1 name = "wyb"
 2 
 3 
 4 def func1():  5     name = "666"
 6     print(name)     # 輸出666
 7 
 8 
 9 def func2(): 10     print(name)     # 輸出wyb
11 
12 
13 def func3(): 14     name = "666"    # 建立一個局部變量未改變全局變量
15     print(name)     # 輸出666
16 
17 
18 func1() 19 func2() 20 func3() 21 print(name)         # 輸出wyb
 1 name = ["wyb", "sss", "kkk"]  2 
 3 
 4 def func1():  5     name = "666"    # 建立局部變量未改變全局變量
 6     print(name)     # 輸出666
 7 
 8 
 9 def func2(): 10     name.append("root")     # 向全局變量中添加元素(可變數據類型(列表、字典)才能夠!)
11     print(name)     # 輸出['wyb', 'sss', 'kkk', 'root']
12 
13 
14 func1() 15 print(name)         # 輸出['wyb', 'sss', 'kkk']
16 func2() 17 print(name)         # 輸出['wyb', 'sss', 'kkk', 'root']

 

函數中可使用global關鍵字來聲明局部變量爲全局變量,而後對其能夠直接進行賦值操做,此時改變局部的值就至關於改變了全局的值,詳細代碼看下面一段實例:

 1 #在函數中修改全局變量  2 #全局變量:  3 name = "wyb"  4  5  6 def func():  7 # 局部變量:  8 global name # 定義global變量修改全局變量  9 name = "sss" 10 print("in the func") 11 print("change name: ", name) 12 13 14 print("name is: ", name) 15 func() 16 print("name is: ", name) 17 18 # 輸出結果: 19 # name is: wyb 20 # in the func 21 # change name: sss 22 # name is: sss

注: 請注意在程序中千萬不要用global改全局變量,這樣作會影響程序的可讀性和調試難度!

 

 

 

6、做用域

python做用域 -> 函數(與JavaScript相似)

C、Java的做用域 -> {}

 

1.命名空間 -> 存放變量名字與其對應的值的關係

  • 全局命名空間(globals):建立的存儲全局變量的「變量名與值的關係」的空間叫作全局命名空間
  • 局部命名空間(locals):在函數的運行中開闢的臨時的空間叫作局部命名空間,是函數內的名稱空間,包括函數參數和局部變量
  • 內置命名空間(builtins):內置命名空間中存放了python解釋器爲咱們提供的名字:input,print,str,list,tuple...它們都是咱們熟悉的,拿過來就能夠用的方法

  注:

  1. 加載順序:內置(程序運行前加載)-->全局(從上到下順序加載進來的)-->局部(調用的時候加載)--->內置
  2. 取值:在局部調用:局部命名空間--->全局命名空間--->內置命名空間;    站在全局範圍找:全局---->內置---->局部
  3. 使用注意:全局中不能使用局部的;局部中可使用全局的
 1 n = 10
 2 
 3 
 4 def func():  5     n = 20
 6     print("in the func: ", n)  7 
 8     def func2():  9         n = 30
10         print("in the func2: ", n) 11 
12         def func3(): 13             print("in the func3: ", n) 14 
15  func3() 16 
17  func2() 18 
19 
20 func() 21 # 輸出結果:
22 # in the func: 20
23 # in the func2: 30
24 # in the func3: 30
命名空間

 

 

2.做用域:就是做用範圍,命名空間和做用域是分不開的
 python中的做用域:

  • 全局做用域:全局命名空間與內置命名空間的名字都屬於全局範圍在整個文件的任意位置都能被引用,全局有效
  • 局部做用域:局部命名空間,只能在局部範圍內生效 
  • 當定義完成後,做用域就已經生成,做用域鏈向上查找

python的變量做用域簡單說就是全局變量在局部(好比函數裏)依然有效,可是函數裏的局部變量只在該函數裏有效,在其餘地方就無效

 

 

3.查看做用域

 globals函數:查看全局做用域的名字 -> print(globals())

 locals函數:查看局部做用域的名字 -> print(locals())

相關文章
相關標籤/搜索