3 回答
TA贡献1862条经验 获得超7个赞
第二种方法的问题
这是有道理的,因为在这里,如果您使用例如 调用它longestWord(['these', 'are', 'some', 'strings'])
,那么在第一次迭代s
中将是'these'
。
现在,如果我们所说的max(len(s))
,如此,这意味着Python会首先评估len(s)
是len('these')
,因此5
,然后我们叫max(..)
上5
。但是,5
是不是一个迭代(列表,发电机,或任何价值的“集合”)。计算“最大值 5 ”很奇怪,因此会出现错误。
即使 Python 允许对于不可迭代的元素只返回该元素,它仍然无法工作,因为这意味着它将返回第一个元素的长度。
为什么第一种方法有效
在第一个实现中:
def longestWord(words): return max(len(s) for s in words)
您构造了一个可迭代对象:(len(s) for s in words)
不是for
循环,而是一个生成器,当您对其进行迭代时,将生成words
. 因此max(..)
,第一个(也是唯一的)参数是一个可迭代的int
egers。这意味着该max(..)
函数将迭代这个可迭代对象,并跟踪最大值。当生成器“耗尽”时,它返回它看到的最大对象。
TA贡献1829条经验 获得超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
它给了你一个可迭代的,你可以从中获得最大元素。
添加回答
举报