【问题标题】:Python : Importing modules [duplicate]Python:导入模块[重复]
【发布时间】:2015-10-19 20:55:15
【问题描述】:

有什么区别

import math

from math import *

我是 python 新手,从 codeacademy 学习语言。谁能详细说明区别。谢谢。

【问题讨论】:

标签: python module


【解决方案1】:

你应该打开解释器并播放:

>>> import math
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'math']
>>> from math import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'math', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
>>> 

【讨论】:

    【解决方案2】:

    当你做 import math 时,它会导入模块 math ,然后你可以使用 math.<name> 直接使用其中的函数、变量和类。

    当您执行from math import * 时,它会从模块中导入名称,有两种方法-

    1. 如果模块定义了__all__ 列表,它会从该列表中导入名称。

    2. 否则,它会导入所有其他变量、函数、类,但不导入子模块(如果有)。

    但请注意,在第二种情况下,它不会导入 math 模块,而是从其中导入名称。因此,不要使用 math.<name> ,而是使用 <name>

    请注意,from <module> import * 通常被认为是不好的。您可以在这里查看原因 - Why is "import *" bad?

    行为示例 -

    >>> import math
    >>> math.ceil(1.2)
    2
    
    >>> from math import *
    >>> ceil(1.2)
    2
    

    【讨论】:

      【解决方案3】:

      import math 中,您必须在输入method 之前声明library

      像这样:

      math.floor(5.3)
      

      但是对于from import math *,您使用的是直接来自该库的方法,因此您只需输入以下内容:

      floor(5.3)
      

      第二种方法可以节省输入,但如果您不小心将method 命名为与该library 中的一种方法一致,您可能会遇到一些问题。第一个库对于这些方法的作用也更加具体清晰。同样使用第一种方法,您不需要添加一些额外的imports 项目,如果您使用第二种方法则需要这些项目。

      一般我更喜欢第一种方法

      【讨论】:

        【解决方案4】:

        import module 和 from module import foo 之间的区别主要是主观的。选择您最喜欢的一个,并在使用时保持一致。以下几点可以帮助您做出决定。

        import module
        
        • 优点:减少对导入语句的维护。无需添加任何额外的导入即可开始使用模块中的另一个项目

          • 缺点:在代码中键入 module.foo 可能会很乏味且多余(使用 import module as mo 然后键入 mo.foo 可以最大限度地减少乏味)。

          从模块导入 foo

          • 优点:使用 foo 输入更少,可以更好地控制可以访问模块的哪些项目
          • 缺点:要使用模块中的新项目,您必须更新您的导入语句,您会丢失有关 foo 的上下文。例如,与 math.ceil() 相比,ceil() 的作用不太清楚

        任何一种方法都可以接受,但不要使用模块import *

        对于任何合理的大型代码集,如果您导入 *,您可能会将其固定到模块中,无法删除。这是因为很难确定代码中使用的哪些项目来自“模块”,因此很容易达到您认为不再使用导入但很难确定的地步。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-06-21
          • 2020-10-03
          • 2012-02-05
          • 1970-01-01
          • 2018-06-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多