Python模块和包

2015/04/04 Python

Python模块和包

Python模块只是一个Python文件或一组Python文件。使用Python模块,可以编写可重用和更有组织的代码。

模块概述

Python自发展以来累积了相当完整的标准函数库,这些标准函数库中包含相当多的模块。所谓模块,指的是已经写好的Python文件,也就是一个“*.py”文件,模块中包含可执行的程序语句和定义好的数据、函数或类。一般来说,将多个模块组合在一起就形成程序包(Package)。如果说模块是一个文件,那么程序包就是一个目录。目录中除了包含文件外,还可能包含其他的子目录。

导入模块

使用Python现成的模块可以节省许多重复开发的工作,如果需要使用模块,只要使用import指令就可以将模块导入。在Python语言中,并没有强制import语句必须放在什么位置,只要放在调用函数或方法之前即可,习惯上把import语句放在程序的最前面。

在Python中,导入模块基本上有三种用法。

导入整个模块

导入整个模块,使用模块中的函数时要加上模块名称,格式如下:

import 模块名称

以Python内建的math模块为例,里面定义了一些与数学有关的常数和函数,只要通过import指令将该模块导入,就可以使用该模块中所定义的数学函数,例如:

>>> import math
>>> math.floor(9.5)
9
>>> math.pow(2,3)
8.0
>>> math.gcd(12,18)
6

如果要一次导入多个程序包,就必须以逗点“,”分隔开不同的程序包名称,语法如下:

import 程序包名称1, 程序包名称2, ..., 程序包名称n

例如,同时导入Python标准模块的数学和随机数模块:

import math, random

import指令除了用来导入标准程序包之外,也可以导入用户自行定义的程序包。但是,如果系统没有找到想要导入模块的路径,就会出现ImportError的错误。另外,如果要使用第三方公司开发的程序包,必须事先安装,才可以使用“import”指令导入。

替模块取别名

如果模块的名称过长,每次调用模块内的函数还要写上模块的名称,确实会给程序设计人员带来一些不必要的麻烦,而且也有可能在输入模块名称的过程中增加输入错误的可能。为了改善这个问题,当遇到较长的程序包名称时,也可以另外取一个简短、有意义又好输入的别名。为程序包取别名的语法如下:

import 程序包名称 as 别名

当程序包有了别名之后,就可以使用“别名.函数名”的方式进行调用,例如:

import random as r                #给random取别名为r
r.randint(1,100)                #以别名来进行调用

import…as导入模块并指定别名

import random as r
a = r.randint(0,99)  #调用randint函数获取随机整数
print(a)
items = [1, 2, 3, 4, 5]
r.shuffle(items)     #调用shuffle函数将数列洗牌
print(items)

只导入特定的函数

如果只用到特定的函数,也可以将函数复制到当前模块,这时如果使用模块中的函数,就不需要加上模块名称,直接输入函数名称就可以调用该函数。第一种方式的格式如下:

From  模块名称  import  函数名称

另外,也可以使用“from程序包名称import*”指令,表示导入该程序包的所有函数,例如以下语法就是将random程序包的所有函数导入(第二种方式):

from random import *

如果要导入多个函数,那么可以使用逗号“,”分隔。

以下范例程序要调用random模块中的randint函数来获取随机整数以及调用shuffle函数将数列洗牌。

from random import randint,shuffle
a = randint(0,99)  #调用randint函数获取随机整数
print(a)
items = [1, 2, 3, 4, 5]
shuffle(items)  #调用shuffle函数将数列洗牌
print(items)

Python的标准函数库中有非常多实用的模块,可以让我们省下不少程序开发的时间。当程序中同时导入多个模块时,函数名称就有可能重复,不过Python语言提供了命名空间(Namespace)的机制,它就像一个容器,将模块资源限定在模块的命名空间内,避免不同模块之间发生同名冲突的问题。

