Python学习笔记4

Python学习笔记–4.模块

MrZigZag@Peking University

2015-07-15

1.模块

类似于Java中的Package,Python提供模块module来将相关的代码打包。编写程序的时候可以使用内置模块,也可以使用第三方模块。

模块可以用于避免函数名冲突等问题,但是模块中尽量不要使用Python内置函数的函数名

避免模块名相同,提供了按照目录来组织模块的方法,称为包package,每个包都要有一个__init__.py文件,表示这是一个package,可以空。因为__init__.py本身就是一个模块,就表示包名。

包可以嵌套,组成多级多层次的包结构。

>MyPackage
    >Web
        __init__.py
        http.py
    __init__.py
    pytest.py
    http.py

2.创建和使用模块

以内置模块sys为例,创建一个新模块test

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

' a test module '
__author__ = 'MrZigZag'

import sys
def my_test():
    if len(sys.argv) == 1: # no other arguments
        print 'Hello World!'
    elif len(sys.argv) == 2: # one other argument, treat as a name
        print 'Hello %s!' % sys.argv[1]
    else:
        print 'Too many arguments!'

if __name__ == '__main__':
    my_test()

前两行是标准注释,第四行是一个字符串,任何模块的第一个字符串都会被视为模块的文档注释,之后可以使用__author__将作者写进去。

导入模块sys之后,变量sys就指向该模块。

最后两两句话常用在测试当中,如果直接命令行执行该模块,解释器就会把__name__置为__main__,如果其他地方导入test模块则不会,这一句就会失效。

>>> python test.py MrZigZag
Hello MrZigZag!
>>> python test.py
Hello World!
>>> python test.py 1 2
Too many arguments!

别名,可以给导入的模块赋别名。

import sys as SysModule

还可以在运行时根据当前环境选择最合适的模块,比如

try:
    import cStringIO as stringIO
except ImportError: # catching import error
    import stringIO

可以优先调用cStringIO并且无论调用那个,执行时名称都是stringIO

函数的可访问性,模块中可以把外部不需要的函数全部定义成private,外部引用的定义为public。

将一个函数定义为private的,只需在命名上以_开头,如def _private_function(name):

值得注意的是,__xxx__之类一般都是特殊变量,可以直接被引用,但是有特殊用途,一般命名时避免使用这个格式。

3.安装模块

Python中第三方模块一般使用easy_install或者pip来安装,mac自带pip。

模块会有路径问题,加载模块时,Python会在指定的路径下搜索对应的.py文件。默认情况下,会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径放在sys模块的path变量中。要添加自己的搜索目录可以直接在sys.path后面增加,但是在运行结束时失效

>>> import sys
>>> sys.path
>>> sys.path.append('my_path')

4.使用__future__

Python3相对于Python2.x修改比较大,很多Python2.x的程序在Python3上无法正确运行,在Python2.x中要使用Python3的一些新特性可以使用__future__模块。

from __future__ import unicode_literals
from __future__ import division