美文网首页Pythoner集中营
【Python入门】10.模块、包与作用域

【Python入门】10.模块、包与作用域

作者: 三贝_ | 来源:发表于2018-08-10 18:29 被阅读15次

    *写在前面:为了更好的学习python,博主记录下自己的学习路程。本学习笔记基于廖雪峰的Python教程,如有侵权,请告知删除。欢迎与博主一起学习Pythonヽ( ̄▽ ̄)ノ *


    目录
    模块
    模块的基本介绍

    编写模块
    作用域
    内置模块
    第三方模块
    模块搜索路径

    [TOC]

    模块

    模块的基本介绍

    Module,即模块、组件的意思。在Python中,一个.py文件即是一个模块。在编写程序时,可以引用其他模块,在编写完成后又可以作为模块被其他程序引用。相同的函数名与变量名可以存在不同的模块中而不产生冲突。

    使用模块的好处:提高代码的可维护性,编写程序可引用其他模块而更为方便。

    为了避免模块名字与另外的模块名字产生冲突,可以通过用包来组织模块。如下

    mywork
    ├─ \__init__.py
    ├─ aaa.py
    └─ ccc.py
    

    mywork是一个包名,在其目录下必须存在_init.py这一文件,否则则视为普通的目录而非一个包。事实上,_init.py也是一个模块,它的模块名就是mywork。

    当一个模块被包组织起来,它的模块名就会发生变化,如aaa.py的模块名变成了mywork.aaa,ccc.py的模块名变成了mywork.ccc。

    包还能有多级目录,如

    mywork
     ├─ work
     │  ├─ __init__.py
     │  ├─ aaa.py
     │  └─ one.py
     ├─ __init__.py
     ├─ aaa.py
     └─ ccc.py
    

    此时,在work里面的aaa.py的模块名为mywork.work.aaa,在mywork里面的aaa.py的模块名为mywork.aaa。

    编写模块

    先给出一个简单的模块编写代码

    #! /user/bin/env python3
    # -*- coding utf-0 -*-
    
    ' a text module'
    
    __author__ = 'San bei'
    
    import sys
    
    def add(x, y):
        return x + y
    
    

    第1、2行是标准注释,第1行的注释#!/user/bin/env python3使得这个模块可以直接在Unix/Linux/Mac上运行,第2行注释# -- coding:utf-8 --表示文件使用标准的utf-8编码。

    第4行是模块的文档注释,任何模块代码的第一个字符串都被当作是模块的文档注释。

    第6行使用模块的_author_变量写入模块的作者

    以上就是Python模块的标准文件模板,可以不写,但还是建议按照标准格式构建模块。

    接下来是模块的真正代码部分。

    将它保存为text.py,在命令行模式直接运行模块,结果如下:

    >>>text.py
    3
    

    这个模块还能被引用,在交互式模式下引用模块,结果如下:

    >>>import text
    3
    >>>text.add(5, 2)
    7
    

    会发现在用import引入模块后,会执行被引用的模块,输出我们不需要的结果3。要解决这个问题,要在模块编写的时候加上if _name_ == '_main_',像这样:

    #! /user/bin/env python3
    # -*- coding utf-0 -*-
    
    ' a text module'
    
    __author__ = 'San bei'
    
    import sys
    
    def add(x, y):
        return x + y
    
    if __name__ == '__main__':
        print(add(1, 2))
    

    这是是什么意思呢?我们知道.py文件就是一个模块,可以直接运行,那么当模块直接运行的时候,模块的_name属性会变为_main。而当模块被引用时,模块的_name属性还是_name

    所以,这一行代码的意思是当模块直接运行时,就会执行下面的代码,当模块被引用时则不会执行下面的代码。

    一般而言,在编写模块时都会加上这一语句,因为在引用模块时,只需要模块内的函数,而不需要该模块本身输出的结果。

    这时候引用模块就不会输出3了:

    >>>import text
    >>>text.add(5, 3)
    8
    

    作用域

    在定义变量名时,会有这样约定俗成的编程习惯。

    正常的函数或变量名是公开的,像abc,xxy,PI,称为public变量,可以被直接引用

    类似_xxx这样的变量是一些特殊变量,如上面提到的_name,我们不会用这样的方式来定义变量

    类似_xxx这样的变量是非公开的,称为private变量,不应该被直接引用。

    可以通过一个公开的函数把非公开的函数隐藏起来,这样内部的逻辑就不会公开,如(下面例子转自廖雪峰的官方网站)

    def _private_1(name):
        return 'Hello, %s' % name
    
    def _private_2(name):
        return 'Hi, %s' % name
    
    def greeting(name):
        if len(name) > 3:
            return _private_1(name)
        else:
            return _private_2(name)
    

    内置模块

    在编写程序时,我们可以引用Python内置的模块来简化程序的编写过程。需要注意的是,在我们自己编写模块时,模块名不要与内置模块名相同,也不要与内置函数名相同,否则会发生冲突。Python所有内置的函数

    比如我们编写了一个sys.py的模块,这样系统内置的sys模块将不能被导入。

    第三方模块

    除了引用Python系统的内置模块之外,我们还能引用第三方模块,一般来说,第三方库都会在Python官方的网站注册。

    在安装了包管理工具pip之后,就可以通过pip来安装第三方模块了。

    pip install Pillow
    

    在命令行模式下输入pip install Pillow,便会安装第三方模块Pillow。

    模块搜索路径

    但我们加载一个模块时,Python会在指定目录下搜索这一.py文件,如果搜索不到则报错。

    默认情况下,Python会先搜索当前目录。Python的搜索路径存放在sys模块的path变量中。

    如果找不到模块,我们可以手动添加自己需要的搜索目录,有三种方法。

    • 动态添加目录
    >>> import sys
    >>> sys.path.append('C:\\Users\michael\my_py_scripts')
    

    临时生效,对于不经常使用的模块,这通常是最好的方式。

    • 设置 PYTHONPATH 环境变量

    如果是win7系统的话,可以通过右键计算机--->属性--->高级系统设置--->环境变量进行设置。

    该环境变量的内容会被自动添加到模块搜索路径中,Python本身的搜索路径不会受到影响。

    • 增加 .pth 文件

    在Python目录下的lib\site-packages里面增加.pth文件,内容为需要添加的路径即可。


    感谢你的阅读,有任何问题与想法欢迎评论与吐槽,和博主一起学习Python吧( ̄▽ ̄)~*

    相关文章

      网友评论

        本文标题:【Python入门】10.模块、包与作用域

        本文链接:https://www.haomeiwen.com/subject/zqikbftx.html