遍历Python中的字符串列表

时间:2018-11-10 18:36:27

标签: python list for-loop

我想全神贯注地解释为什么顶部代码有效而底部代码无效。它们都是for循环,只是写的方式不同,它们看起来做相同的事情,但是第二个循环失败并显示“ int object is notererable”。也许我在这里缺少明显的东西

这有效

def longestWord(words):
    return max(len(s) for s in words)


x = longestWord(['these', 'are', 'some', 'strings'])

print(x)

这不起作用

def longestWord(words):
    for s in words:
        return max(len(s))

x = longestWord(['these', 'are', 'some', 'strings'])

print(x)

TypeError: 'int' object is not iterable

3 个答案:

答案 0 :(得分:4)

def longestWord(words):
    for s in words:
        return max(len(s))

首先,一旦您获得单词列表中的第一个单词,您将立即返回。

第二,len()为您提供了调用它的时间长度的整数。因此,执行max(len(whatever))将获得单个数字的最大值,这就是为什么会出现错误的原因。

在您的第一个示例中有效的原因:

max(len(s) for s in words)

是因为len(s) for s in words为您提供了一个可迭代的元素,您可以从中获得max元素。

答案 1 :(得分:3)

第二种方法的问题

这是有道理的,因为在这里,如果您用longestWord(['these', 'are', 'some', 'strings'])进行调用,那么在第一次迭代中,s将是'these'

现在,如果我们调用max(len(s)),则意味着Python首先会评估len(s),即len('these')的{​​{1}},然后再调用max(..),在5上。但是5不是iterable(列表,生成器或值的任何“集合”)。计算“ 最大值为5 ”很奇怪,因此会出现错误。

即使Python允许(对于一个不可迭代的对象)仅返回该元素,它仍将不起作用,因为这意味着它将返回 first 元素的长度。

第一种方法为何起作用

在第一个实现中:

5

您构造了一个可迭代的:def longestWord(words): return max(len(s) for s in words)不是一个(len(s) for s in words)循环,而是一个生成器,当您对其进行迭代时,将产生for的长度。因此,wordsmax(..)的可迭代对象作为第一个(也是唯一一个)参数。这意味着int函数将在此可迭代对象上进行迭代,并跟踪最大值。当生成器“用尽”时,它将返回已看到的最大对象。

答案 2 :(得分:2)

因为如果检查max()方法的定义,max()可处理一个或两个数字。而且当您喜欢max(len(s))时,它不是可迭代的对象,也不是两个整数,它只是一个整数值。 查看链接以获取有关max()的信息:

https://www.programiz.com/python-programming/methods/built-in/max

max(iterable, *iterables[,key, default])
max(arg1, arg2, *args[, key])