我想全神贯注地解释为什么顶部代码有效而底部代码无效。它们都是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
答案 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
的长度。因此,words
将max(..)
的可迭代对象作为第一个(也是唯一一个)参数。这意味着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])