Python使用functools.partial減少函數(shù)參數(shù)個數(shù)的高級技巧
引言
在Python編程中,我們經(jīng)常遇到一個??常見挑戰(zhàn)??:需要調(diào)用一個參數(shù)較多的函數(shù),但當(dāng)前上下文只能提供部分參數(shù)。這種場景在??回調(diào)函數(shù)處理??、??事件驅(qū)動編程??和??函數(shù)式編程??中尤為常見。幸運的是,Python通過functools.partial函數(shù)提供了優(yōu)雅的解決方案,使我們能夠??固定函數(shù)的部分參數(shù)??,創(chuàng)建一個參數(shù)更少的新函數(shù)。
本文將深入探討如何使用functools.partial及其相關(guān)技術(shù)來簡化函數(shù)調(diào)用接口。我們將從基礎(chǔ)概念出發(fā),逐步深入到高級應(yīng)用場景,并結(jié)合實際代碼示例展示這一技術(shù)的強(qiáng)大威力。無論您是初學(xué)者還是經(jīng)驗豐富的Python開發(fā)者,本文都將為您提供實用的知識和技巧。
減少函數(shù)參數(shù)個數(shù)不僅能使代碼更加??簡潔易讀??,還能提高代碼的??可復(fù)用性??和??可維護(hù)性??。通過掌握這一技術(shù),您將能夠編寫出更加靈活和強(qiáng)大的Python代碼。
一、理解問題:為什么需要減少參數(shù)個數(shù)
1.1 多參數(shù)函數(shù)的調(diào)用困境
在Python開發(fā)中,我們經(jīng)常會定義需要多個參數(shù)的函數(shù),這些參數(shù)可能包括配置選項、環(huán)境設(shè)置或操作數(shù)據(jù)等。然而,在實際調(diào)用時,特別是在以下場景中,直接調(diào)用多參數(shù)函數(shù)會變得很不方便:
- ??回調(diào)函數(shù)??:許多框架和庫要求回調(diào)函數(shù)只接受特定數(shù)量的參數(shù)(通常為1-2個)
- ??排序和過濾??:如
sorted()函數(shù)的key參數(shù)只接受單參數(shù)函數(shù) - ??事件處理??:GUI編程中的事件處理器通常有嚴(yán)格的參數(shù)簽名要求
- ??函數(shù)組合??:在函數(shù)式編程中,需要將多參數(shù)函數(shù)適配為管道式調(diào)用
# 示例:多參數(shù)函數(shù)在回調(diào)場景中的問題
def data_processor(data, config, threshold, verbose=False):
"""復(fù)雜的數(shù)據(jù)處理函數(shù)"""
if verbose:
print(f"處理數(shù)據(jù),閾值: {threshold}")
# 處理邏輯...
return processed_data
# 但回調(diào)接口只允許單參數(shù)函數(shù)
def callback_handler(result):
"""只能接受一個參數(shù)的回調(diào)函數(shù)"""
print(f"處理結(jié)果: {result}")
# 問題:如何將data_processor適配到callback_handler的調(diào)用約定?1.2 參數(shù)固定的常見需求
參數(shù)固定的需求通常源于以下情況:
- ??配置預(yù)設(shè)??:某些參數(shù)在特定上下文中總是使用相同的值
- ??接口適配??:使函數(shù)符合某個接口的調(diào)用約定
- ??代碼簡化??:減少重復(fù)的參數(shù)傳遞
- ??部分應(yīng)用??:逐步構(gòu)建函數(shù)功能,每次固定部分參數(shù)
理解這些需求是有效使用參數(shù)減少技術(shù)的前提。
二、functools.partial基礎(chǔ)
2.1 partial函數(shù)的概念和語法
functools.partial是Python標(biāo)準(zhǔn)庫中的一個??高階函數(shù)??,用于創(chuàng)建部分應(yīng)用的函數(shù)。部分應(yīng)用是指固定函數(shù)的部分參數(shù),生成一個參數(shù)更少的新函數(shù)。
??基本語法??:
from functools import partial new_func = partial(original_func, *args, **kwargs)
其中:
original_func:需要減少參數(shù)的原始函數(shù)*args:要固定的位置參數(shù)**kwargs:要固定的關(guān)鍵字參數(shù)new_func:生成的新函數(shù),參數(shù)個數(shù)減少
2.2 基本使用示例
讓我們通過一個簡單示例來理解partial的基本用法:
from functools import partial
# 原始函數(shù)
def power(base, exponent):
"""計算base的exponent次方"""
return base ** exponent
# 使用partial創(chuàng)建特化函數(shù)
square = partial(power, exponent=2) # 固定exponent為2
cube = partial(power, exponent=3) # 固定exponent為3
# 調(diào)用新函數(shù)
print(square(5)) # 輸出: 25 (計算5的平方)
print(cube(3)) # 輸出: 27 (計算3的立方)
# partial也支持固定多個參數(shù)
power_of_2 = partial(power, 2) # 固定base為2
print(power_of_2(3)) # 輸出: 8 (計算2的3次方)在這個例子中,我們通過partial將雙參數(shù)函數(shù)power轉(zhuǎn)換為單參數(shù)函數(shù)square和cube,大大簡化了調(diào)用接口。
2.3 參數(shù)固定規(guī)則詳解
理解partial的參數(shù)固定規(guī)則至關(guān)重要:
- ??位置參數(shù)固定??:按順序固定參數(shù),從第一個開始
- ??關(guān)鍵字參數(shù)固定??:可以指定參數(shù)名進(jìn)行固定
- ??混合固定??:可以同時固定位置參數(shù)和關(guān)鍵字參數(shù)
from functools import partial
def example_func(a, b, c, d=10, e=20):
return a + b + c + d + e
# 各種固定方式
func1 = partial(example_func, 1) # 固定a=1
func2 = partial(example_func, 1, 2) # 固定a=1, b=2
func3 = partial(example_func, d=100) # 固定d=100
func4 = partial(example_func, 1, e=50) # 固定a=1, e=50
print(func1(2, 3)) # 等效于example_func(1, 2, 3)
print(func2(3)) # 等效于example_func(1, 2, 3)
print(func3(1, 2, 3)) # 等效于example_func(1, 2, 3, d=100)
print(func4(2, 3)) # 等效于example_func(1, 2, 3, e=50)三、partial的高級用法與技巧
3.1 在排序和過濾中的應(yīng)用
partial在數(shù)據(jù)處理中特別有用,尤其是在排序和過濾操作中:
from functools import partial
# 復(fù)雜的數(shù)據(jù)點距離計算函數(shù)
def distance(point1, point2, metric='euclidean', scale=1.0):
"""計算兩點距離,支持多種度量方式"""
x1, y1 = point1
x2, y2 = point2
if metric == 'euclidean':
dist = ((x2 - x1)**2 + (y2 - y1)**2) ** 0.5
elif metric == 'manhattan':
dist = abs(x2 - x1) + abs(y2 - y1)
else:
raise ValueError(f"不支持的度量方式: {metric}")
return dist * scale
# 點列表
points = [(1, 2), (3, 4), (5, 6), (7, 8)]
reference_point = (4, 3)
# 使用partial創(chuàng)建特化的距離函數(shù)
euclidean_dist = partial(distance, reference_point, metric='euclidean')
manhattan_dist = partial(distance, reference_point, metric='manhattan')
scaled_dist = partial(distance, reference_point, metric='euclidean', scale=2.0)
# 按不同度量排序
points_by_euclidean = sorted(points, key=euclidean_dist)
points_by_manhattan = sorted(points, key=manhattan_dist)
print("按歐氏距離排序:", points_by_euclidean)
print("按曼哈頓距離排序:", points_by_manhattan)
# 過濾遠(yuǎn)離參考點的點
from math import sqrt
far_points = [p for p in points if euclidean_dist(p) > sqrt(2)]
print("遠(yuǎn)離參考點的點:", far_points)3.2 在回調(diào)函數(shù)中的應(yīng)用
回調(diào)函數(shù)是partial的典型應(yīng)用場景,特別是在異步編程和事件處理中:
from functools import partial
import logging
def complex_callback(data, config, logger=None, threshold=0.5):
"""復(fù)雜的回調(diào)函數(shù),需要多個參數(shù)"""
if logger:
logger.info(f"處理數(shù)據(jù),閾值: {threshold}")
# 處理邏輯
result = [x for x in data if x > threshold]
if logger:
logger.debug(f"處理結(jié)果: {result}")
return result
# 簡化回調(diào)函數(shù)供框架使用
def setup_callbacks():
"""配置回調(diào)函數(shù)供事件框架使用"""
logger = logging.getLogger('app')
config = {'mode': 'strict', 'timeout': 30}
# 使用partial創(chuàng)建適合框架的回調(diào)函數(shù)
simple_callback = partial(complex_callback,
config=config,
logger=logger,
threshold=0.8)
# 現(xiàn)在simple_callback只需要data參數(shù),符合框架要求
return simple_callback
# 模擬框架使用
callback = setup_callbacks()
result = callback([0.1, 0.6, 0.9, 0.4, 0.7])
print("回調(diào)結(jié)果:", result)3.3 創(chuàng)建函數(shù)工廠
partial可以用來創(chuàng)建??函數(shù)工廠??,動態(tài)生成特定功能的函數(shù):
from functools import partial
def create_processor_factory():
"""創(chuàng)建數(shù)據(jù)處理器工廠"""
# 基礎(chǔ)處理函數(shù)
def process_data(data, operation, factor=1, validation=True):
"""通用數(shù)據(jù)處理函數(shù)"""
if validation and not all(isinstance(x, (int, float)) for x in data):
raise ValueError("數(shù)據(jù)必須為數(shù)值類型")
if operation == 'scale':
return [x * factor for x in data]
elif operation == 'shift':
return [x + factor for x in data]
elif operation == 'normalize':
max_val = max(data) if data else 1
return [x / max_val * factor for x in data]
else:
raise ValueError(f"不支持的操作: {operation}")
# 使用partial創(chuàng)建特定處理器
processors = {
'scaler': partial(process_data, operation='scale'),
'shifter': partial(process_data, operation='shift'),
'normalizer': partial(process_data, operation='normalize')
}
return processors
# 使用函數(shù)工廠
factory = create_processor_factory()
# 創(chuàng)建具體的處理器
double_scaler = partial(factory['scaler'], factor=2)
increment_shifter = partial(factory['shifter'], factor=1)
unit_normalizer = partial(factory['normalizer'], factor=1)
# 使用處理器
data = [1, 2, 3, 4, 5]
print("加倍:", double_scaler(data)) # [2, 4, 6, 8, 10]
print("加一:", increment_shifter(data)) # [2, 3, 4, 5, 6]
print("歸一化:", unit_normalizer(data)) # [0.2, 0.4, 0.6, 0.8, 1.0]四、partial與替代方案的對比
4.1 partial vs lambda表達(dá)式
雖然lambda表達(dá)式也能實現(xiàn)類似功能,但兩者有重要區(qū)別:
from functools import partial
def complex_operation(a, b, c, d=10, e=20):
return a + b + c + d + e
# 使用partial
func_partial = partial(complex_operation, 1, 2, d=100)
# 使用lambda
func_lambda = lambda c, e=20: complex_operation(1, 2, c, d=100, e=e)
# 測試功能等價性
test_args = (3, 30)
print("partial結(jié)果:", func_partial(*test_args)) # 1+2+3+100+30=136
print("lambda結(jié)果:", func_lambda(*test_args)) # 1+2+3+100+30=136
# 但兩者有重要區(qū)別:??優(yōu)勢對比??:
| 特性 | functools.partial | lambda表達(dá)式 |
|---|---|---|
| ??可讀性?? | 更清晰,意圖明確 | 可能晦澀難懂 |
| ??調(diào)試支持?? | 更好的錯誤信息和堆棧跟蹤 | 調(diào)試信息較少 |
| ??性能?? | 通常稍快 | 稍慢 |
| ??閉包行為?? | 更可預(yù)測 | 可能有意外的閉包行為 |
4.2 partial與函數(shù)裝飾器的結(jié)合
partial可以與裝飾器結(jié)合使用,創(chuàng)建更加靈活的API:
from functools import partial, wraps
def configurable_decorator(*args, **kwargs):
"""可配置的裝飾器工廠"""
def actual_decorator(func):
@wraps(func)
def wrapper(*inner_args, **inner_kwargs):
# 使用partial固定配置參數(shù)
configured_func = partial(func, *args, **kwargs)
return configured_func(*inner_args, **inner_kwargs)
return wrapper
return actual_decorator
# 使用可配置裝飾器
@configurable_decorator(prefix="結(jié)果: ", verbose=True)
def process_data(data, prefix="", verbose=False):
"""數(shù)據(jù)處理函數(shù)"""
if verbose:
print(f"處理數(shù)據(jù): {data}")
return prefix + str(sorted(data))
# 測試
result = process_data([3, 1, 4, 1, 5])
print(result) # 輸出: 結(jié)果: [1, 1, 3, 4, 5]
# 等效的partial使用
def process_data_plain(data, prefix="", verbose=False):
if verbose:
print(f"處理數(shù)據(jù): {data}")
return prefix + str(sorted(data))
manual_result = partial(process_data_plain, prefix="結(jié)果: ", verbose=True)([3, 1, 4, 1, 5])
print(manual_result)五、實際應(yīng)用案例研究
5.1 GUI編程中的參數(shù)簡化
在GUI編程中,partial可以大大簡化事件處理器的設(shè)置:
import tkinter as tk
from functools import partial
class Application:
def __init__(self):
self.root = tk.Tk()
self.root.title("Partial函數(shù)示例")
self.value = 0
self.create_widgets()
def create_widgets(self):
"""創(chuàng)建界面組件"""
# 沒有使用partial的繁瑣方式
# button1 = tk.Button(self.root, text="方法1",
# command=lambda: self.update_value(1, "按鈕1"))
# 使用partial的清晰方式
button1 = tk.Button(self.root, text="加1",
command=partial(self.update_value, 1, "按鈕1"))
button1.pack(pady=5)
button5 = tk.Button(self.root, text="加5",
command=partial(self.update_value, 5, "按鈕5"))
button5.pack(pady=5)
button10 = tk.Button(self.root, text="加10",
command=partial(self.update_value, 10, "按鈕10"))
button10.pack(pady=5)
self.label = tk.Label(self.root, text="值: 0")
self.label.pack(pady=10)
reset_btn = tk.Button(self.root, text="重置",
command=partial(self.update_value, 0, "重置按鈕", True))
reset_btn.pack(pady=5)
def update_value(self, increment, source, reset=False):
"""更新值的方法"""
if reset:
self.value = 0
else:
self.value += increment
self.label.config(text=f"值: {self.value} (最后操作: {source})")
print(f"值更新為 {self.value}, 來源: {source}")
# 運行應(yīng)用
if __name__ == "__main__":
app = Application()
app.root.mainloop()5.2 數(shù)據(jù)管道處理
在數(shù)據(jù)處理管道中,partial可以創(chuàng)建可組合的數(shù)據(jù)處理單元:
from functools import partial
import math
def create_data_pipeline():
"""創(chuàng)建數(shù)據(jù)處理管道"""
# 基礎(chǔ)數(shù)據(jù)處理函數(shù)
def filter_data(data, condition_fn):
return [x for x in data if condition_fn(x)]
def transform_data(data, transform_fn):
return [transform_fn(x) for x in data]
def aggregate_data(data, aggregate_fn):
return aggregate_fn(data)
# 使用partial創(chuàng)建特定的處理函數(shù)
# 過濾器
positive_filter = partial(filter_data, condition_fn=lambda x: x > 0)
even_filter = partial(filter_data, condition_fn=lambda x: x % 2 == 0)
range_filter = partial(filter_data, condition_fn=lambda x: 0 <= x <= 100)
# 轉(zhuǎn)換器
square_transform = partial(transform_data, transform_fn=lambda x: x**2)
log_transform = partial(transform_data, transform_fn=lambda x: math.log(x) if x > 0 else 0)
normalize_transform = partial(transform_data, transform_fn=lambda x: x/100)
# 聚合器
sum_aggregate = partial(aggregate_data, aggregate_fn=sum)
avg_aggregate = partial(aggregate_data, aggregate_fn=lambda x: sum(x)/len(x) if x else 0)
max_aggregate = partial(aggregate_data, aggregate_fn=max)
return {
'filters': {
'positive': positive_filter,
'even': even_filter,
'range': range_filter
},
'transforms': {
'square': square_transform,
'log': log_transform,
'normalize': normalize_transform
},
'aggregates': {
'sum': sum_aggregate,
'average': avg_aggregate,
'max': max_aggregate
}
}
# 使用數(shù)據(jù)管道
pipeline = create_data_pipeline()
data = [-5, 2, 7, -3, 10, 15, 8, -1, 6]
# 構(gòu)建處理流程
result = pipeline['filters']['positive'](data) # 過濾正數(shù)
result = pipeline['transforms']['square'](result) # 平方變換
result = pipeline['aggregates']['average'](result) # 求平均值
print(f"原始數(shù)據(jù): {data}")
print(f"處理結(jié)果: {result}")
# 可以輕松組合不同的處理流程
alternative_flow = pipeline['aggregates']['sum'](
pipeline['transforms']['log'](
pipeline['filters']['range'](data)
)
)
print(f"替代流程結(jié)果: {alternative_flow}")5.3 API客戶端配置
在創(chuàng)建API客戶端時,partial可以簡化配置管理:
from functools import partial
import requests
class APIClient:
def __init__(self, base_url, default_timeout=30, default_headers=None):
self.base_url = base_url
self.default_timeout = default_timeout
self.default_headers = default_headers or {}
# 使用partial預(yù)設(shè)常用參數(shù)
self.get = partial(self._request, method='GET')
self.post = partial(self._request, method='POST')
self.put = partial(self._request, method='PUT')
self.delete = partial(self._request, method='DELETE')
def _request(self, endpoint, method='GET', params=None, data=None,
headers=None, timeout=None):
"""基礎(chǔ)請求方法"""
url = f"{self.base_url}/{endpoint}"
final_headers = {**self.default_headers, **(headers or {})}
final_timeout = timeout or self.default_timeout
response = requests.request(
method=method,
url=url,
params=params,
json=data,
headers=final_headers,
timeout=final_timeout
)
response.raise_for_status()
return response.json()
def with_options(self, **kwargs):
"""創(chuàng)建帶有特定選項的客戶端版本"""
return partial(self._request, **kwargs)
# 使用API客戶端
def main():
# 創(chuàng)建客戶端
client = APIClient(
base_url="https://api.example.com",
default_headers={'Authorization': 'Bearer token123'},
default_timeout=60
)
# 使用預(yù)設(shè)方法
users = client.get("users") # 只需要endpoint參數(shù)
new_user = client.post("users", data={"name": "John"})
# 創(chuàng)建特化版本
fast_client = client.with_options(timeout=5)
slow_client = client.with_options(timeout=120)
# 特化客戶端使用
quick_status = fast_client("status")
large_data = slow_client("reports", method='POST', data=large_payload)
# 進(jìn)一步特化
upload_file = partial(client.post, "upload", headers={'Content-Type': 'multipart/form-data'})
upload_result = upload_file(data=file_data)
if __name__ == "__main__":
main()六、最佳實踐與性能考量
6.1 使用partial的最佳實踐
根據(jù)實際經(jīng)驗,以下是使用partial的最佳實踐:
- ??明確命名??:給partial函數(shù)起描述性的名字
- ??文檔化意圖??:注釋說明為什么使用partial
- ??避免過度使用??:只在真正需要時使用
- ??保持可測試性??:確保partial函數(shù)易于單元測試
from functools import partial
# 好的實踐
def create_calculator(operations):
"""創(chuàng)建計算器工廠"""
def calculate(a, b, operation):
if operation == 'add':
return a + b
elif operation == 'subtract':
return a - b
elif operation == 'multiply':
return a * b
elif operation == 'divide':
return a / b if b != 0 else float('inf')
else:
raise ValueError(f"未知操作: {operation}")
# 使用partial創(chuàng)建特定操作函數(shù)
add = partial(calculate, operation='add') # 好的命名
subtract = partial(calculate, operation='subtract')
multiply = partial(calculate, operation='multiply')
divide = partial(calculate, operation='divide')
return {
'add': add,
'subtract': subtract,
'multiply': multiply,
'divide': divide
}
# 差的實踐:命名不清晰
calc = partial(calculate, operation='add') # 無法從名字知道用途6.2 性能考量與優(yōu)化
雖然partial通常性能良好,但在高性能場景中仍需注意:
from functools import partial
import timeit
def original_func(a, b, c, d):
return a + b + c + d
# 創(chuàng)建partial函數(shù)
partial_func = partial(original_func, 1, 2)
# 性能測試
def test_original():
return original_func(1, 2, 3, 4)
def test_partial():
return partial_func(3, 4)
def test_lambda():
func = lambda c, d: original_func(1, 2, c, d)
return func(3, 4)
# 測試性能
original_time = timeit.timeit(test_original, number=100000)
partial_time = timeit.timeit(test_partial, number=100000)
lambda_time = timeit.timeit(test_lambda, number=100000)
print(f"原始函數(shù): {original_time:.4f}秒")
print(f"Partial函數(shù): {partial_time:.4f}秒")
print(f"Lambda函數(shù): {lambda_time:.4f}秒")
# 通常結(jié)果:partial比lambda稍快,兩者都比直接調(diào)用稍慢??性能建議??:
- 在性能關(guān)鍵路徑中謹(jǐn)慎使用
- 考慮緩存partial函數(shù)避免重復(fù)創(chuàng)建
- 對于簡單場景,直接函數(shù)調(diào)用可能更高效
6.3 調(diào)試與錯誤處理
使用partial時,合理的錯誤處理很重要:
from functools import partial
def safe_partial(func, *args, **kwargs):
"""帶錯誤檢查的partial包裝器"""
try:
return partial(func, *args, **kwargs)
except TypeError as e:
raise ValueError(f"參數(shù)不匹配: {e}") from e
def robust_function(a, b, c=10):
"""示例函數(shù)"""
if not all(isinstance(x, (int, float)) for x in [a, b, c]):
raise TypeError("參數(shù)必須為數(shù)值")
return a + b + c
# 安全使用partial
try:
safe_add = safe_partial(robust_function, 1, 2)
result = safe_add(3)
print(f"結(jié)果: {result}")
# 這會引發(fā)錯誤
invalid_partial = safe_partial(robust_function, "invalid", 2)
except ValueError as e:
print(f"錯誤: {e}")
# 添加類型檢查
def typed_partial(func, *args, **kwargs):
"""添加類型提示的partial"""
partial_func = partial(func, *args, **kwargs)
# 保存原始函數(shù)信息用于調(diào)試
partial_func._original_func = func
partial_func._bound_args = args
partial_func._bound_kwargs = kwargs
return partial_func
# 使用帶調(diào)試信息的partial
debug_func = typed_partial(robust_function, 1, c=20)
print(f"原始函數(shù): {debug_func._original_func.__name__}")
print(f"綁定參數(shù): {debug_func._bound_args}")
print(f"綁定關(guān)鍵字參數(shù): {debug_func._bound_kwargs}")總結(jié)
通過本文的全面探討,我們深入了解了使用functools.partial減少函數(shù)參數(shù)個數(shù)的各種技術(shù)和應(yīng)用場景。以下是本文的??關(guān)鍵要點總結(jié)??:
核心價值
functools.partial是Python中一個??強(qiáng)大而靈活的工具??,它通過部分應(yīng)用函數(shù)參數(shù),使我們能夠創(chuàng)建更加專注和易用的函數(shù)接口。這種技術(shù)不僅提高了代碼的??可讀性??和??可維護(hù)性??,還增強(qiáng)了函數(shù)的??可復(fù)用性??。
技術(shù)優(yōu)勢
與傳統(tǒng)的lambda表達(dá)式相比,partial提供了??更清晰的語法??、??更好的調(diào)試支持??和??更可預(yù)測的行為??。特別是在復(fù)雜的回調(diào)場景和API設(shè)計中,partial展現(xiàn)出明顯的優(yōu)勢。
應(yīng)用場景
從GUI事件處理到數(shù)據(jù)管道構(gòu)建,從API客戶端配置到函數(shù)工廠模式,partial在眾多場景中都能發(fā)揮重要作用。掌握這一技術(shù)將顯著提升您的Python編程能力。
最佳實踐
在使用partial時,應(yīng)遵循??明確命名??、??適當(dāng)文檔化??和??保持簡潔??的原則。同時,在性能敏感的代碼路徑中需要謹(jǐn)慎使用,并始終考慮錯誤處理和調(diào)試支持。
functools.partial是Python函數(shù)式編程工具箱中的重要組成部分。通過合理運用這一技術(shù),您將能夠編寫出更加??優(yōu)雅??、??靈活??和??強(qiáng)大??的Python代碼,解決實際開發(fā)中遇到的復(fù)雜參數(shù)管理問題。
?到此這篇關(guān)于Python使用functools.partial減少函數(shù)參數(shù)個數(shù)的高級技巧的文章就介紹到這了,更多相關(guān)Python減少函數(shù)參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

