为了账号安全,请及时绑定邮箱和手机立即绑定

遍历 Python 中的字符串列表

遍历 Python 中的字符串列表

偶然的你 2021-08-14 15:58:21
我想弄清楚为什么顶部代码有效而底部代码无效。它们都是 for 循环,只是写法不同,它们似乎做同样的事情,但第二个循环失败,并显示“int object is not iterable”。也许我在这里遗漏了一些明显的东西这有效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 回答

?
牧羊人nacy

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(..),第一个(也是唯一的)参数是一个可迭代的integers。这意味着该max(..)函数将迭代这个可迭代对象,并跟踪最大值。当生成器“耗尽”时,它返回它看到的最大对象。


查看完整回答
反对 回复 2021-08-14
?
浮云间

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它给了你一个可迭代的,你可以从中获得最大元素。


查看完整回答
反对 回复 2021-08-14
  • 3 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信