【问题标题】:Why do we use square brackets inside len()?为什么我们在 len() 中使用方括号?
【发布时间】:2022-01-27 23:01:07
【问题描述】:

我是 Python 新手,我想了解为什么我们在 len() 函数中使用方括号:

def counts(txt):
    return len([letter for letter in txt.lower() if letter in "aeiou"])

如果我删除方括号,我会得到

TypeError: 'generator' 类型的对象没有 len()

但我不明白这是什么意思。

【问题讨论】:

  • 这是因为您调用 lower() 函数作为列表理解的一部分
  • @JCaesar 这与是否使用lower 无关。
  • 这个真的可以写成sum(letter in 'aeiou' for letter in txt.lower())...
  • 请参阅How to len(generator()) 和相关问题。

标签: python


【解决方案1】:

len 函数返回序列集合的长度。因此,您必须将 sequencecollection 传递给此函数。

造成混乱的原因是,在这段代码中,程序员在len函数本身中创建了列表并将其作为参数传递。

基本上[ ] 是列表的符号:

my_list = [letter for letter in txt.lower() if letter in "aeiou"]
return len(my_list)

这是您提供的代码的更易读的等效项。

【讨论】:

    【解决方案2】:

    相同的代码无需理解即可更好地理解。它确实不是最佳的,也不是pythonic,但它应该可以帮助你:

    def counts(txt):
        data = []                    #     [                                                     ]
        for letter in txt.lower():   #             for letter in txt.lower()
            if letter in "aeiou":    #                                       if letter in "aeiou"
                data.append(letter)  #      letter
        return len(data)             # len(                                                       )
    print(counts('hello'))
    
    # Output
    2
    

    【讨论】:

      【解决方案3】:

      这仅仅是因为len() 函数只接受可迭代的集合或对象。

      一些例子:

      不要对包含单个字母的字符串感到困惑。它仍然会返回 1,因为它是可迭代的 String 类的对象。

      如果你尝试传递任何不可迭代的对象,它会抛出一个

      TypeError: 'object_type' 类型的对象没有 len()

      【讨论】:

      • 欢迎来到 SO。请不要添加代码、错误消息或数据的图像。相反,将内容直接写入您的帖子并适当地使用markdown to format
      【解决方案4】:

      [] 中的表达式创建了一个生成器。简单地说,生成器是一个对象,它根据其定义生成值。它唯一知道的是如何创造下一个价值,以及它是否需要停止。因此,您首先必须耗尽生成器中的所有值并将它们存储在某个地方,在这种情况下是一个列表。 List 里面有指定数量的项目,因此您可以确定它的长度,这与生成器不同。

      通过计算满足 if 条件的字母可以得到类似的结果:

      def counts(txt):
          count = 0
          for letter in txt.lower():
              if letter in "aeiou":
                 count += 1
          return count
      

      关于生成器的更多信息:Understanding generators in Python

      【讨论】:

      • 方括号 [...] 是列表推导,而不是生成器
      • @Anentropic 是的,但是方括号之间的代码会创建一个生成器对象,然后将其“解包”到一个列表中。
      • 这是一种思考方式,但 python 文档并没有这样描述它docs.python.org/3/tutorial/… 并且列表 comp 和生成器之间的区别已经让新手感到困惑
      • @Anentropic 我明白你的意思。我只是试图(未成功)解释为什么你不能只在表达式本身上调用len,即为什么你必须“使用里面的方括号”。您是否碰巧有对此进行更好解释的来源?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多