下面通过实际的例子来了解命名空间机制的作用。下面的范例程序使用random模块中的randint函数,当我们自定义了一个同名的函数时,执行时会各自调用自己的函数来执行,而不用担心执行时会发生冲突。

import random
def randint():
    print("执行了自定义的randint函数")
a = random.randint(0,99)  #调用random模块中的randint函数
print("执行了random模块中的randint函数:{}".format(a))
randint()  #调用自定义的randint函数

自定义模块

Python附带了成百个提供不同功能的默认模块。然而,也可以用Python编写自己的自定义模块。 要在Python中创建自定义模块,所需做的是创建一个新的Python文件。只要将函数放在.py文件中,保存之后就可以当作模块被导入使用。

在Python程序中寻找模块时,会按照sys.path所定义的路径来寻找,默认先从当前工作的文件夹寻找,再从环境变量PYTHONPATH指定的目录或Python的安装路径寻找。

要使用自定义Python模块,Python解释器应该能够访问包含自定义模块的Python文件。 有三个位置可以保存包含自定义模块的Python文件,以便Python解释器可以访问它。

  • 与访问模块的Python文件位于同一目录中。
  • 在另一个目录中,该目录必须添加到Python解释器的路径中。
  • 在Python解释器的任意默认路径内。

导入同一目录中的自定义模块

要导入自定义模块,可以使用import语句后跟模块名称。此语法类似于导入默认或已安装的Python模块。注意,要导入模块,只需指定该模块名称,而不需要“.py”扩展名。

创建一个名为newmodule.py的Python文件,在其中输入三个函数:print_text(),find_log(),find_exp(),如下所示。

import numpy as np
def print_text():
    print("这条消息来自于外部模块")
def find_log(num):
    return np.log(num)
def find_exp(num):
    return np.exp(num)

从另一个模块调用函数的一种方法是指定模块名称,后跟点“.”运算符和函数名,如下面的脚本所示:

import newmodule
newmodule.print_text()
print("这条消息来自主文件")

如果你不喜欢键入长模块名称,可以在通过as运算符在导入模块时为其指定别名,如下所示:

import newmodule as nm
nm.print_text()
print("这条消息来自主文件")

如果知道只需要模块中的某些函数,那么可以通过从模块中导入那些特定的函数或特性,而不是导入整个模块,使其更加简单。为此,可以使用from关键字。例如,下面的脚本从newmodule模块导入find_log()函数。在这种情况下,根本不需要使用点运算符将函数名附加到模块名,相反,可以直接调用该函数名。

from newmodule import find_log
log16 = find_log(16)
print(log16)

不过,有一种更简单的方法可以避免使用点符号。如果要从Python模块导入所有内容,只需使用星号“*”运算符即可。这样,就可以使用模块中的所有函数、类等,而无需使用点运算符将该功能附加到模块名称中。

from newmodule import *
log16 = find_log(16)
print(log16)

从其他不同路径中导入自定义模块

还可以将自定义模块保存在导入它的文件所在目录以外的目录中。使用Python文件newmodule2.py创建另一个模块。该文件包含一个方法find_sqrt(),如下所示。

import numpy as np
def find_sqrt(num):
   return np.sqrt(num)

在不同的目录中保存上面的文件。在我的计算机上是“D:\sample”。 现在,如果要在Python应用程序中导入newmodule2模块,则必须将该模块的路径附加到Python解释器可访问的路径列表中。sys.path列表包含这些路径的列表。 可以使用append()方法将新路径添加到Python解释器可访问的路径列表中。之后,可以导入该模块并访问其函数,如下所示。

import sys
sys.path.append(r"D:\sample")
import newmodule2
sqrt16 = newmodule2.find_sqrt(16)
print(sqrt16)

从默认Python路径中添加和导入自定义模块

可以通过将该模块保存在Python解释器尝试导入Python模块时搜索的默认路径,将自定义模块导入到Python应用程序中。 可以在sys.path列表中存在的任何路径中添加自定义模块。 要查看这些路径的列表,可以遍历“sys.path()”列表,如下脚本所示:

