第14课 模块和包

一、模块是什么?

1. Python的标准安装中包含了一组自带的模块,这些模块被称为”标准库"。Python语言之所以被广泛应用于各行各业,得益于它的模块化系统。

2. 另外,开发者完全可以根据自己的需要不断地为Python增加扩展库。各行各业的Python使用者,为Python贡献了大量的扩展库,使得Python的功能越来越强大,这些库形成在Python的“生态圈'。

3. 你可以把Python库当作提前写好的一些Python程序,当用需要时就调用它。任何Python程序都可以做为模块来导入。

4. 对于一个真实的Python程序,开发者不可能自己完成所有的工作,通过需要借助第三方类库,都需要以模块化的方式来组织项目的源代码。

二、模块化编程

1. 导入模块:使用import导入模块,有两种方法

1) import 模块名1[as 别名1 ],模块名2[as 别名2 ],模块名3[as 别名3 ]... 导入整个模块。使用这种方法时,导入模块中的成员,必须使用模块名或模块名前缀。

#导入sys整个模块

import sys 

# 使用sys模块名作为前缀来访问模块中的成员

print(sys.argv[0])

# 导入sys整个模块,并指定别名为s

import sys as s

# 使用sys模块别名作为前缀来访问模块中的成员

print(s.argv[0])

2) from 模块名 import 成员名1[ as 别名1], 成员名2[ as 别名2]... 导入模块指定成员。使用这种方法时,无须使用任何前缀,直接使用成员名或成员的别名。

#导入模块内的argv 成员

from sys import argv

# 直接使用成员名访问

print( argv[0])

# 导入模块内的argv成员,并指定别名v

from sys import argv as v

# 直接使用成员别名来访问

print(v[0])

3)使用from...import语法导入成员时,也可以一次性导入所有成员。

from sys import *

print(argv[0])

但是一般不推荐这种方法导入多个模块,如果两个模块中含有相同的函数时,就会存在风险。

2.定义模块: 任何Python程序都可以做为模块来导入。也就是说我们随便写个Python程序,就可以定义成一个模块了。文件名就是它的模块名。下面定义一个简单的模块:

>>> my_name ='Jeff'     #定义一个my_name变量

>>> def say_hi(user):     # 定义一个say_hi 函数

print('%s,您好,欢迎学习Python' %user)

>>>class User:      #定义一个User类

def __init__(self, name):

self.name =name

def walk(self):

print('%s正在慢慢地走路' %self.name)

3. 编写说明文档

为模块编写说明文档,只需要在模块文件的第一行代码之前加入一个字符串直接量就可以了。

'''

这是我编写的第一个模块,该模块包含以下内容:

my_name:字符串变量

say_hi:简单函数

User:用户类

'''

4.编写测试代码: 模块完成之后,我们还需要为模块编写一些测试代码,以确保模块中的每一个程序单元正常运行。

# 以下部分是测试代码

def test_my_name():

print(my_name)

def test_say_hi()"

say_hi('Mary')

say_hi(User('Mary')

def test_User():

u=User('Lily')

u.walk

print(u)

三、加载模块

1. 编写一个模块之后,如果直接使用import或from...import,通常并不能导入模块。因为Python不知道哪里找到这个模块。 为了Python能找到我们编写的模块,我们可以用以下两种方式:

1)使用环境变量

2)将模块放在默认的加载路径下

2. 使用PYTHONPATH环境变量:

PYTHONPATH变量是一个多个路径的集合,这样python会依次搜索PYTHONPATH环境所指的多个路径。在不同的操作平台上,设置环境变量的方式是不同的。

1)在windows平台设置环境变量 :右击桌面“计算机”-单击“属性”-打开“控制面板”-单击“系统和安全”-“系统” - 单击左侧的“高级系统设置” - 新建“系统变量”

变量名:PYTHONPATH

变量值:,;d:\python_module (把新建的模块放在该路径下)

2)在mac OS X上设置环境变量 : 

启动 mac OS X的终端窗口(命令行界面)- 进入当前用户的home路径下-然后在home路径下输入:

Is -a # 该命令列出了当前路径下所有文件

使用无格式编辑器,打开.bath_profile - 为该文件增加:

#设置PYTHONPATH变量

PYTHONPATH =.:/User/用户mac上的登录名/python_module

#导入PYTHONPATH变量

export PYTHONPATH

然后,重新登录Mac OS X。

3.默认模块加载路径 : 有些属于对Python本身进行扩展的模块,应该安装在Python的内部,以便被所有程序共享。些时可以借助于Python默认的模块加载路径。

1)Python默认的加载路径由系统变量sys.path代表,可能通过程序查看Python默认的加载路径:

>>> import sys, pprint

>>> pprint.pprint(sys.path) # pprint会比普通print显示更好的打印结果

通常应该把Python模块放在lib\site-packages路径下,它专门用来存放Python扩展模块和包。

2)  新建一个Python模块

>>> '''

简单模块,该模块包括以下内容

my_list:保存列表的变量

print_triangle:打印由星号组成的三角形函数

'''

'\n简单模块,该模块包括以下内容\nmy_list:保存列表的变量\nprint_triangle:打印由星号组成的三角形函数\n'

>>> my_list =['python','kotlin','swift']

>>> def print_triangle(n):

'''打印由星号组成的一个三角形'''

if n<=0:

raise ValueError('n必须大于0')

for i in range(n):

print(''*(n-i-1), end='')

print('*'*(2*i+1), end='')

print('')

>>> #====以下是测试代码====

>>> def test_print_triangle():

print_triangle(3)

print_triangle(4)

print_triangle(7)

>>> if __name__=='__main__':test_print_triangle()

将其存放在lib\site-packages路径下,在编辑器中输入命令调用模块。

>>>import print_shape

>>>print(print_shape.__doc__)

简单模块,该模块包括以下内容

my_list:保存列表的变量

print_triangle:打印由星号组成的三角形函数

>>>print_shape.print_trianlge.__doc__

#测试该模块中的变量my_list变量和print_triangle()函数。

>>> print_shape.my_list[1]

'kotlin'

>>> print_shape.print_triangle(4)

四、使用包

1. 什么是包?

一个实际需要的模块,往往有很多的程序单元,如果都放在一个源文件中,这个文件会非常的庞大。为了更好的管理多个模块源文件,Python提供的包的概念。

包就是一个文件夹,在该文件夹下包含了一个__init__.py文件,该文件夹可用于包含多个模块的源文件。

包的作用是用于包含多个模块,其本质也是模块,因此包可以用于包含包。

例如:

当我们为Python安装了numpy模块后,可以在Python安装目录下的lib/site-packages目录下找到一个numpy文件夹,它其实是一个包。 该文件夹下面既包含了matlib.py等模块源文件,也包含了core等子包。

2. 如何定义包?

1)创建一个文件夹,该文件夹的名字就是该包的包名。

创建一个文件夹,命名为:first_package

2)该文件夹内添加一个__init__.py文件即可。

在该文件夹内添加一个__init__.py文件。内容:

>>>'''

这是学习包的第一个示例

'''

>>>print(' this is first_package')

3. 如何导入包?

包的本质就是模块,所以导入包和导入模块的语法完全一样。

例如:

>>>import first_package

>>>print(type(first_package)

>>>print(first_package)

五、本节回顾

1. 什么是模块?

2. 如何创建模块?导入模块?使用模块?

3. 什么是包?

4. 如何定义和导入包?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容