跳到主要内容

使用模块

1. 内置模块与导入

  • Python 内置很多模块,安装后即可使用。
  • 导入模块import sys;导入后会有变量 sys 指向该模块,通过 sys 可访问模块的所有功能(如 sys.argv)。

2. 模块的标准文件模板

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

' a test module '

__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()
部分说明
第 1 行#!/usr/bin/env python3:让该 .py 在 Unix/Linux/Mac 上直接运行
第 2 行# -*- coding: utf-8 -*-:本文件使用 UTF-8 编码
第 4 行字符串 ' a test module '模块的文档注释;模块代码的第一个字符串被视为模块文档,可用 __doc__ 访问
__author__作者信息,可写可不写
import sys导入模块,后面才是业务代码

3. sys.argv

  • sys.argvlist,存储命令行传入的所有参数
  • 至少有一个元素:第一个参数是该 .py 文件的名称。
    • python3 hello.pysys.argv['hello.py']
    • python3 hello.py Michaelsys.argv['hello.py', 'Michael']

4. if name == 'main'

  • 命令行直接运行该 .py 文件时,解释器会把特殊变量 __name__ 设为 '__main__',于是会执行 test()
  • 被其他文件 import 该模块时,__name__模块名(如 'hello'),if 不成立,不会执行 test()
  • 作用:同一模块既可被导入使用,又可在命令行运行时执行测试或入口逻辑。
if __name__ == '__main__':
test()

5. 运行与导入的区别

  • 命令行运行python3 hello.py → 打印 Hello, world!python3 hello.py Michael → 打印 Hello, Michael!
  • 交互环境 import hello:不会打印,因为未执行 test()
  • 调用 hello.test():才会打印 Hello, world!

6. 作用域(公开与私有)

  • 通过命名约定区分“给外部用”和“内部用”,Python 无法强制禁止访问,只是约定。
类型写法说明
公开(public)abcx123PI正常函数/变量名,可被外部直接引用
特殊变量__xxx__,如 __author____name____doc__有特殊含义,可被引用;自己不要用这种名字
非公开(private)_xxx__xxx,如 _abc__abc不应该被外部直接引用;仅供模块内部使用
  • private 的用途:内部实现用 private 函数/变量,只对外暴露少量 public 接口,实现封装
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)

原则外部不需要引用的一律定义成 private;只有外部需要引用的才定义为 public。

小结

要点说明
导入import 模块名,用 模块名.xxx 访问
sys.argvlist,命令行参数;首项为脚本名
name直接运行时为 '__main__',被 import 时为模块名;常用于 if __name__=='__main__': 做入口/测试
文档注释模块中第一个字符串为模块文档,可用 __doc__ 访问
作用域公开:正常命名;私有_xxx / __xxx,不应被外部引用;特殊__xxx__ 勿自用

记忆:import 用模块;命令行参数看 argv;主入口写 if __name__=='__main__';内部实现用 _ 前缀。