標籤:roc 個數 font 輸出 doc 維護 程式 傳回值 知識點
今天更新一下有關於函數的知識點~
函數是什麼?
函數一詞來源於數學,但編程中的「函數」概念,與數學中的函數是有很大不同的,具體區別,編程中的函數在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子過程或子程式),在Pascal中叫做procedure(過程)和function,在C中只有function,在Java裡面叫做method。
函數分為物件導向,面向過程和函數式編程。
定義: 函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可
特性:
- 減少重複代碼
- 使程式變的可擴充
- 使程式變得易維護
文法定義
def name() : #name 是函數名稱 print("hello world") return 0 #傳回值可有可無,可以是任何值或者函數或者運算式,可以是任何東西,不寫的話返回NONEname()
當然,函數是可以傳參數的,比如下面:
def asd(x,y): #xy都是形參 print(x,y)asd(1,2) #1,2是實參asd(x=1,y=2)asd(1,y=2)以上三種傳參方法都是正確的,但需要注意的是第三種方法,位置參數是必須要優先的,如果寫成asd(2,x=1)程式是不會把2傳給y的。
還有一種方法是傳預設參數,多用於設定預設值或者串連資料庫連接埠號碼,這種相當於設定了初始值,如果想修改也能修改。
def test(x,y=8080): print(x,y)test (443)結果是輸出 443,8080如果是test(443,80)那麼輸出就是 443,80
函數不光可以傳單個參數,也可以傳參數組,可以用元祖或者字典去傳值,方法如下:
def test(*args): #*args將接收的N個數值轉換成元祖,放在元祖中傳值 print(args)test(1,2,3,4,5)
def test(**kwargs): #這是將字典傳入函數
print(kwargs[‘name‘])
test(name=‘xiaoming‘,age=22)
結果是xiaoming
不光可以傳入單一類型的值,還能組合傳入:
def test(name,age=18,*args,**kwargs): print(name,age,args,kwargs)test(‘xiaoming‘,24,1,2,3,4,sex=‘man‘)
局部變數和全域變數
在子程式中定義的變數稱為局部變數,在程式的一開始定義的變數稱為全域變數。全域變數範圍是整個程式,局部變數範圍是定義該變數的子程式。當全域變數與局部變數同名時:在定義局部變數的子程式內,局部變數起作用;在其它地方全域變數起作用。簡而言之,全域變數就是在程式頂部寫的,局部變數
嵌套函數和遞迴 嵌套函數
name = "xiaoming" def change_name(): name = "xiaowang" def change_name2(): name = "xiaofang" print("第3層列印",name) change_name2() #調用內層函數 print("第2層列印",name) change_name()print("最外層列印",name)
遞迴
在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞迴函式。
ef calc(n): print(n) if int(n/2) ==0: return n return calc(int(n/2)) calc(10) 輸出:10521
遞迴特性:
1. 必須有一個明確的結束條件
2. 每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少
3. 遞迴效率不高,遞迴層次過多會導致棧溢出(在電腦中,函數調用是通過棧(stack)這種資料結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴調用的次數過多,會導致棧溢出)
匿名函數:
匿名函數就是不需要顯式的指定函數,匿名函數主要是和其它函數搭配使用。如下面所示
def calc(n): return n**nprint(calc(10)) #換成匿名函數calc = lambda n:n**nprint(calc(10))
內建函數:
python中有很多已經寫好的函數,可以直接調用。
具體操作方法請見:https://docs.python.org/3/library/functions.html?highlight=built#ascii
python學習之路(七)