標籤:數組 lock 虛擬 另一個 log after 集合 編寫程式 自己的
編程方法大概分三種
1.物件導向
2.面向過程
3.函數式編程
這三種編程方法都有自己的特點
物件導向 類 class
面向過程 過程 def
函數式編程 函數 得分
函數的定義 :
數學函數的定義:一般的,在一個變化過程中,如果有兩個變數x和y,並且對於x的麼一個確定的值,y都有唯一確定的值相對應,那麼我們就把x稱為自變數,y是x的函數。自變數x的取值範圍叫做這個函數的定義域
程式設計語言中定義:函數式邏輯結構化和過程化的一種編程方法
#python中函數的定義方法def test(x): ‘‘‘The function definitions‘‘‘ x+=1 return x#def: 定義函數的關鍵字#test: 函數名#‘‘‘ ‘‘‘:檔案描述#x+=1:代碼或程式的處理邏輯#return: 定義傳回值
函數式編程:先定義一個數字函數然後按照這個數學模型用程式設計語言來實現它
過程是沒有傳回值的函數
在py中過程被隱式的返回None,也成也被當成了函數
#函數def func1(): ‘‘‘testing‘‘‘ print(‘in the funcl‘) return 0#過程 沒有傳回值的函數def func2(): ‘‘‘testing‘‘‘ print(‘in the func2‘)x=func1()y = func2()print(‘from func1 return is %s‘ %x )#from func1 return is 0print(‘from func1 return is %s‘ %y )#from func1 return is None
面向過程:用def定義的邏輯過程中,拼接起來 使用時調用函數名
3為什麼要使用函數
沒有函數的編程只是在寫邏輯(功能),如果想重用你的邏輯不應函數只能是拷貝
# Author:Zhiyu Suimport timedef logger(): time_format = ‘%Y-%m-%d %X‘ time_current = time.strftime(time_format) with open (‘a.txt‘,‘a+‘) as f: f.write(‘%s end action\n‘ %time_current)def test1(): print( ‘tesst1 staring action...‘) logger()def test2(): print (‘test2 staring action...‘) logger()def test3(): print (‘test3 staring action...‘) logger()test1()test2()test3()
使用函數的三大優點
1.代碼重用
2.保持
3.簡潔
函數傳回值
# Author:Zhiyu Sudef test1(): print(‘in the test1‘)def test2(): print(‘in the test2‘) return 0 print(‘in the test2‘)#return傳回值後面不執行def test3(): print(‘in the test3‘) return 1,‘hello‘,[‘alex‘,‘wuqeqi‘],{‘name‘:‘alex‘}x = test1()y = test2()z = test3()print(x) #Noneprint(y) #0print(z) #(1,‘hello‘,[‘alex‘,‘wuqeqi‘],{‘name‘:‘alex‘})
總結:
傳回值=0;返回None
傳回值=1;返回object
傳回值>1;返回tuple
函數的調用
調用方法:
1.test()執行,()表示調用函數test,()內可以有參數也可以沒有
參數:
1.形參和實參
形參:形式參數,不是實際存在,是虛擬變數。在定義函數和函數體的時候使用形參,目的是在函數調用時接受實參(實參個數,類型應與實參一一對應)
實參:實際參數,調用函數傳遞給函數的參數,可以是常量,運算式,函數,傳給形參
區別:形參是虛擬,不佔記憶體空間,形參變數只有在被調用是時才分到記憶體單元,實參是一個變數佔用記憶體空間,資料傳送單向,實參傳給形參不能傳給實參
2.位置參數和關鍵字(標準調用:實參與形參一一對應,關鍵字調用:位置無需固定)
3.預設參數:非必傳參數
def test(x,y=2): #預設參數特點:調用函數的時候,預設參數非必須轉遞 print(x) print(y)test(1,3)
4.參數組
*args#列表形式
*arge 接受n個關鍵字參數def test(*args): print(args)test(1,2,3,4,5)test (*[1,2,3,4,6])def test1(x,*args): print(x) print(args)test1(1,2,3,45,6)
**kwargs#把N個關鍵資參數,轉換為字典
**kwargs 把n個關鍵字參數,轉換成字典方式def test2(**kwargs): print(kwargs) print(kwargs[‘name‘])test2(name=‘alex‘,age = 8,sex=‘f‘)test2(**{‘name‘:‘alex‘,‘age‘ : 8})
def test3(name,age=18,*args,**kwargs): print(name) print(age) print(args) print(kwargs) logger(‘est3‘)def logger(source): print(‘from %s‘%source)test3(‘alex‘,151,8,hobby = ‘tesla‘)
注意:關鍵參數必須放在位置參數之後
局部變數和全域變數
def change_name(name): print(‘before change‘,name) name = ‘Alex li‘ #這個函數就是這個變數的範圍 age = 23 print(‘after changge ‘,name)name = ‘alex‘change_name(name)print(name)
輸出
before change alexafter changge Alex lialex #name改了為什麼還是alex
全域與局部變數
在子程式中定義的變數稱為局部變數,在程式的一開始定義的變數稱為全域變數。全域變數範圍是整個程式,局部變數範圍是定義該變數的子程式。當全域變數與局部變數同名時:在定義局部變數的子程式內,局部變數起作用;在其它地方全域變數起作用。 想要局部變數定義變數可以通過global來聲明
school = ‘oldboy edu.‘def change_name(name): global school school = ‘mage.edu‘ print(‘before change‘,name,school) name = ‘Alex li‘ #這個函數就是這個變數的範圍 age = 23 print(‘after changge ‘,name)name = ‘alex‘change_name(name)print(name)print(school)
注意:盡量不要在局部裡申明全域變數 程式複雜後會很難調試
列表 字典 集合 類 資料都可以在局部變數裡修改(除了字串和整數)
names = [‘alex‘,‘jack‘,‘rain‘]def change_name(): names[0]=‘金角大王‘ print(‘inside func‘,names)change_name() #inside func [‘金角大王‘, ‘jack‘, ‘rain‘]
print(names) #[‘金角大王‘, ‘jack‘, ‘rain‘]
遞迴
在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞迴函式
def calc(n): print(n) if int(n/2) ==0: return n return calc(int(n/2)) calc(10) 輸出:10521
遞迴特性:
1. 必須有一個明確的結束條件
2. 每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少
3. 遞迴效率不高,遞迴層次過多會導致棧溢出(在電腦中,函數調用是通過棧(stack)這種資料結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴調用的次數過多,會導致棧溢出)
函數式編程
函數是Python內建支援的一種封裝,我們通過把大段代碼拆成函數,通過一層一層的函數調用,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函數就是面向過程的程式設計的基本單元。
函數式編程中的函數這個術語不是指電腦中的函數(實際上是Subroutine),而是指數學中的函數,即自變數的映射。也就是說一個函數的值僅決定於函數參數的值,不依賴其他狀態。比如sqrt(x)Function Computex的平方根,只要x不變,不論什麼時候調用,調用幾次,值都是不變的。
Python對函數式編程提供部分支援。由於Python允許使用變數,因此,Python不是純函數式程式設計語言。
一、定義
簡單說,"函數式編程"是一種"編程範式"(programming paradigm),也就是如何編寫程式的方法論。
主要思想是把運算過程盡量寫成一系列嵌套的函數調用。舉例來說,現在有這樣一個數學運算式:
(1 + 2) * 3 - 4
傳統的過程式編程,可能這樣寫:
var a = 1 + 2;
var b = a * 3;
var c = b - 4;
函數式編程要求使用函數,我們可以把運算流程定義為不同的函數,然後寫成下面這樣:
var result = subtract(multiply(add(1,2), 3), 4);
這段代碼再演化以下,可以變成這樣
add(1,2).multiply(3).subtract(4)
這基本就是自然語言的表達了。再看下面的代碼,大家應該一眼就能明白它的意思吧:
(1 + 2) * 3 - 4
傳統的過程式編程,可能這樣寫:
var a = 1 + 2;
var b = a * 3;
var c = b - 4;
函數式編程要求使用函數,我們可以把運算流程定義為不同的函數,然後寫成下面這樣:
var result = subtract(multiply(add(1,2), 3), 4);
這段代碼再演化以下,可以變成這樣
add(1,2).multiply(3).subtract(4)
這基本就是自然語言的表達了。再看下面的代碼,大家應該一眼就能明白它的意思吧:
merge([1,2],[3,4]).sort().search("2")
高階函數
變數可以指向函數,函數的參數能接收變數,那麼一個函數就可以接收另一個函數作為參數,這種函數就稱之為高階函數。
def add(a,b,f): return f(a)+f(b)res=(add(3,-6,abs))print(res)
學習Python基礎---3.1