簡體   English   中英

知道在Python中的for循環中是否還有任何要迭代的元素的更好方法

[英]Better way to know if there are any elements left to iterate in for loop in Python

我有以下for循環:

def validate(request, fields=None):
    i = 0
    j = len(fields)
    return_fields = []

    for f in fields:
        i += 1
        if request.data[f] != check_validity(f)
            if i == j:
                return_fields.append(f)
                return return_fields
            else:
                return_fields.append(f)

這通過某些函數check_validity()檢查字段的有效性。 如果無效,則將其附加到return_fields列表中,最后將其返回給主調用方。 我的問題是,在我的代碼中,我使用兩個變量i和j只是檢查列表“字段”中是否還有任何元素。 但是我只是想知道是否有更好的方法來執行相同的操作,因為我想返回所有無效字段,並且在遇到其中任何一個無效字段時都不要停止。

另一種方法是使用枚舉

def validate(request, fields=None):
    return_fields = []

    for i, f in enumerate(fields):
        if request.data[f] != check_validity(f)
            if i+1 == len(fields):
                return_fields.append(f)
                return return_fields
            else:
                return_fields.append(f)

但是我不明白,為什么你需要知道它? 為什么你不能只是:

def validate(request, fields=None):
    for f in fields:
        if request.data[f] != check_validity(f)
            return_fields.append(f)
    return return_fields

簡寫:

def validate(request, fields=None):
    return [
        f for f in fields
        if request.data[f] != check_validity(f)
    ]

for循環在整個數組中進行迭代時會自動完成,因此您只需將return從for循環中取出,一旦對字段中的所有元素進行了迭代,它將立即運行。

def validate(request, fields=None):
    return_fields = []

    for f in fields:
        if request.data[f] != check_validity(f)
            return_fields.append(f)
return return_fields
def validate(request, fields=None):
    return_fields = []
    buggy = False
    for f in fields:
        if request.data[f] != check_validity(f)
            buggy = True
            return_fields.append(f)
    if buggy: return return_fields

順便說一句,在您的代碼中,僅當最后一個字段無效時,它才會返回return_fields。

我想使用yield將對您有用:)(在這里看看“ yield”關鍵字在Python中有什么用? ,它相對復雜,但是就像在不重新啟動函數的情況下一樣)

def validate(request, fields=None):
   for f in fields:
        if request.data[f] != check_validity(f):
            yield (f)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM