温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python学习—模块与包

发布时间:2020-08-10 09:40:33 来源:网络 阅读:482 作者:长安223 栏目:编程语言

模块

1.模块介绍

在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。
为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块。

2.使用模块的好处:

最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。
使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。点这里查看Python的所有内置函数。

3.模块分类

模块分为三种:
(1).自定义模块
(2).内置标准模块(又称标准库)
(3).开源模块

4.模块导入

(1)import xxx
直接导入模块.
导入时执行的动作:
产生一个新的名称空间;
在新建的名称空间里面执行模块(.py)的内容;
拿到模块名,执行模块文件产生的名称空间。

(2)import xxx as yyy
导入模块并重新赋予一个名字(不会改变模块本身的名字)

(3)from ... import xxx
从一个模块里导入函数、变量、装饰器等......
from ... import
将某个模块的所有内容导入。
代表所有。
用这种格式导入的时候iu,可以在模块中添加代码:

__all__ = [这里写允许从这个模块导入的内容]

例如:

import time
a = 100
def runTime(fun):
    def wrapper():
        start_time = time.time()
        fun()
        end_time = time.time()
        print('%.8f' %(end_time-start_time))
    return wrapper

def hello():
    print("hello hello")

#__all__用来控制from xxx import *导入的内容,此处表示只允许导入装饰器rumTime和变量a,而方法hello则不会被导入。
__all__ = ['runTime','a']

hello()

from ... import xxx as yyy
导入内容并重新命名。

5.常用内置模块

1.time模块
https://www.cnblogs.com/tkqasn/p/6001134.html

2.random模块
https://blog.csdn.net/zheng_lan_fang/article/details/76684761

3.math模块
https://blog.csdn.net/qq_38092017/article/details/76216137

4.string模块
https://blog.csdn.net/github_36601823/article/details/77815013

5.os模块
https://www.cnblogs.com/ginvip/p/6439679.html

6.sys模块
https://baijiahao.baidu.com/s?id=1594972087849221139&wfr=spider&for=pc

6.模块导入时查找顺序

在导入模块时,模块在python中的查找顺序为:

内存中已经加载的模块-->内置模块-->sys.path目录里面的模块
  • 内存中已经加载的模块:pythonj解释器在启动时默认自动加载的模块,可以通过sys.modules查看,sys.modules是一个字典,由模块名和模块信息构成键值对。
  • sys.path记录了导入模块的搜索路径,按照路径的先后顺序去搜索。
    注意:自定义模块时,模块名字不要和内置模块冲突,否则导入的是自定义模块,无法导入系统内置模块。

7.解决问题

1.在导入模块时,模块中的执行结果会和当前.py文件中执行结果一起显示。
例如:
有一个myRunTime模块如下:

import time
a = 100
def runTime(fun):
    def wrapper():
        start_time = time.time()
        fun()
        end_time = time.time()
        print('%.8f' %(end_time-start_time))
    return wrapper

def hello():
    print("hello hello")

hello()

将模块导入:

import time
import myRunTime

@myRunTime.runTime
def new_hello():
    time.sleep(2)
    print('new hello')

new_hello()

运行会发现,模块中的内容也显示了出来。
Python学习—模块与包

解决办法:
在模块中添加一行代码:

import time
import myRunTime
a = 100
def runTime(fun):
    def wrapper():
        start_time = time.time()
        fun()
        end_time = time.time()
        print('%.8f' %(end_time-start_time))
    return wrapper

def hello():
    print("hello hello")
if __name__ == "__main__":     #这是添加的代码。判断这个文件是否被作为模块导入。否,则执行if下的语句。是,则不执行。
    hello()

现在运行就不会有模块中的执行结果了。
Python学习—模块与包

__name__所在文件没有被当作模块导入,其值为__main__
__name__所在文件没被当作模块导入,其值为模块的名称

8.第三方模块导入

(主机要能联网)
1.在shell环境中用pip3安装。

pip3 install 模块名

2.在pycharm中安装

按ctrl+alt+s键进入模块管理界面,点击模块列表右边的"+"号按钮,进入搜索模块页面搜索选择模块然后安装。

1.包的含义

包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。

如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。

比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B 。

就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。

这样不同的作者都可以提供 NumPy 模块,或者是 Python 图形库。

举个例子:
一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。

现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mycompany,按照如下目录存放:
Python学习—模块与包

引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz。

请注意,每一个包目录下面都会有一个init.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。init.py可以是空文件,也可以有Python代码,因为init.py本身就是一个模块,而它的模块名就是mycompany。

类似的,可以有多级目录,组成多级层次的包结构。比如如下的目录结构:
Python学习—模块与包

文件www.py的模块名就是mycompany.web.www,两个文件utils.py的模块名分别是mycompany.utils和mycompany.web.utils。

mycompany.web也是一个模块,因为该目录下有一个init.py的文件。

文章参考:廖雪峰python教程

如果对包还有一些疑惑,可以参考:菜鸟教程python3-模块与包

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI