我有兩種幾乎相同的方法,但我不知道如何將它們合并為一個,因為我不知道如何使回圈能夠遍歷串列或字典。
功能一:
def Function1()
# a block of code common for both methods
some_list = ['A', 'B', 'C']
for item in some_list:
condition = boolean_function_A(item)
if condition:
# a block of code common for both methods
功能2:
def Function2()
# a block of code common for both methods
unique_line_for_function2()
some_dict = {'A':1, 'B':2, 'C':3}
for key, value in some_dict.items():
condition = boolean_function_B(key, value)
if condition:
# a block of code common for both methods
我已經將它們合并為一個,但是如何處理不同數量的回圈引數?如果我打開一個串列,我有一個值,如果我打開一個字典,我有(并且需要)兩個值。
我知道我也可以封裝常見的代碼塊——但這些函式仍然做幾乎相同的作業,只是條件不同并采用不同的值。我想堅持一種方法,所以我不會重復自己。
uj5u.com熱心網友回復:
編輯:或者,您根本不必在定義回圈時解壓縮這些值。你可以做for item in (some_collection.items() if is_dict else some_collection):,而且item會在必要時簡單地變成一個元組。item從那里你可以在回圈的第一行手動解包,比如if is_dict: key, value = item. 兩種解決方案都可以。
在這種特殊情況下(串列與字典),我認為您最好的選擇實際上是根本不在字典上使用 .items() ,而是執行以下操作:
def function():
# a block of code common to both methods
some_collection = {'A': 1, 'B': 2, 'C': 3}
is_dict = isinstance(some_collection, dict)
if is_dict: unique_line_for_function2()
else: unique_line_for_function1()
for item in some_collection: # for a dictionary, this will loop over the keys
if not is_dict: condition = boolean_function_A(item)
else: condition = boolean_function_B(item, some_collection[item])
if condition:
# a block of code common to both methods
字典上的普通 for 回圈將回圈其鍵(即使不使用 .keys()),它可用于訪問值。您可以根據自己的用例對其進行擴展,但這只是一個想法。
uj5u.com熱心網友回復:
您可以使用元組解包 (*star_args) 將可變數量的引數傳遞給函式。所以你只需要確保 list 和 dict 都以元組的形式提供它們的值:
def function(some_data)
# a block of code common for both methods
if isinstance(some_data, dict):
unique_line_for_function2()
values = some_data.items()
boolean_function = boolean_function_B
else:
values = ((item,) for item in some_data)
boolean_function = boolean_function_A
for args in values:
if boolean_function(*args):
# a block of code common for both methods
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/489188.html
