函數 定義 # 定義函數 def fn(): print("這是函數內部") # 調用 fn() fn() # 區分 fn: 這是真正意義上的函數本身 fn(): 這是調用函數 參數 形參 實參 函數參數可有可無,要看具體使用 形參是定義函數的參數 實參就是調用函數時需要傳遞的參數,函數有多少個形參 ...
函數
定義
# 定義函數
def fn():
print("這是函數內部")
# 調用
fn()
fn()
# 區分
fn: 這是真正意義上的函數本身
fn(): 這是調用函數
參數
形參 實參
函數參數可有可無,要看具體使用
形參是定義函數的參數
實參就是調用函數時需要傳遞的參數,函數有多少個形參就要傳遞多少個實參
形參的 預設值參數
形參裡面可以設置預設值參數
def fn(a,b=1)
print(a+b)
fn(1) # 正確 結果: 2
fn(1,2) # 正確 結果: 3
參數的傳遞方式
1.位置參數
# 根據位置傳遞參數,缺點需要記住每一個參數的位置
2.關鍵字參數
def fn(a,b,c):
pass
fn(b=1,a=2,c=3)
可變參數
*args: 可接受任意的位置參數,並保存在一個元組中
def fn(*args):
pass
fn(1,2,3,4,5,6,7)
**kwargs: 可接受任意的關鍵字參數,並保存在一個字典中
def fn1(**kwargs):
pass
fn(a=1,n=2,c=3,bb=1)
# 可接受任意參數
def fn(*args,**kwargs):
pass
返回值
函數執行完之後一般都有結果,用return關鍵字來返回值
def fn():
return 1
print(fn()) # 1
# fn = 返回值
如果函數中不屑返回值預設是None
def fn1():
pass
print(fn1()) # None
高級用法
1.函數可以被引用
將一個函數賦值給另一個變數,現在改變數相當於那個函數
2.函數可以作文參數傳入另一個函數
def fn():
print('我是fn')
def fn2(x):
x() # x() == fn()
fn2(fn) # fn -> x
3.可以將函數作為返回值
def fn():
print("這是fn")
return fn1
def fn1():
print("這是fn1")
fn()() # fn() 返回fn1相當於fn1() 列印'這是fn1'
4.函數可以是容器中的元素
def fn():
print('這是fn')
list1 = [1,2,'hello',fn]
list1[3]() # 相當於調用fn,列印'這是fn'
匿名函數lambda
匿名函數: 沒有名字的函數
語法: lambda 參數列表:返回值(表達式)
lambda x : x+1 # 這就是一個匿名函數
匿名函數可以賦值給變數
fn = lambda x : x+1
等價於
def fn(x):
return x+1
高階函數
高階函數: 就是函數作為參數的函數
普通函數:
abs() # 求數字的絕對值
round() # 四捨五入,但是準換為二進位的時候精度缺失,實際是 奇數時四捨五入,偶數5舍大於5入
定義一個高級函數:
def func(a,b,fn):
return fn(a)+fn(b)
print(func(3,-5,abs)) # 8
print(func(3.4,4.5,round)) # 7
高階函數:
1.map()
規則: 必須只有一個形參
語法: map(fn,list)
# 將fn作用到序列中每一個元素中,結果返回一個迭代器
list1 = [1,2,3,4]
print(list(map(lambda x:x*x,list1))) # [1, 4, 9, 16]
# 註意原列表不會改變
2.filter()
語法:filter(fn,list)
# 將fn作用到序列中每一個元素中,結果返回一個迭代器
# 用域過濾序列,過濾掉不符合的元素
list2 = [i for i in range(1,11)]
print(list(filter(lambda x:x%2==0,list2))) # [2, 4, 6, 8, 10]
3.sorted()
語法:sorted(list,key=)
# 將序列進行排序,返回一個序列
# 以成績排序降序
list3 = ["小李子=150","小紅=99","小明=79","小張=89","小川=92"]
print(sorted(list3,key=lambda x:int(x.split("=")[1])))
# ['小明=79', '小張=89', '小川=92', '小紅=99', '小李子=150']
4.reduce() # 該函數需要導入functools
語法:reduce(fn,list)
# 把序列中的元素做累計計算,結果返回一個序列
# 計算從1加到10
from functools import reduce
list4 = [i for i in range(1,11)]
print(reduce(lambda x,y:x+y,list4)) # 55
遞歸函數
如果一個函數在自己的內部調用了他自己,就叫做遞歸
先進後出,後進先出
使用遞歸必須設置出口
# 設計一個階乘
def fn(x):
if x == 1 : # 1的階乘結果等於1
return 1
return x*fn(x-1) # 如果不是1那麼就等於這個數乘這個數減一的階乘
# 例如5的階乘推導
f(5) = 5 * f(4)
= 5 * 4 * f(3)
= 5 * 4 * 3 * f(2)
= 5 * 4 * 3 * 2 * f(1)
= 5 * 4 * 3 * 2 * 1
閉包
閉包:如果在一個內部函數,對在外作用域(但不是全局作用域)的變數進行了引用,呢麽內部函數就叫做閉包
是一個內部函數
使用了外部環境(非全局)
閉包 = 內部函數 + 定義函數的環境
裝飾器
作用: 在不修改原來函數的情況下, 拓展功能
開放封閉原則:
開放: 對於拓展功能進行開放
封閉: 不可修改原函數
def new_fn(func):
def inner(*args,**kwargs):
...
res = func(*args,**kwargs)
...
return res
reutrn inner
@new_fn # a = new_fn(a)
def a():
pass
a() -> new_fn(a)() -> inner() 中間有閉包環節