模块简介
一、模块的概念
- 在Python中,一个.py文件就称之为一个模块(Module)
- 包括Python内置的模块和来自第三方的模块
- 模块最大的好处是大大提高了代码的可维护性和重用性
- 使用模块还可以避免函数名和变量名冲突
二、包的概念
- 为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)
- 包就是一个特殊的目录,下面有一个
__init__.py
文件,没有这个文件的话python就认为这是一个普通的目录 __init__.py
文件本身就是一个模块,一个包本身也是一个模块,和包同名的模块的文件就是包下面相应的__init__.py
文件,这个文件可以不含任何代码,但是一般是做一些初始化的操作- 包的结构可以包含很多的层次,如下面的示意图所示
- 自己创建模块时要注意命名,不能和Python自带的模块名称冲突
模块使用
一、使用模块
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' module documentation '
__author__ = 'Michael Liao'
import sys
def test():
args = sys.argv
if len(args)==1:
print('Hello, world!')
elif len(args)==2:
print('Hello, %s!' % args[1])
else:
print('Too many arguments!')
if __name__=='__main__':
test()
- 代码第一二行分别指定解析器和解析器使用的字符编码
- 第三行的字符串是文挡注释,第四行指明模块的作者
- 最后main的那块和java中的main函数是类似的,执行该模块的时候会执行其中的代码,但是导入该模块的时候,该段代码不会执行,这个东西一般是用来进行一定的测试用的
- 关于
sys.argv
变量,这个变量本质指向一个list,这个list保存命令行参数,至少含有一个元素就是模块的名称
二、作用域
1、模块中的三种变量类型
- 普通的变量(这里的变量包括函数),外界可以访问,也就是public的
- 特殊变量
__name__ 、__author__
等可以被外界引用,但是有特殊用途 - 不需要让外部知道和引用的,也就是private的变量,定义的方式是
_name
或者__name
- 特别需要注意的是python里面的public和private只有一种约定,没有办法像java进行强制性约束,你非要访问private变量在python里面是完全可以做到的
2、变量作用域
- 在Python程序中创建、改变、查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域
- 在Python中并不是所有的语句块中都会产生作用域,只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候,才会有作用域的概念
- 需要注意的是在
if-elif-else、for-else、while、try-except\try-finally
等关键字的语句块中并不会产成作用域
局部作用域(local)
- 包含在def关键字定义的语句块中,即在函数中定义的变量
- 每当函数被调用时都会创建一个新的局部作用域
- 局部变量的生命周期依赖创建该局部作用域的函数是否处于活动的状态
- 可能的话尽量使用局部变量节约内存
- 函数内部定义全局变量需要使用 global 进行声明
- 在函数内部对全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量
嵌套作用域(enclosing)
- 嵌套作用域也是函数中的
- 对一个函数而言,局部是定义在此函数内部的局部作用域,而嵌套是定义在此函数的上一层父级函数的局部作用域
- 嵌套作用域主要是为了实现Python的闭包,而增加的实现
全局作用域(global)
- 在模块层次中定义的变量,每一个模块都是一个全局作用域
- 从外部看来模块的全局变量就是一个模块对象的属性
- 全局作用域的作用范围仅限于单个模块文件内
内置作用域(built-in)
- 系统内固定模块里定义的变量,如预定义在builtin 模块内的变量
变量名解析LEGB法则
- 搜索变量名的优先级:局部作用域 > 嵌套作用域 > 全局作用域 > 内置作用域
- 下面这个例子中会触发错误UnboundLocalError,触发错误的原因是这样的:Python模块代码在执行之前不会预编译,函数是会预编译的,预编译函数的时候发现函数中有variable 的定义,所以这个变量就被认定为局部变量了,但是运行到打印这个变量的时候,发现这个变量没有赋值,所以就报错了
- 一定要记住在调用一个变量之前,需要为该变量赋值(绑定一个内存对象)
variable = 300
def test_scopt():
# global variable
print(variable) # variable是test_scopt()的局部变量,但是在打印时并没有绑定内存对象。
variable = 200 #因为这里,所以variable就变为了局部变量
test_scopt()
print(variable)
模块安装
一、安装第三方模块
- 第三方模块的安装需要 pip 包管理工具,安装官方python的时候记得勾选pip工具,并添加到系统的PATH
- 通常使用最好的就是直接安装Anaconda,安装好这个python的环境有了,pip工具有了,常用的好些第三方的包也有了,还有conda这个很好的管理版本和Python环境的工具
二、模块搜索路径
- 当我们 import 一个模块的时候,肯定是有一个模块的搜索路径的
- 模块搜索路径作为一个变量保存在 sys 模块的 path 变量中,首当其冲就是当前路径
- 当我们 import 自己的模块报找不到的错误的时候,我们可以将模块所在的目录添加到path
1、搜索路径添加
- 临时添加:
sys.path.append('/test')
- 永久添加:设置环境变量
PYTHONPATH
,该环境变量的内容会被自动添加到模块搜索路径中
1.当我们导入自己编写的模块无法运行的时候,一定要记得查看
sys.path
2.pycharm中有时实际是正确导入了模块,但是提示错误,这时可以直接忽略,一般能够正常运行