函數
在數學中函數就是完成了數字的某項變換,輸入參數,它就可以輸出一個結果。
在編程中,函數同樣也有類似的作用。它的作用也是爲了完成某個功能,當有大量重複代碼時,就可以使用函數來解決,
當需要精簡代碼邏輯時也可以使用函數。
定義函數
# 函數的一般格式
# 可變參數一定要在位置參數的後面
# 如果可變參數有列表類型的可變參數*args, 還有字典類型的可變參數**args1 那麼*args要在**args1前面
# 如果參數有默認值,那麼該參數應該放在一般參數後面,不定參數前面
# 因爲python是解釋型語言,因此在使用指定函數時,該函數應該已被定義
def fun_name(args0, args1=default_value, *args2, **args3):
# 函數體
# 函數返回值
return ...
# 階乘計算
def jie_cheng(a):
total = 1
for i in range(a):
total *= (i+1)
return total
函數的參數
python的函數的參數,支持默認參數,支持可變參數
# 階乘計算, 默認爲0的階乘
def jie_cheng(a=0):
total = 1
for i in range(a):
total *= (i+1)
return total
# 使用可變參數
def info(*args1, **args2):
for arg1 in args1:
print(arg1)
for arg2 in args2:
print(arg2)
info('hello', 'yes', {'name':'china'})
函數的管理
當我們有多個函數,或者這引起函數是相關的,共同完成某項功能,那麼這時就可以使用模塊來管理這些函數(模塊可以簡單理解爲是一個文件夾)
module1:
def func1(a):
print(a)
def func2(a):
print(a**2)
module2:
def func3(a):
print(a)
def func4(a):
print(a**2)
要使用這些模塊內的函數,直接用import module_name 就可以了
from moudule1 import * #這種方式容易引起重名
import moudule1 as md #推薦使用這種方式
遞歸函數
函數自己調用自己
注意事項:一定要設置一個遞歸終止條件,防止形成死遞歸
# 階乘計算
def jie_cheng(a=0):
if a == 0:
return 1
return a*jie_cheng(a-1)
變量的作用域
函數外定義的變量,可以在函數內使用
在函數內定義的變量,其作用域爲從定義開始到函數結束
函數變量
當我們定義一個函數後,我們就查使用函數名來調用這個函數
函數名存儲的就是該函數的引用地址,本身也是一個變量
既然函數是一種變量,那麼我們也可以把它作爲一個參數傳遞給另外一個函數
嵌套函數
匿名函數
匿名函數定義規則: lambda 形參:返回值
裝飾器
應用場景:當需要增加某函數的功能,但又不能直接修改源代碼,就可以使用裝飾器了
import time
# 一級裝飾
def use_time(f):
def wrapper(a, b):
start = time.time()
re = f(a, b)
end = time.time()
print('總共用時:%d' % (end - start))
return re
return wrapper
# 多層裝飾,裝飾時可以帶參數
def type_info(info):
def wrapper1(f):
def wrapper2(a, b):
start = time.time()
re = f(a, b)
end = time.time()
print('%s 總共用時:%d' % (info, end - start))
return re
return wrapper2
return wrapper1
@type_info(info='mc') # 這個實際上是 func2 = type_info(info, func2)
@use_time #這個實際上是 func2 = use_time(func2)
def func2(a, b):
def add(a, b):
return a + b
return add(a, b)
func2(2,3)