python基礎13函數以及函數式編程
主要內容
- 函數基本語法及特性
- 參數與局部變
- 返回值 4.遞歸
- 名函數 6.函數式編程介紹
- 階函數 8.內置函數
函數基本語法及特性
定義
數學函數定義:一般的,在一個變化過程中,如果有兩個變量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語 把結果返回。
-
函數在執 過程中只要遇到return語 ,就會停 執 並返回結果,所以也可以 解為 return 語 代表著函數的結束,如果未在函數中指定return,那這個函數的返回值為None。
-
接受返回值
賦予變量,例如:
def test():
print(‘in the test‘)
return 0
x=test()
- 返回什麽樣的變量值
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 test2
x=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 test4
None
0
(1, ‘hello‘, [‘alex‘, ‘wupeiqi‘], {‘name‘: ‘alex‘})
<function test2 at 0x102439488>
- 返回值數=0:返回None 沒有return
- 返回值數=1:返回object return一個值,python 基本所有的數據類型都是對象。
- 返回值數>1:返回tuple, return多個值。
- 返回可以返回函數:return test2會將test2的內存地址返回。
- 為什麽要有返回值?
想要整個函數執行的結果。 可能對執行結果進行相關操作。 比如登陸,返回true 接下來就可以進行其他操作。 如果是false 則不給操作。
函數參數
形參和實參定義
- 形參
形式參數,不是實際存在,是虛擬變量。在定義函數和函數體的時候使用形參,目的是在函數調用時接收實參(形參個數,類型應與實參一一對應)。
變量只有在被調時才分配內存單元
- 實參
實際參數,調用函數時傳給函數的參數,可以是常量、變量、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以 把這些值傳送給形參。因此應預先用賦值,輸入 等辦法使參數獲得確定值。
- 區別
形參是虛擬的,不占用內存空間.形參變量只有在被調用時才分配內存單元,,在調用結束時,即刻釋放所分配的內存單元。因此,形參只在函數內部有效。函數調用結束返回主調函數後,則不能再使該形參變量。
實參是一個變量,占用內存空間,數據傳送單向,實參傳給形參,不能形參傳給實參。
def calc(x,y): #x,y為形參
res = x**y
return res
c = 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-1
s=s*x
print(s)
return s
test6(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, in <module>
abs(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, in <module>
abs(‘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),也就是如何編寫程序的方法論。
主要思想是把運算過程盡量寫成一系列嵌套的函數調用。
參考頁面
http://www.cnblogs.com/alex3714/articles/5740985.html
http://www.imooc.com/code/3516
http://blog.csdn.net/suncherrydream/article/details/51682560
http://www.jb51.net/article/68314.htm
python基礎13函數以及函數式編程