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