【问题标题】:Is list a built in function or a class in python 3列出python 3中的内置函数或类
【发布时间】:2020-04-07 11:05:08
【问题描述】:
>>> print(list(map(list,"abcde")))
[['a'],['b'],['c'],['d'],['e']]

以上是最可能的答案,也是正确的,但是我的想法有点不同。

既然 map 需要一个函数作为第一个参数,而 list 是一个类,那么 map 是如何工作的呢?

但是,我听说 list 也是一个内置函数,它返回一个列表对象。只有一个类可以返回一个对象,它只不过是一个对象的创建。但是如果它是一个类,那么根据python中类的命名约定,list应该是用驼峰写的,但事实并非如此。

以上所有点都让我产生了一个冲突,即 list 是 python 中的类或方法?

【问题讨论】:

    标签: python-3.x list class class-method


    【解决方案1】:

    list 是 Python 的内置类。但是,类就像函数一样是可调用的,并且在被调用时,类会实例化并返回对象,因此您可以将类作为参数传递给函数(或准确地说是可调用)。

    【讨论】:

      【解决方案2】:

      既然 map 需要一个函数作为第一个参数,而 list 是一个类,那么 map 是如何工作的呢?

      map() 需要一个 callable 作为第一个参数。在 Python 中可以define custom callable types,Python 类确实是可调用对象。

      但是,我听说 list 也是一个内置函数,它返回一个列表对象。

      确实有相当多的内置类型仍然被记录为函数(如果我没记错的话,它们是在 1.x 天)。

      只有类可以返回对象

      哦,是吗?这意味着,由于 Python 中的所有内容都是一个对象,因此函数不能返回任何内容——即使是 None 单例对象也不可能;-)

      这不过是一个对象的创建。但是如果它是一个类,那么根据python中类的命名约定,list应该是用驼峰写的,但事实并非如此。

      和上面一样——很多内置类型被命名为函数,主要是出于历史原因。在某些情况下,即使在您自己的代码中也不遵循命名约定也是有意义的。例如,接受参数的装饰器可以定义为双重嵌套函数或可调用类。如果您的模块首先将装饰器定义为函数,那么无论出于何种原因(可读性、可测试性等),您决定将实现更改为可调用类,您当然不想通过在 CamelCase 中重命名客户端代码来破坏客户端代码。

      实际上,使用相同的机制来调用函数或实例化类的全部意义在于允许在不破坏客户端代码的情况下替换另一个 - OO 最重要特性的另一个应用程序:多态调度。

      以上所有点都让我产生了一个冲突,即 list 是 python 中的类或方法?

      绝对是一门课。你可以在你的 python shell 中测试它:

      Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
      [GCC 8.3.0] on linux
      Type "help", "copyright", "credits" or "license" for more information.
      >>> type(list)
      <class 'type'>
      >>> type(dict)
      <class 'type'>
      >>> type(property)
      <class 'type'>
      >>> type(type)
      <class 'type'>
      >>> type(len)
      <class 'builtin_function_or_method'>
      >>> 
      

      【讨论】:

        【解决方案3】:

        感谢您如此深入的解释。但是我仍然有点困惑。从上面的讨论中,我了解到 map 需要一个可调用对象,而不是将其限制为仅功能,而是整个系列(如果可调用对象)。根据我的经验,我认为所有类都是可调用的,这就是它们正确创建对象的方式。那么为什么它不适用于自定义类(请参阅下面的代码)。你能解释一下,为什么它会抛出错误?

        在 github 上上传的代码连同错误:https://github.com/Git101pt/Callables.git

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-04
          • 1970-01-01
          • 1970-01-01
          • 2014-11-17
          • 1970-01-01
          • 2012-10-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多