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

笔记更新于2019年11月20日,
摘要:模块的基本介绍;包;模块的编写;作用域;第三方模块;模块搜索路径

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


文章目录

    • 模块
    • 编写模块
    • 作用域
    • 内置模块
    • 第三方模块
    • 模块搜索路径
      • • 动态添加目录
      • • 设置 PYTHONPATH 环境变量
      • • 增加 .pth 文件

模块

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

print(add(1, 2))

第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文件,内容为需要添加的路径即可。


以上就是本节的全部内容,感谢你的阅读。

下一节内容:11.面向对象编程之 类、实例与方法

有任何问题与想法,欢迎评论与吐槽。

和博主一起学习Python吧( ̄▽ ̄)~*

你可能感兴趣的:(Python入门,学习笔记)