這一部分沒啥新內容,階乘例子:
def fac(num):
ans = 1
for x in range(1, num+1, 1)
ans *= x
return ans
有個新地方是可以接收多個參數,大概叫可變參數(加個星號
def sum(*num):
ans = 0
for x in num:
ans += x
return ans
print(sum(1, 2, 3, 4))
在解決命名沖突時,可以將同名函數寫到不同文件中,再import導入
as可以用來給模塊別名
import module1
import module2 as m2
module1.sum()
m2.sum()
還可以直接從模塊中導入需要的函數
from module1 import sum
sum()
使用關鍵詞傳參的話可以不按順序,或者加 * 使在後面的參數必須按關鍵詞傳參
def is_triangle(a, b, c):
print(f'a = {a}, b = {b}, c = {c}')
return a + b > c and b + c > a and a + c > b
# 調用函數傳入參數不指定參數名按位置對號入座
print(is_triangle(1, 2, 3))
# 調用函數通過“參數名=參數值”的形式按順序傳入參數
print(is_triangle(a=1, b=2, c=3))
# 調用函數通過“參數名=參數值”的形式不按順序傳入參數
print(is_triangle(c=3, a=1, b=2))
def is_triangle(*, a, b, c):
print(f'a = {a}, b = {b}, c = {c}')
return a + b > c and b + c > a and a + c > b
# TypeError: is_triangle() takes 0 positional arguments but 3 were given
# print(is_triangle(3, 4, 5))
# 傳參時必須使用“參數名=參數值”的方式,位置不重要
print(is_triangle(a=3, b=4, c=5))
print(is_triangle(c=5, b=4, a=3))
或者使用 可變參數 + 關鍵詞傳參 ,在既不知道會傳入的參數個數,也不知道會不會指定參數名的情況下。
關鍵字參數會將傳入的帶參數名的參數組裝成一個字典,參數名就是字典中鍵值對的鍵,而參數值就是字典中鍵值對的值。
這裡沒怎麼看。。。大概先cv一下代碼
def calc(*args, **kwargs):
result = 0
for arg in args:
if type(arg) in (int, float):
result += arg
for value in kwargs.values():
if type(value) in (int, float):
result += value
return result
print(calc()) # 0
print(calc(1, 2, 3)) # 6
print(calc(a=1, b=2, c=3)) # 6
print(calc(1, 2, c=3, d=4)) # 10
參數和返回值比較簡單,一行代碼解決的函數,又稱匿名函數
先不管了,,
用一個函數裝飾另外一個函數或類並為其提供額外功能
比方說要記錄一個函數運行的時間,可以這樣弄
import time
# 定義裝飾器函數,它的參數是被裝飾的函數或類
def record_time(func):
# 定義一個帶裝飾功能(記錄被裝飾函數的執行時間)的函數
# 因為不知道被裝飾的函數有怎樣的參數所以使用*args和**kwargs接收所有參數
# 在Python中函數可以嵌套的定義(函數中可以再定義函數)
def wrapper(*args, **kwargs):
# 在執行被裝飾的函數之前記錄開始時間
start = time.time()
# 執行被裝飾的函數並獲取返回值
result = func(*args, **kwargs)
# 在執行被裝飾的函數之後記錄結束時間
end = time.time()
# 計算和顯示被裝飾函數的執行時間
print(f'{func.__name__}執行