在學習函數以前,咱們編程一直遵循面向過程編程,即:根據業務邏輯從上到下實現功能,其每每用一長段代碼來實現指定功能;python
而學了函數以後,咱們能夠把相同做用的代碼放到一個函數中;這樣顯然程序的重用性和可讀性要好一些編程
這也是函數式編程和麪向過程編程的區別:app
函數式:將相同做用的代碼封裝到函數中,以後調用函數即課使用函數式編程
面向過程:根據問題邏輯從上到下寫強堆代碼......函數
def func(name): # name是形式參數 print(name) # 函數體 func('clint') # 執行函數,'clint'是傳入的實參
傳遞一個默認參數post
def info(name,age,country = 'China'): #country定義了一個默認參數 print('姓名:',name) print('年齡:',age) print('國家:',country) info('clint',18) #調用時,沒穿實參countrty,就用默認的參數
正常狀況下,給函數傳參數要按順序,不想按順序就指定參數名便可,但記住一個要求就是,關鍵參數必須放在位置參數以後學習
def info ... info(age=18,name='clint') #使用關鍵參數,能夠不按順序
*args 和 **kwargsspa
def info(name,age,*args): #*args會把多傳入的參數變成一個元組形式 def info(name, *args, **kwargs): # **kwargs 會把多傳入的參數變成一個dict形式
遞歸函數:函數在內部調用自身。code
符合遞歸函數的條件:blog
1. 結束條件;
2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減小;
3. 遞歸效率不高,遞歸層次過多會致使棧溢出
PS:python默認最大遞歸數爲999,但可經過如下代碼進行設置:
import sys sys.setrecursionlimit(10000) # 將遞歸數設置爲10000
實例:
斐波那契數列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,...
版本一:
# -*- coding:utf-8 -*- __Author__ = "Clint" fibonaccis = [] def fibonacci(n): if n == 1 or n == 2: return 1 else: return fibonacci(n - 1) + fibonacci(n - 2) for i in range(1, 10): fibonaccis.append(fibonacci(i)) print(fibonaccis)
版本二:
# -*- coding:utf-8 -*- __Author__ = "Clint" def fib(max): n = 0 a = 0 b = 1 while n < max: print(b) a, b = b, a + b # ===> 賦值語句至關於 t=(b,a+b) a=t[0],b=t[1] n += 1 return 'done' fib(10)
再來一個n的階乘,求n!
#遞歸實現階乘n! = (n-1)! × n def fac(n): if n == 1: return 1 else: return n * fac(n-1) print(facl(10))
# ###################### 普通函數 ###################### # 定義函數(普通方式) def func(arg): return arg + 1 # 執行函數 result = func(123) # ###################### lambda ###################### # 定義函數(lambda表達式) my_lambda = lambda arg : arg + 1 # 執行函數 result = my_lambda(123)
map()是 Python 內置的高階函數,它接收一個函數 func和一個list,並經過把函數 func依次做用在 list 的每一個元素上,獲得一個新的 list 並返回
def func(x): return x * x a= map(func,range(1,10)) print(list(a)) # 輸出爲[1, 4, 9, 16, 25, 36, 49, 64, 81]
reduce()函數接收的參數和 map()相似,接收一個函數 func和一個list,但reduce()傳入的函數 func 必須接收兩個參數,reduce()對list的每一個元素反覆調用函數func,並返回最終結果值
from functools import reduce def func(x,y): return x + y a = reduce(func,[1,3,5,7,9,10]) print(a) # 輸出爲: 35
filter()函數也是接收一個函數 func和一個list,函數 func的做用是對每一個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list
def is_odd(x): return x % 2 == 1 a = filter(is_odd,[1,2,3,4,5,6,7,8]) print(list(a)) # 輸出爲:[1, 3, 5, 7]
在一個函數體內建立另一個函數,這種函數就叫內嵌函數
def foo(): print("in the foo") def bar(): print("in the bar") bar() foo() # 輸出爲: in the foo in the bar