比方說,
def sample():
if a==1:
print(a)
else:
continue
for i in language:
a=i
sample()
我想在回圈中使用這個函式,但是“繼續”命令給了我一個錯誤,因為沒有回圈。我能做些什么?
uj5u.com熱心網友回復:
從函式回傳一個布林值并根據回傳值是否繼續,因為繼續必須在回圈內
uj5u.com熱心網友回復:
continue
python 中的關鍵字僅在for
orwhile
回圈中可用。塊定義的變數a
也不能在全域范圍內使用。
我不知道您想要實作什么,但假設您的代碼,您想將條件提取到函式中,如下所示:
def condition(a):
return a == 1
def sample(a):
print(a)
for i in language:
a=i
if condition(a):
sample(a)
else:
continue
uj5u.com熱心網友回復:
這是因為函式的作用域不知道我們處于回圈中。您必須將continue關鍵字放在回圈中
uj5u.com熱心網友回復:
continue
關鍵字不能在函式內使用。它必須在回圈內。這里有一個類似的問題。也許您可以執行以下操作。
language = [1,1,1,2,3]
a = 1
def sample():
if a == 1:
print(a)
return False
else:
return True
for i in language:
if sample():
continue
else:
a = i
或者是這樣的:
language = [1,1,1,2,3]
a = 1
def gen(base):
for item in base:
if a == 1:
yield a
else:
continue
for i in gen(language):
a = i
print(a)
uj5u.com熱心網友回復:
根據您的需要,有幾種最佳實踐模式可以準確說明如何做到這一點。
0. 更好地考慮你的代碼
在執行以下任何操作之前,請停下來問問自己是否可以這樣做:
def sample(a):
print(a)
for i in language:
if i != 1:
continue
sample(i)
這好多了:
它對讀者來說更清楚(你需要理解回圈的控制流的一切都完全是回圈本地的——它就在回圈中,我們不必像函式定義那樣看更遠的地方來知道何時或為什么或回圈將如何做接下來的事情),
它更干凈(比以下任何解決方案都少樣板代碼),
從技術上講,它更有效(這在您衡量性能問題之前并不重要,但是由于您是新開發人員,這可能會吸引您:考慮一下 - 進入一個函式并退出它,加上以某種方式告訴函式外的回圈繼續 - 實作同樣的事情需要更多的作業),并且
它更簡單(客觀地說:一起撰寫的代碼更少-例如,回圈行為不再與
sample
函式體系結)。
但是,如果您必須:
1.添加布爾回傳
適用于您的示例的最簡單更改是回傳一個布林值:
def sample(a):
if a==1:
print(a)
else:
return True
return False
for i in language:
if sample(i):
continue
但是,不要總是盲目地使用True
for continue
- 對于每個功能,使用適合該功能的那個。事實上,在結構良好的代碼中,布爾回傳值是有意義的,甚至不知道您是否在某個回圈中使用它continue
。
例如,如果您有一個名為 的函式check_if_valid
,那么布爾回傳值在沒有任何回圈的情況下才有意義 - 它告訴您輸入是否有效 - 同時,根據背景關系,這些回圈中的任何一個都是合理的:
for thing in thing_list:
if check_if_valid(thing):
continue
... # do something to fix the invalid things
for thing in thing_list:
if not check_if_valid(thing):
continue
... # do something only with valid things
2. 重用現有回報
如果你的函式已經回傳了一些東西,或者你可以重新考慮你的代碼以使回傳有意義,那么你可以問自己:有沒有一種好方法可以根據該回傳值決定繼續?
例如,假設在您的sample
函式內部,您實際上是在嘗試執行以下操作:
def sample(a):
record = select_from_database(a)
if record.status == 1:
print(record)
else:
continue
那么你可以像這樣重寫它:
def sample(a):
record = select_from_database(a)
if record.status == 1:
print(record)
return record
for i in language:
record = sample(a)
if record.status != 1:
continue
當然,在這個簡單的例子中,沒有這個sample
功能會更干凈,但我相信你的sample
功能有理由更復雜。
3.特別“繼續”回歸
如果沒有現有的回傳值有意義,或者您不想將回圈與函式的回傳值耦合,則下一個最簡單的模式是創建并回傳一個特殊的唯一“哨兵”物件實體:
_continue = object()
def sample(a):
if a==1:
print(a)
else:
return _continue
for i in language:
result = sample(i):
if result = _continue:
continue
(如果這是模塊 API 的一部分,如果您將其命名為 likesample
而不是 like _sample
,那么我將命名為哨兵值continue_
而不是_continue
... API,除非我絕對必須這樣做。)
(如果您使用型別檢查器并且它抱怨回傳的物件實體與您的正常回傳值沖突,您可以創建一個Continue
類并回傳該實體而不是 的實體object()
。然后是函式回傳值的型別提示可以是您的正常回傳型別和型別之間的型別聯合Continue
。如果您的代碼中有多個控制流構造,您希望像這樣在函式呼叫行之間依偎。)
4. 包裝回傳值(和“monads”)
有時,如果型別聯合的東西由于某種原因不夠好,您可能想要創建一個包裝物件,并讓它存盤您的原始回傳值或指示控制流。我只是為了完整性而提到這個選項,沒有示例,因為我認為以前的選項在 Python 中大部分時間都更好。但是,如果您花時間了解“選項型別”和“也許 monads”,那就有點像這樣了。
(另外,請注意,在我的所有示例中,我將通過全域變數傳遞的后門引數固定為明確傳遞的引數。這使代碼更易于理解、預測和驗證正確性 - 你可能還沒有看到但請注意隱式狀態傳遞,這會使代碼更難遵循并在您成長為開發人員時保持正確,閱讀其他人的更多代碼并處理錯誤。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/506823.html
標籤:Python python-3.x 功能 循环 继续