python模块笔记,python模块和包知识讲解_第1页
python模块笔记,python模块和包知识讲解_第2页
python模块笔记,python模块和包知识讲解_第3页
python模块笔记,python模块和包知识讲解_第4页
python模块笔记,python模块和包知识讲解_第5页
已阅读5页,还剩15页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python中的模块

在Python中有一个概念叫做模块(module)0

说的通俗点:模块就好比是工具包,要想使用这个工具包中的工具(就好比函

数),就需要导入这个模块

比如我们经常使用工具random,就是一个模块。使用importrandom导入工

具之后,就可以使用random的函数。

导入模块

<1>导入模块有五种方式

import模块名

from模块名import功能名

from模块名import*

import模块名as别名

from模块名import功能名as别名

下面来挨个的看一下。

<2>import

在Python中用关键字import来引入某个模块,比如要引入系统模块math,就

可以在文件最开始的地方用importmath来引入。

语法:

import模块1,模块2,...#导入方式

模块名.函数名()#使用模块甲.的函数

想一想:

为什么必须加上模块名调用呢?

答:

因为可能存在这样一种情况:在多个模块中含有相同名称的函

数,此时如果只是通过函数名来调用,解释器无法知道到底要调

用哪个函数。所以如果像上述这样引入模块的时候,调用函数必

须加上模块名

示例:

importmath

上确输出光梁printmath.sqrt(2)

#这样会报错

print(sqrt(2))

<3>from...import

有时候我们只需要用到模块中的某个函数,只需要引入该函数即可,此时可以

用下面方法实现:

from模块名import函数名1,函数名2....

不仅可以引入函数,还可以引入一些全局变量、类等

注意:

通过这种方式引入的时候,调用函数时只能给出函数名,不能给

出模块名,但是当两个模块中含有相同名称函数的时候,后面一

次引入会覆盖前一次引入。也就是说假如模块A中有函数

function(),在模块B中也有函数function(),如果引入A中

的function在先、B中的function在后,那么当调用function

函数的时候,是去执行模块B中的function函数。

例如,要导入模块fib的fibonacci函数,使用如下语句:

fromfibimportfibonacci

注意

不会把整个fib模块导入到当前的命名空间中,它只会将fib里的

fibonacci单个函数引入

<4>from...import*

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下

声明:

frommodnameimport♦

注意

这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明

不该被过多地使用。

<5>as别名

In[1]:importtimeastt#导入模块时设置别名为tt

In[2]:time.sleep(l)

NameErrorTraceback(mostrecentcalllast)

<ipython-input-2-07a34f5ble42>in<module>()

---->1time.sleep(l)

NameError:name'time'isnotdefined

In[3]:

In[3]:tt.sleep(l)#使用别名才能调用方法

In[4]:

In[4]:fromtimeimportsleepassp#导入方法时设皆.别名

In[5]:sleep(l)

NameErrorTraceback(mostrecentcalllast)

<ipython-input-5-82e5c2913b44>in<module>()

-->1sleep(l)

NameError:name'sleep'isnotdefined

In[6]:

In[6]:sp(l)#使用别名才能调用方法

In[7]:

常见系统模块

为了方便程序员开发代码,Python提供了很多内置的模块给程序员用来提高

编码效率。常见的内置模块有:

•os模块

•sys模块

•math模块

•random模块

•datetime模块

•time模块

•calendar模块

•hashlib模块

•hmac模块

•模块

•uuid模块v/uuid>

OS模块

OS全称OperationSystem,即操作系统模块,这个模块可以用来操作系统的功

能,并且实现跨平台操作

importos

os.getcwd()#获取当前的工作目录,即当前python脚本工作的目录

os.chdir('test')#改变当前脚本工作目录,相当于shell下的cd命令

os.renameC毕业论文.txt','毕业论文-最线版.txt')#文件重命名