import sys
for i in sys.path:
    print(i)

包概述

在Python语言中,拥有“__init__.py”文件的目录会被视为一个程序包,程序包包含许多相关的模块或子程序包,因此可以说程序包是一种模块库、函数库。

认识Python的__name__属性

Python的文件都有__name__属性,当Python的.py文件的程序代码直接执行的时候,name__属性会被设置为“__main”;如果文件被当成模块import,属性就会被定义为.py的文件名。

def SplitBill(bill,split):
    '''
    函数功能:分账
    bill:账单金额
    split:人数
    '''
    print(__name__)   #输出__name__设置值
    tip = 0.1  #10%服务费
    total = bill + (bill * tip)
    each_total = total / split
    each_pay = round(each_total, 0)
    return each_pay
if __name__ == '__main__':    #判断__name__
    pay = SplitBill(5000,3)
    print(pay)

当moduleDiy_name.py被当成模块导入时,由于__name__属性并不等于__main__,因此第16行的if条件语句并不会被执行。如此一来,我们自己编写的程序就可以被import导入,也可以直接拿来执行。

实用的内建模块与在线帮助

Python的标准函数库提供了众多不同用途的模块供程序设计人员使用,在此我们仅列出一些常用的模块。

  • math模块提供了C函数库中底层的浮点数运算函数。
  • random模块提供了随机选择的工具。
  • datetime模块有许多与日期和时间有关的函数,并支持时区换算。
  • 更具阅读性的pprint程序包。
  • time和calendar模块可以用于格式化日期和时间,也定义了一些与日期和时间相关的函数。
  • os模块是与操作系统相关的模块。
  • sys模块包含与Python解释器相关的属性与函数。

os模块

os模块是与操作系统相关的模块,功能包括查询当前工作的文件夹路径、创建文件夹、删除文件夹等。

import os
CF=os.getcwd()
os.mkdir(CF+"/newFolder")  #创建文件夹
os.mkdir(CF+"/newFolder1")  #创建文件夹
os.rename(CF+"/newFolder1",CF+"/renewFolder") #更名
CF_listdir=os.listdir( CF )
print("当前文件夹:"+CF)
print("文件夹中的文件与文件夹:{}".format(CF_listdir))

sys模块

sys模块包含与Python解释器相关的属性与函数

import sys
print("sys.argv:{}".format(sys.argv))
print("文件名{}".format(sys.argv[0]))
length = len(sys.argv)
if len(sys.argv) < 2:
    try:
        sys.exit(0)
    except:
        tp, val, tb=sys.exc_info()
        print("exit!..{}:{}".format(tp,val))
for i in range(1,length):
    n1 = sys.argv[i]
print( "第{}个参数是{}".format(i,n1))

random模块

随机数是在程序设计中常使用的功能,特别是在制作游戏的时候,像扑克牌的发牌、猜数字游戏等。Python提供了一个random模块,可以用来产生随机数

import random
print( random.random() )
print( random.uniform(1, 10) )
print( random.randint(1, 10) )
print( random.randrange(0, 50, 5) )
print( random.choice(["真真", "小宇", "大凌"]) )
items = [1, 2, 3, 4, 5, 6, 7]
random.shuffle(items)
print( items )
print( random.sample('ABCDEFG', 2) )

datetime模块

日期与时间也是程序开发中经常用到的功能,Python提供了time模块和datetime模块。datetime模块除了显示日期和时间之外,还可以进行日期和时间的运算以及格式化

查看模块的路径与文件名

如果要查询模块的路径与文件名,那么可以使用__file__属性。例如通过以下程序语句可以清楚地知道math模块所在位置的路径与文件名:

>>> import string
>>> print(string.__file__)
D:\Users\Jun\Anaconda3\lib\string.py

Search

    微信好友

    博士的沙漏

    Table of Contents