標籤:
本文和大家分享的主要是python 函數及函數式編程相關內容,一起來看看吧,希望對大家 學習python有所協助。 函數基本文法及特性 定義數學函數定義: 一般的,在一個變化過程中,如果有兩個變數 x 和 y ,並且對於 x 的每一 個確定的值, y都有唯一確定的值與其對應,那麼我們就把 x 稱為自變數,把 y 稱為因變 量, y 是 x 的函數。自變數 x 的取值範圍叫做這個函數的定義域。但編程中的「函數」概念,與數學中的函數是有很 同的 函數是邏輯結構化和過程化的一種編程方法 函數的優點· 減少重複代碼· 使程式變的可擴充· 使程式變得易維護 函數與過程· 定義函數 def fun1(): # 函數名稱 "The function decription" print("in the func1") return 0 # 傳回值· 定義過程 def fun2():"The progress decription"print("in the func2")· 函數與過程 過程就是沒有傳回值的函數 但是在 python 中,過程會隱式預設返回 none ,所以在 python中即便是過程也可以算作函數。 def fun1():"The function decription"print("in the func1") return 0 def fun2():"The progress decription"print("in the func2")x=fun1()y=fun2()print("from func1 return is %s" %x)print("from func2 return is %s" %y)結果為: in the func1 in the func2 from func1 return is 0 from func2 return is None 傳回值要想擷取函數的執 結果,就可以 return 語 把結果返回。1.函數在執 過程中只要遇到return 語 ,就會停 執 並返回結果,所以也可以 解為 return 語 代表著函數的結束,如果未在函數中指定 return, 那這個函數的傳回值為 None 。2.3.接受傳回值4.賦予變數,例如:5. def test():print(’in the test’) return 0x=test()1. 返回什麼樣的變數值return 個數沒有固定, return 的類型沒有固定。 例如: def test1():print(’in the test1’) def test2():print(’in the test2’) return 0 def test3():print(’in the test3’) return 1,’hello’,[’alex’,’wupeiqi’],{’name’:’alex’} def test4():print(’in the test4’) return test2x=test1()y=test2()z=test3()u=test4()print(x)print(y)print(z)print(u)結果是: in the test1 in the test2 in the test3 in the test4None0(1, ’hello’, [’alex’, ’wupeiqi’], {’name’: ’alex’})< function test2 at 0x102439488>· 傳回值數 =0: 返回 None 沒有 return· 傳回值數 =1: 返回 object return 一個值, python 基本所有的資料類型都是對象。· 傳回值數 >1: 返回 tuple , return 多個值。· 返回可以返回函數 :return test2 會將 test2 的記憶體位址返回。1. 為什麼要有傳回值 ?想要整個函數執行的結果。 可能對執行結果進行相關操作。 比如登陸,返回true 接下來就可以進行其他動作。 如果是 false 則不給操作。 函數參數 形參和實參定義· 形參形式參數,不是實際存在,是虛擬變數。在定義函數和函數體的時候使用形參,目的是在函數調用時接收實參( 形參個數,類型應與實參一一對應 ) 。變數只有在被調時才分配記憶體單元· 實參實際參數,調用函數時傳給函數的參數,可以是常量、變數、運算式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以 把這些值傳送給形參。因此應預先用賦值,輸入 等辦法使參數獲得確定值。· 區別形參是虛擬,不佔用記憶體空間. 形參變數只有在被調用時才分配記憶體單元,,在調用結束時,即刻釋放所分配的記憶體單元。因此,形參只在函數內部有效。函數調用結束返回主調函數後,則不能再使該形參變數。實參是一個變數,佔用記憶體空間,資料傳送單向,實參傳給形參,不能形參傳給實參。 def calc(x,y): #x,y 為形參res = x**y return resc = calc(a,b) #a,b 為實參print(c) def test(x,y): #x,y 為形參print(x)print(y)x=1 #x 為實參y=2 #y 為實參test(x=x,y=y) # 等號左邊 x,y 為形參,等號右邊 x,y 為實參,引用不分順序,按關鍵字引用。 預設參數定義函數的時候,還可以有預設參數。 函數的預設參數的作用是簡化調用,你只需要把必須的參數傳進去。但是在需要的時候,又可以傳入額外的參數來覆蓋預設參數值。# 定義一個計算 x 的 N 次方的函數 , 預設是 2 次方 def test6(x,n=2):s=1 while n>0:n=n-1s=s*xprint(s) return stest6(2)預設參數只能定義在必需參數的後面. 可變參數如果想讓一個函數能接受任意個參數,我們就可以定義一個可變參數: def fn(*args): print args可變參數的名字前面有個 * 號,我們可以傳入 0 個、 1 個或多個參數給可變參數: Python 解譯器會把傳入的一組參數組裝成一個 tuple 傳遞給可變參數,因此,在函數內部,直接把變數 args 看成一個 tuple 就好了。定義可變參數的目的也是為了簡化調用。假設我們要計算任意個數的平均值,就可以定義一個可變參數: def average(*args):...這樣,在調用的時候,可以這樣寫:>>> average()0>>> average(1, 2)1.5>>> average(1, 2, 2, 3, 4)2.4 位置參數和關鍵字位置參數調用:實參與形參位置一一對應; 關鍵參數調用 : 位置無需固定。正常情況下,給函數傳參數要按順序,如果不按順序就可以用關鍵參數調用,只需指定參數名即可,但關鍵參數必須放在位置參數之後。 def test5(u,v,w):print(u)print(v)print(w)test5(3,w=2,v=6) 函數調用Python 內建了很多有用的函數,我們可以直接調用。要調用一個函數,需要知道函數的名稱和參數,比如求絕對值的函數 abs ,它接收一個參數。調用 abs 函數:>>> abs(-21)21調用函數的時候,如果傳入的參數數量不對,會報TypeError 的錯誤,並且 Python 會明確地告訴你:abs() 有且僅有 1 個參數,但給出了兩個:>>> abs(21,8)Traceback (most recent call last):File "/Users/cathy/PycharmProjects/p51cto/day3/func_test3.py", line 67, inabs(21,8)TypeError: abs() takes exactly one argument (2 given)如果傳入的參數數量是對的,但參數類型不能被函數所接受,也會報TypeError 的錯誤,並且給出錯誤資訊: str 是錯誤的參數類型:>>> abs(’a’)Traceback (most recent call last):File "/Users/cathy/PycharmProjects/p51cto/day3/func_test3.py", line 69, inabs(’a’)TypeError: bad operand type for abs(): ’str’ 遞迴函式在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞迴函式。舉個例子,我們來計算階乘 n! = 1 * 2 * 3 * ... * n ,用函數 fact(n) 表示: def fact(n): if n==1: return 1 return n * fact(n - 1)遞迴函式的優點是定義簡單,邏輯清晰。理論上,所有的遞迴函式都可以寫成迴圈的方式,但迴圈的邏輯不如遞迴清晰。 嵌套函數python 允許在定義函數的時候,其函數體內又包含另外一個函數的完整定義。name = "test1" def changeout():name = "test2" def changeinner():name = "test3"print("changeinner 賦值列印 ", name)changeinner() # 調用內層函數print(" 外層調用內層列印 ", name)changeout()print(" 調用外層列印 ", name)內建函式可以訪問其外部函數的範圍,但是外部函數不能訪問內建函式的範圍。def change1(name): 匿名函數匿名函數就是不需要顯式的指定函數# 這段代碼 def calc(n): return n**n print(calc(10))# 換成匿名函數 calc = lambda n:n**n print(calc(10)) 函數式編程單說," 函數式編程 " 是一種 " 編程範式 " ( programming paradigm ),也就是如何編寫程式的方法論。主要思想是把運算過程盡量寫成一系列嵌套的函數調用。來源: 部落格園
Python函數以及函數式編程