os.remove('毕业论文.txt)#删除文件

os.rmdir('demo')#删除空文件夹

os.removedirs('demo')#删除空文件夹

os.mkdir('demo')#创建一个文件夹

os.chdir('C:\V)#切换工作目录

os.listdir('C:\\')#列出指定目录里的所有文件和文件夹

#nt->widonwsposix->Linux/Unix或者MacOS

os.environ#获取到环境配置

os.environ.get('PATH')#获取指定的环境配置

os.path.abspath(path)#获取Path规范会的绝对路径

os.path.exists(path)#如果Path存在,则返回True

os.path.isdir(path)#如果path是一个存在的目录,返回True。否则返回False

os.path.isfile(path)#如果path是一个存在的文件,返回True。否则返回False

os.path.splitext(path)#用来将指定路径进行分隔,可以获取到文件的后缀名

sys模块

该模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的

函数

importsys

sys.path#模块的查找路径

sys.argv#传递给Python脚本的命令彳j参数列表

sys.exit(code)并让程序以指定的退出码结束

sys.stdin#标准输入。可以通过它来获取用户的输入

sys.stdout#标准输出。可以通过修改它来百变默认输出

sys.stderr#错误输出。可以通过修改它来改变错误删除

math模块

math模块保存了数学计算相关的方法,可以很方便的实现数学运算。

importmath

print(math.fabs(-100))#取绝对值

print(math.ceil(34.01))#向上取整

print(math.factorial(5))#计算阶乘

print(math.floor(34.98))才向下取整

print(math.pi)#n的值,约等于3.141592653589793

print(math.pow(2,10))#2的10次方

print(math.sin(math.pi/6))#正弦值

print(math.cos(math.pi/3))#余弦值

print(math.tan(math.pi/2)1#正切值

random模块

random模块主要用于生成随机数或者从一个列表里随机获取数据

print(random.random())#生成[0,1)的随机浮点数

print(random.uniform(20,30))#生成[20,30]的随机浮点数

printfrandom.randintflO,30))#生成口0,30]的随机整数

print(random.randrange(20,30))#生成[20,30)的随机整数

print(random.choice('abcdefg,))#从列表里随机取出一个元素

prin^random.sampleCabcdefghij',3))#从列表里随机取出指定个数的元素

datetime模块

datetime模块主要用来显示日期时间,这里主要涉及date类,用来显示日期;

time类,用来显不时米J;dateteime类,用来显示3期时间;timedelta类用来计算

时间。

importdatetime

#创建一个日期

print(datetime.date(2020z1,1))

print(datetime.time(18,23,45))#创建一个时间

print(datetime.datetime.now())#获取当前的日期时间

print(datetime.datetime.now{)+datetime.timedelta(3))#计算三天以后的日期时间

time模块

除了使用datetime模块里的time类以外,Python还单独提供了另一个time

模块,用来操作时间。time模块不仅可以用来显示时间,还可以控制程序,让

程序暂停(使用sleep函数)

print(time.time())#获取从1970-01-0100:00:00UTC到现在时间的秒数

print(time.strftime("%Y-%nn-%d%H:%M:%S"))#按照指定格式输出时间

print(time.asctime())#MonApr1520:03:232019

print(time.ctime())#MonApr1520:03:232019

print('hello')

print(time.sleep(10))#让线程暂停10秒钟

print('world')

calendar模块

calendar模块用来显示一个日历,使用的不多,了解即可。

calendar.setfirstweekday(calendar.SUNDAY)#设置每周起始日期码。周一到周日分别对应0~

6

calendar.firstweekdayO#返【可当前每周起始日期的设置。默认情况下,首次载入calendar模

块时返回0,即星期一。

c=calendar.calendar(2019)#生成2019年的日历,并且以周日为其实日期码

print(c)#打印2019年FI历

print(calendar.isleap(2000))#True.闰年返回True,否则返回False

获取年到年一共有多少个闰年

count=calendar.leapdays(1996z2010)#19962C10

#打印年月的口历

print(calendar.month(2019z3))20193

hashlib模块

hashlib是一个提供字符加密功能的模块,包含MD5和SHA的加密算法,具

体支持md5,sha1,sha224,sha256,sha384,sha512等算法。该模块在用户

登录认证方面应用广泛,对文本加密也很常见。

importhashlib

#待加密信息

str='这是一个测试'

#创建mdS对象

hl=hashlib.md5('hello,.encode(encoding='utf8'))

print(WD5加密后为:1+hl.hexdigest())

hl=hashlib.shal('123456,.encode())

print(hl.hexdigest())

h2=hashlib.sha224('123456'.encode())

print(h2.hexdigest())

h3=hashlib.sha256('123456'.encode())

print(h3.hexdigest())

h4=hashlib.sha384('123456,.encode())

print(h4.hexdigest())

hmac模块

HMAC算法也是一种一种单项加密算法,并且它是基于上面各种哈希算法/散

列算法的,只是它可以在运算过程中使用一个密钥来增增强安全性。hmac模

块实现了HAMC算法,提供了相应的函数和方法,且与hashlib提供的api基

本一致。

h=hmac.new('h'.encode。,'你好'.encode。)

result=h.hexdigest()

print(result)#获取加密后的结果

模块

模块里有和deep两个函数,分别用来对数据进行深复制和浅复制。

import

nums=[1,5,3,8,(100,200,300,400],6,7]

numsl=.(nums)ft对nums列表进行浅复制

nums2=.deep(nums)#对nums列表进行深复制

uuid模块

UUID是128位的全局唯一标识符,通常由32字节的字母串表示,它可以保

证时间和空间的唯一性,也称为GUID。通过MAC地址、时间戳、命名空间、

随机数、伪随机数来保证生产的ID的唯一性。随机生成字符串,可以当成token

使用,当成用户账号使用,当成订单号使用。

方法作用

方法作用

基于MAC地址,时间戳,随机数来生成唯一的uuid,

uuid.uuidl()

可以保证全球范围内的唯一性。

算法与uuidl相同,不同的是把时间戳的前4位置换为

POSIX的UIDo不过需要注意的是python中没有基于

uuid.uuid2()

DCE的算法,

所以python的uuid模块中没有uuid2这个方法。

通过计算一个命名空间和名字的md5散列值来给出一个uuk

以保证命名空间中的不同名字具有不同的uuid,

但是相同的名字就是相同的uuid了。

namespace并不是一个自己手动指定的字符串或其他量,

uuid.uuid3(namespace,name)

而是在uuid模块中本身给出的一些值。

比如uuid.NAMESPACE_DNS,uuid.NAMESPACE_OID,

uuid.NAMESPACE_OID这些值。

这些值本身也是UUID对象,根据一定的规则计算得出。

uuid.uuid4()通过伪随机数得到uuid,是有一定概率重复的

uuid.uuid5(namespace,name)和uuid3基本相同,只不过采用的散列算法是sha1

一般而言,在对uuid的需求不是很复杂的时候,uuidl或者uuid4方法就已经

够用了

importuuid

print(uuid.uuidl())#根据时间戳和机器码生成uuid,可以保证全球唯一

print(uuid.uuid4())#随机生成uuid,可能会有重复

#使用命名空间和字符串生成uuid.

#注意一下两点:

#1.命名空间不是随意输入的字符串,它也是一个uuid类型的数据

#2.相同的命名空间和想到的字符串,生成的uuid是一样的

print(uuid.uuid3(uuid.NAMESPACE_DNS,'hello'))

print(uuid.uuid5(uuid.NAMESPACE_OID,'hello'))

pip命令的使用

在安装Python时,同时还会安装pip软件,它是Python的包管理工具,可以

用来查找、下载、安装和卸载Python的第三方资源包。

配置pip

可以直接在终端中输入pip命令,如果出错,可能会有两个原因:

1.pip安装成功以后没有正确配置

2.安装Python时,没有自动安装pip(很少见)

配置pip

和运行Python命令一样,如果想要运行pip命令同样也需要将pip命令的安

装目录添加到环境变量中

・>RfU>BOOTCAMP(C3>MP>chra>>Local>Programs>Python>Python37>Scriptsv。

W修改8.Afi大小

.Q17«1SWW101KB

MW47「匚吟Fl」,,」

pip-201W4/1178

*>pip37,xt;、□—m♦—;13

pip3g2OW4/11706101KB

编辑环境变量X

%USERPROFILE%\AppData\Local\Microsoft\WindowsApps新建(N)

%PyCharm%

C:\ProgramFiles\Redis\

编辑(E)

C:\ProgramFiles\MySQL\MySQLServer5.7\bin

C:\Users\chris\AppData\Roaming\npm

浏览

C:\Users\chris\ADDData\Locdl\Proardms\Pvthon\Pvthcn37

[C:\Users\chris\AppData\Local\Programs\Python\Pythcn37\Scripts]

删除(Q)

上移(U)

下移(Q)

编辑文本(工)…

确定取消

安装pip

如果在Python安装对应的目录中,没有发现pio.exe文件,可能是因为在安

装Python时未自动安装pip,建议将Python卸载,然后在重新安装Python时

选择installNOW使用默认方式安装Python.

②Python3.7.6(64-bit)SetupX

InstallPython3.7.6(64-bit)

SelectInstallNowtoinstallPythonwithdefaultsettings,orchoose

Customizetoenableordisablefeatures.

9InstallNow

C:\Users\chris\AppData\Local\Programs\Python\Python37

IncludesIDLE(pjq^nddocumentation

Createsshortcutsandfileassociations

->Customizeinstallation

Chooselocationandfeatures

python

for0Installlauncherforallusers(recommended)

windows0AddPython3.7toPATHCancel

管理第三方包

对第三方包的管理主要包含查找、安装和卸载三个部分的操作。

安装

使用pipinstall(包名>命令可以安装指定的第三方资源包。

pipinstallipython#安装ipython包

使用install命令下载第三方资源包时,默认是从pythonhosted下载,由于各

种原因,在国内下载速度相对来说比较慢,在某些时候甚至会出现连接超时的

情况,我们可以使用国内镜像来提高下载速度。

临时修改

如果只是想临时修改某个第三方资源包的下载地址,在第三方包名后面添加-i

参数,再指定下载路径即可,格式为pipinstall(包名>-i〈国内镜像路径〉

pipinstallipython-i/simple

永久修改

除了临时修改pip的下载源以外,我们还能永久改变pip的默认下载路径。

在当前用户目录下创建一个pip的文件夹,然后再在文件夹里创建pip.ini文件

并输入一下内容:

[global]

index-url=https:///simple

[install]

trusted-host=pypi.

常见国内镜像

•阿里云/pypi/simple/

•中国科技大学/simple/

•豆瓣(douban)/simple/

•清华大学/simple/

•中国科学技术大学/simple/

卸载

使用pipinstall〈包名>命令可以用来卸载指定的第三方资源包。

pipuninstallipython#卸载ipython包

查找

使用piplist或者pipfreeze命令可以来管理第三方资源包。这两个命令的功能

一致,都是用来显示当前环境里已经安装的包,区别在于piplist会列出所有

的包,包括一些无法uninstall的包;而pipfreeze只会列出我们安装的第三方

包。

总结

开发中,我们通常会使用很多笫三方的资源包,我们在将程序部署到服务器的

时候,不仅要把代码上传到服务器,同时还需要把代码里用到的第三方资源包

告诉服务器。那么这里就有两个问题:

1.

当我们电脑上运行很多个项目,每个项目使用的第三方资源包又不一致时,怎

样将代码和它使用到的第三方资源包放在一起呢?答:虚拟环境

2.

3.

怎样将自己代码使用到的第三方资源包告诉给服务器?

i.使用pipfreeze>requires.tx:命令,将代码里使用

到的第三方资源包以及版本号写入到requirements,txt文件,

在部署时,同时将requirements.txt文件上传到服务器。

ii.服务潜在拿到代码以后,首先运行pipinstall-r

requirements,txt命令,将文件里列出的所有第三方框架先安

装到服务器,然后才能运行代码。

使用pycharm管理第三方包

除了使用pip命令管理第三方资源包以外,我们还能使用pycharm来对第三

方包进行管理。

自定义模块

除了使用系统提供的内置模块以外,我们还能自己写一个模块供自己的程序使

用。一个py文件就是一个模块,所以,自定义模块很简单,基本上相当于创

建一个py文件。但是,需要注意的是,如果一个py文件要作为一个模块被别

的代码使用,这个py文件的名字一定要遵守标识符的命名规则。

模块的查找路径

创建•个模块亦常简单,安装标识符的命名规则创建•个py文件就是•个模

块。但是问题是,我们需要把创建好的这个py文件放在哪个位置,在代码中

使用import语句才能找到这个模块呢?

Python内置sys模块的path属性,列出了程序运行时查找模块的目录,只需

要把我们创建好的模块放到这些任意的一个目录里即可。

importsys

print(sys.path)

C:\\Users\\chris\\Desl<top\\Test',

'C:\\Users\\chris\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip',

'C:\\Users\\chris\\AppData\\Local\\Programs\\Python\\Python37\\DLLs',

'C:\\Users\\chris\\AppData\\Local\\Programs\\Python\\Python3八\lib',

'C:\\Users\\chris\\AppData\\Local\\Programs\\Python\\Python37*,

'C:\\Users\\chris\\AppData\\Roaming\\Python\\Python37\\site-packages',

'C:\\Users\\chris\\AppDmta\\Local\\Programs\\Python\\Python3'7\\lib\\site-packages'

]

_an_的使用

使用from〈模块名>import*导入一个模块里所有的内容时,本质上是去查找这个

模块的_all_属性,将_all_属性里声明的所有内容导入。如果这个模块里没

有设置_all_属性,此时才会导入这个模块里的所有内容。

模块里的私有成员

模块里以一个下划线_开始的变量和函数,是模块里的私有成员,当模块被导

入时,以_开头的变量默认不会被导入。但是它不具有强制性,如果一个代码

强行使用以一开头的变量,有时也可以。但是强烈不建议这样使用,因为有可

能会出问题。

总结

testl.py:模块里没有_2口_属性

a='hello'deffn():

print('我是testl模块里的fn函数’)

test2.py:模块里有_all_属性

x='你好'

y='good'def-foo():

print「我是test2模块里的foo图数’)

_all_=('x','foo')

test3.py:模块里有以—开头的属性

m='早上好.

_n='下午好,def_bar():

print('我是test3I!的bar函数')

demo.py

fromtestlimport*fromtest2import*fromtest3import

print(a)

fn()

print(x)#print(y)会报铝,test2的_all_里没有变量y

foo()

print(m)#print(_n)公报错,入test3时,_n不公被导入

importtest3

print(test3._n)#也可以强行使用,但是强烈不建议

_name_的使用

在实际开中,当一个下发人员编写完一个模块后,为了让模块能够在项目中达

到想要的效果,这个开发人员会自行在py文件中添加一些测试信息,例如:

testl.py

defadd(a,b):

returna+b

#这段代码应该只有直接运行这个文件进行测试时才要执行#如果别的代码导入本模块,这段代码不应该被

执行

ret=add(12,22)

print('测试的结果是ret)

demo.py

importtestl.py#只要导入了tetsl.py,就会,工刻执行testl.py代码,打印测试内容

为了解决这个问题,python在执行一个文件时有个变量_name_.在Python中,

当直接运行一个py文件时,这个py文件里的_name_值是—main一据此可以判

断一个一个py文件是被直接执行还是以模块的形式被导入。

defadd(a,b):

returna+b

if_name_=='_main_':#只仃接执行这个py丈件时,_name_的值才是_main_

#以下代码只有直接运行这个文件才会执行,如果是文件被另J的代码导入,下面的代码不会执行

ret=add(12,22)

print('测试的结果是,jet)

注意事项

在自定义模块时,需要注意一点,自定义模块名不要和系统的模块名重名,杏

则会出现问题!

包的使用

一个模块就是一个py文件,在Python里为了对模块分类管理,就需要划分

不同的文件夹。多个有联系的模块可以将其放到同一个文件夹下,为了称呼方

便,一般把Python里的一个代码文件夹称为一个包。

1.导入包的方式

现有以下包newmsg,包里由两个模块,分别是sendmsg.py、recvmsg.py文件。在包的

上级文件夹里,有一个test.py文件,目标是在test.py文件里引入newmsg的两个

模块。

目录结构如下图所示:

newmsg

test.py

sendmsg.py文件里的内容如下:

defsend_msg():

print('----------sendmsg方法被调用了-----")

recvmsg.py文件里的内容如下:

defrecv_msg():

print('.........recvmsg方法被调用\---------------')

可以使用以下几种方式来导入模块,使用模块生的方法。

1>.直接使用包名.模块模块名导入指定的模块。

►testpyx

•g•_____.模域和包一・bash-80*24

newmsg.sendmsg

JiangdeMacBook-Pro:WIQfijiangweilpythontest.py

2newmsg.sendmsg.send_msg()-------sendmsg-----------

Ji“ngdoMacBook-Pr。:模快IQ包jiangweiS|

2>.使用fromxxximportxxx方式导入拈定模块。

test.pyx

newmsgsendmsg,recvmsg

sendmsg.send_msg()

recvmsg.recv_msg()

#newmsg.sendmsg.sendmsg()此时,需要直接写模块名,不能再写包名

3>.使用_init_.py文件,导入包里的指定模块c

可以在newmsg里.创建.py文件,在该文件里导入指定的内容

>test.pyx

newmsgnpor-sendmsg,recvmsg

2sendmsg.send.msgO

•••__________________一模块和包一-bash—80x24

,JianadaMacBqok-Pro块和向jiangwei$pythontest.py

[el]。wo’djnewmsg包里_init_py文件的代码会自动执行

-------senamsg----------

JiangdeMacBook-Pro:模块和包jiangwei$

在_打/_山文件里编写代码:

from.importsendmsg#'.代表的是当前文件夹

test.py文件里的代码

importnewmsgI导入时•人包%L咆名的_init_.py文件里,导入了指定模块

newmsg.sendmsg.sendm_msg()#可以直接调用对应的力3、#newmsg.recvmsg.recv_msg()''可以

使用recvmsg模块,因为_init_.py文件里没有导入这个模块

4.>使用_init_.py文件,结合_all_属性,导入包里的所有模块。

在newmsg包里的_init_.py文件里编写代码:

_all_=["sendmsg","recvmsg"]#指定导入的内容

test.py文件代码:

fromnewmsgimportI#格newmsg里的_inint_.pyk件里,_all_展件时应的所仃模块都导入

sendmsg.sendmsg()

recvmsg.recvmsgO

总结

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论