【问题标题】:Why does a for loop return only the first item when a list comprehension returns everything?当列表推导返回所有内容时,为什么 for 循环只返回第一项?
【发布时间】:2021-11-09 22:10:38
【问题描述】:

尝试使用 zip() 将单词组合在一起,但想知道为什么下面的代码会导致不同的结果?

1)

def concatenate(L1,L2,connector):
    for (word1,word2) in zip(L1,L2):
        return [word1+connector+word2]

concatenate(['A','B'],['a','b'],'-')

期待['A-a','B-b'],但我得到了:['A-a']

2)

def concatenate(L1,L2,connector):
    return [word1+connector+word2 for (word1,word2) in zip(L1,L2)]

我得到了:['A-a', 'B-b']

【问题讨论】:

  • 您将返回第一个版本中循环的第一次迭代。
  • return 结束函数,因此它永远不会完成循环。
  • 欢迎来到 Stack Overflow!请使用tour 并阅读How to Ask。请edit这个问题有一个更具描述性的标题,例如,'为什么“返回”会停止循环?'

标签: python python-3.x


【解决方案1】:

return 退出函数。如果你想返回多个值,你可以使用yield,虽然这对你的目的来说可能是多余的:

def concatenate(L1, L2, connector):
    for word1, word2 in zip(L1, L2):
        yield word1+connector+word2

list(concatenate(['A','B'], ['a','b'], '-'))  # -> ['A-a', 'B-b']

请注意,您需要在函数调用中添加list() 才能真正得到一个列表。

【讨论】:

    【解决方案2】:

    这是只返回第一次迭代的代码。

    def concatenate(L1,L2,connector):
        merge=[]
        for (word1,word2) in zip(L1,L2):
            merge=merge+[word1+connector+word2]
        return(merge)
    
    print(concatenate(['A','B'],['a','b'],'-'))
    

    这段代码将运行所有迭代:

    def concatenate(L1,L2,connector):
        return [word1+connector+word2 for (word1,word2) in zip(L1,L2)]
        
    
    print(concatenate(['A','B'],['a','b'],'-'))
    

    在第一个代码中,我只是将最后一个字符串添加到数组中并返回变量。

    【讨论】:

    • return 是一个语句,而不是一个函数,所以为了清楚起见,不要在它的参数上加上括号:return merge
    • 这种附加到列表的方式确实过于复杂。只需使用merge.append(word1+connector+word2)
    • 哦,谢谢你的建议。
    猜你喜欢
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    相关资源
    最近更新 更多