zoukankan      html  css  js  c++  java
  • 10_1_模块和包

    在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。

    为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)

    即:

    • 包含我们定义的函数以及变量的文件,以“.py”为后缀名。
    • 模块可以被其他的程序引用,以使用该模块中的函数或者数据。

    模块的优点:

    • 1.提高了代码可维护性
    • 2.提高了代码的复用性
    • 3.可以导入很多功能模块 ( 标准库模块,自定义模块,第三方模块)
    • 4.避免了变量名重复

    模块的导入

    Python中导入模块的方法的简单形式主要有以下三种:

    import 模块名
    import模块名 as 新名称
    from 模块名 import 函数名
    

    区别:

    • import 模块名import 模块名 as 新名称

      • 会导入整个模块;
      • 如果需要使用其中的某一个函数,必须以“模块名.函数名()”的形式调用函数。(通常这种方法,更有利于增强代码的可读性,优先推荐使用该种方法)
      • import 模块名 as 新名称用来重新命名导入的模块,以使名称简便,方便使用。
    • from 模块名 import 函数名

      • 只是导入模块中的某一函数,而不是导入整个模块。
      • 可以直接使用函数名称调用函数,无须再在其前加上“模块名.”。

      如果程序语句非常多,我们不建议采用“from 模块名 import 函数名”这种方式,因为采用这种方式调用函数时,我们直接使用函数名称调用函数,当程序语句非常多,我们调用了很多模块后,可能造成函数名重名,引发错误,而“模块名.函数名”的方式则会避免这种情况的发生。

    例子:

    以Python内建的calendar模块为例,其名称为calendar.py,里面定义了一些日历格式。只要使用import指令导入此模块,就可以使用calendar模块了。

    1, 3, 5, 7, 8, 10, 12 --->31天

    2月除外,30天

    二月:闰年29,平年28

    • import ...
    >>> import calendar # 导入calendar模块
    >>> print(calendar.month(2019,4)) # 调用用模块中的month()函数 
         April 2019
    Mo Tu We Th Fr Sa Su
     1  2  3  4  5  6  7
     8  9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30
    
    >>> calendar.isleap(2019)
    False
    
    • import ... as ...
    >>> import calendar as cal
    >>> print(cal.month(2019, 4))
         April 2019
    Mo Tu We Th Fr Sa Su
     1  2  3  4  5  6  7
     8  9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30
    
    >>> cal.isleap(2019)
    False
    
    • from ... import ...
    >>> from calendar import month
    >>> print(month(2019, 4))
         April 2019
    Mo Tu We Th Fr Sa Su
     1  2  3  4  5  6  7
     8  9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30
    
    >>> isleap(2019)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'isleap' is not defined
    >>>
    
    

    注意,

    - import 语句的模块顺序:

    我们推荐所有的模块在 Python 模块的开头部分导入。 而且最好按照这样的顺序:

    • Python 标准库模块
    • Python 第三方模块
    • 应用程序自定义模块

    然后使用一个空行分割这三类模块的导入语句。 这将确保模块使用固定的习惯导入, 有助于减少每个模块需要的 import 语句数目。 其他的提示请参考《 Python 风格指南》(Python’s Style Guide), PEP8 。

    - 限制使用 "from module import *"

    在实践中, 我们认为 "from module import *" 不是良好的编程风格, 因为它"污染"当前名称空间, 而且很可能覆盖当前名称空间中现有的名字; 但如果某个模块有很多要经常访问的变量或者模块的名字很长, 这也不失为一个方便的好办法。
    我们只在两种场合下建议使用这样的方法, 一个场合是:目标模块中的属性非常多, 反复键入模块名很不方便, 例如 Tkinter (Python/Tk) 和 NumPy (Numeric Python) 模块, 可能还有socket 模块。另一个场合是在交互解释器下, 因为这样可以减少输入次数。

    模块的路径查看:

    模块名.__file__

    >>> calendar.__file__
    'D:\Anaconda3\lib\calendar.py'
    >>>
    

    自定义模块

    所谓自定义模块就是我们自己动手写的模块(.py文件),既可以是一个解决某个问题的独立程序也可以包含多个函数。

    自定义模块的名称就是我们编写的Python程序的名称。

    下面给大家举个例子:

    在前面的课程中,我们已经接触过斐波那契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:

    1, 1, 2, 3, 5, 8,13, 21, 34, ...

    现在我们创建一个名为fibo.py的文件,内容如下:

     # 程序名称为fibo.py
    # 斐波那契数列模块
    def fib_01(n):          # 输出最大数小于n的斐波那契数列
        i, j = 0, 1
        while j < n:
            print(j, end = ' ')
            i, j = j, i + j
        print()
        
    def fib_02(n):          # 以列表的形式输出最大数小于n的斐波那契数列
        result = []         
        i, j = 0, 1
        while j < n:
            result.append(j)
            i, j = j, i + j
        return result
    
    

    在当前目录下打开cmd命令窗口。进入Python解释器环境,然后:

    >>> import fibo
    

    回车,如果没有报错,恭喜你,已经成功导入这个模块了。但这并不导入fibo中定义的函数的名称,它只进入模块名称fibo。使用模块名称,我们可以访问其中的函数:

    >>> import fibo        # 导入模块
    >>> fibo.fib_01(100)    # 调用导入模块的函数
    1 1 2 3 5 8 13 21 34 55 89
    >>> fibo.fib_02(100)    # 调用导入模块的函数
    [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    >>>
    
    

    如果接下来,我们会多次使用fib_01函数,我们可以这样做:

    >>> fib = fibo.fib_01
    >>> fib(100)
    1 1 2 3 5 8 13 21 34 55 89
    >>> fib(200)
    1 1 2 3 5 8 13 21 34 55 89 144
    >>> fib(1000)
    1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
    >>>
    
    

    reload()

    reload() 内建函数可以重新导入一个已经导入的模块。 它的语法如下:

    import importlib
    importlib.reload(module)
    
    

    module 是你想要重新导入的模块。使用 reload() 的时候有一些标准。 首先模块必须是全部导入(不是使用 from-import), 而且它必须被成功导入。另外 reload() 函数的参数必须是模块自身而不是包含模块名的字符串。 也就是说必须类似 reload(sys) 而不是 reload('sys')。
    模块中的代码在导入时被执行, 但只执行一次,以后执行 import 语句不会再次执行这些代码,只是绑定模块名称。 而 reload() 函数不同。

    模块搜索路径

    前面我们在导入模块时是要求在fibo.py所在路径下打开命令窗口,为什么呢?

    一般情况下,Python解释器在运行程序时,在这之前会自动将程序所在的当前目录添加到sys.path路径列表下,然后,优先搜索当前路径下的模块。在Windows系统中,其默认模块搜素路径为Python安装目录及其安装目录下的几个子文件夹,我们可以在python解释器环境下,通过以下方式查看:

    >>> import sys          # 导入sys模块
    >>> print(sys.path)       # 输出当前的模块搜索路径,以列表形式显示
    ['','D:\Python36\python36.zip','D:\Python36\DLLs','D:\Python36\lib', 'D:\Python36', 'D:\
    python36\lib\site-packages']
    >>>
    
    

    如果我们希望不在fibo.py文件所在目录路径下启动cmd命令窗口就可以导入fibo.py模块,我们可以用:

    sys.path.append(AddPath)
    
    

    临时添加fibo.py文件所在目录路径。

    现在,打开cmd:

    C:UsersAdministrator>python
    Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> sys.path.append('E:\python')
    >>> import fibo
    >>> fibo.fib_01(100)
    1 1 2 3 5 8 13 21 34 55 89
    >>>
    
    
  • 相关阅读:
    PL/SQL不安装ORACLE客户端
    C#特性的学习(一)
    Centos运行Mysql因为内存不足进程被杀
    ASP.NET Core 新核心对象WebHost(一)
    ASP.NET Core轻松入门之Configure中IHostingEnvironment和IApplicationLifetime的使用
    Asp.Net Core轻松入门之WebHost的配置
    asp.net core轻松入门之MVC中Options读取配置文件
    ASP.NET Core轻松入门Bind读取配置文件到C#实例
    ASP.NET CORE入门之读取Json配置文件
    ASP.NET Core MVC中构建Web API
  • 原文地址:https://www.cnblogs.com/geoffreygao/p/12161170.html
Copyright © 2011-2022 走看看