模块的概念

•模块是一个保存了Python代码的文件,其中可以包含变量、函数或类的定义,也可以包含其他各种Python语句。使用模块有以下3方面的优势。

•(1)模块提高了代码的可维护性。在程序开发过程中,随着程序功能的增多,在一个文件中的代码会越来越长,从而造成程序不易维护,此时可以把相关功能的代码分配到一个模块里,从而使代码更易懂、更易维护。

•(2)模块提高了代码的可重用性。在应用程序开发中,经常需要处理时间,此时不必在每个程序中写入时间的处理函数,只需导入time模块即可。

•(3)模块避免了函数名和变量名冲突。由于相同名字的函数和变量可以分别存在于不同模块中,在编写模块时,不必考虑名字会与其他模块冲突(此处不考虑导包情况)。

•在Python中,模块可以分为3类,具体如下所示:

•内置标准模块(标准库)——Python自带的模块,如sys、os等。

•自定义模块——用户为了实现某个功能自己编写的模块。

•第三方模块——其他人已经编写好的模块。

一个Python程序可由若干模块构成,一个模块中可以使用其他模块的变量、函数和类等,如图所示

•在图中, a.py是一个顶层模块(又称主模块),其中使用了自定义模块b.py和内置标准模块,b.py也使用了内置标准模块。

2.如何使用模块?

  想要使用模块,必须先要将模块加载进来,可以通过关键字 import 或 from进行加载;需要注意的是模块和当前文件在不同的命名空间中。

1)模块的构成:

  模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句

我们先自定义一个模块 名为mod.py;
print("hello world")
name = "zjk"
def func1():print("zjk1")def func2():prpint("zjk2")func1()def func3():print("zjk3")func2()#然后我们使用里一个py文件进行导入这个模块;
import mod
import mod
import mod
import mod
import mod
-----------------------------打印输出------------------------------------------
hello world#可以发现只打印了一次,是因为每次导入模块时,解释器都回去检查一下这个模块有没有之前被导过。

2)模块导入的过程:

  A.找到这个需导入的模块;

  B.判断这个模块是否被导入过;

    如果没有被导入过:

      创建一个属于这个模块的命名空间;如果用户没有定义变量来引用这个模块的内存地址的话,那么就使用模块的名称来引用这个模块的内存地址;如果用户使用as来指定变量接受这个内存地址的话,那么就将内存地址赋值给这个变量;且下文在调用时只能使用这个变量进行调用不能再使用模块名进行调用了。然后执行这个模块中的代码;

    如果该模块已经被导入过:

      那么解释器不会重新执行模块内的语句,后续的import语句仅仅是对已经加载到内存中的模块的对象增加一次引用;

3)关于导入的模块与当前空间的关系

  带入的模块会重新开辟一块独立的名称空间,定义在这个模块中的函数把这个模块的命名空间当做全局命名空间,这样的话当前的空间就和模块运行的空间分隔了,谁也不影响谁;

4)为模块起别名

  模块在导入的时候开辟了新空间内存,默认是使用模块的名称来引用这个内存地址的,有时候模块的名称很长再加上执行调用里面的功能的时候,就显的很不方便,为了更好的使用模块,我们可以给模块起别名;

  也就是在导入模块的时候我们不让它使用默认的名字来引用内存地址,而是由我们自己定义的变量来引用这个模块的内存地址;

  方法:import my_module as mk

  这样的话就表示使用变量mk来引用这个内存地址,然后我们在文中再使用这个模块的时候,只要使用mk来调用这个模块里的功能即可。

  还有一种好处是当有两个模块需要根据用户的输入来选择使用的话,那么,用自定义变量来引用内存地址就再好不过了,例如:

复制代码
#例如:join和pickle都有dump和dumps方法,根据用户的输入进行选择使用哪一种
#第一种,不使用别名方式,使用默认的以模块名引用的方式;
def func(dic,t = 'json'):if t == 'json':import jsonreturn json.dumps(dic)elif t == 'pickle':import picklereturn pickle.dumps(dic)
#第二种,使用别名方式引用的内存地址;def func(dic, t='json'):if t == 'json':import json as aaaelif t == 'pickle':import pickle as aaareturn aaa.dumps(dic)#可以看出使用别名的方式还是更好一些;别名的好处

5)导入多个模块

  方法一:import os,time,sys,re 等等,每个模块之间用逗号隔开;

  方法二:import os

      import time

      import sys

  方法二的好处就是当我们暂时不用某个模块时直接注释了就行,而方法一就得把那个模块删除;

  多个模块导入时的顺序:

  规范建议:模块应该一个一个的导入,先后顺序为:内置模块---->扩展(第三方)模块------>自定义模块;

  顺序说明:我们知道导入模块其实就是在执行这个模块,我们不确定扩展模块或自定义模块里有没有某个功能调用了内置模块,所以,我们在导入模块时,应先导入解释器内置的模块,然后在导入扩展模块,最后导入自定义模块。

  小结:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句;导入模块其实就是在执行py文件;开辟一块新内容,将内容加载到内存中;

3. from.....import

  我们在使用一个模块时可能只想使用其中的某些功能,比如只想使用sys模块中的modules时,那么import就不好用了,这时我们可以使用from.....import这样的格式来进行模块的某个功能的导入。

注意:这时模块是已经全部加载了,但只是为这个功能进行了引用,其他的功能并没有引用,所以在使用模块的时候,就只能使用这个模块的这个功能,其他的功能不能使用,如果想再使用这个模块的另一个功能时,可以在进行一次模块的要使用的功能的导入,这时模块不会再进行加载了,而是只对该功能进行引用,这样我们就可以使用这个功能了。

  注意:导入某个功能时也可以为其进行变量引用。

#先看一下import能不能只导入模块的某功能;
import sys.module
--------------------------打印输出-----------------------------------------------
Traceback (most recent call last):File "E:/python/zjk/模块和包/模块和包.py", line 1, in <module>import sys.module
ModuleNotFoundError: No module named 'sys.module'; 'sys' is not a package
#报错告诉我们,没有这个模块,sys不是一个包,啥意思??这个问题我们稍后会在文中说明,为什么这样不支持,包又是个啥。#看一下from.....import 的使用
from sys import modules
print(modules)
-----------------------------打印输出--------------------------------------------
{'builtins': <module 'builtins' (built-in)>, 'sys': <module 'sys' (built-in)>,#可以看出成功输出,没有报错。#再看一下使用as引用这个模块的某个功能;
from sys import modules as m
print(m)
------------------------------打印输出---------------------------------------
{'builtins': <module 'builtins' (built-in)>, 'sys': <module 'sys' (built-in)>, '_frozen_importlib': <module '_froze#这样也是可以的

 强调一下python中的变量赋值都是对内存地址的引用,是一种绑定关系,因为我们操作的时候不可能直接拿内存地址来进行操作,所以就将内存地址和变量进行绑定,执行这个变量就相当于执行了这个内存地址中的内存;

from.....import 也支持as模式,这个我们在上个例子里也说过了,这里就不再重复了;

from.....import 也支持导入某个模块的多个功能;如:

from os import (listdir,getcwd)
#后面的扩号可加可不加,需要注意的是,这是向要导入下一个模块就得另起一行了,不能在当前行导入;

from.....import *

  * 表示导入模块中所有的不是以下划线(_)开头的名字都导入到当前位置,大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。

  还有一点要说的是,如果使用* 的方式进行了导入,这时只想使用里面的某个或某些功能时,可以使用__all__来进行约束;

  注意:__all__只是用来约束*方式的,其他方式导入的话,不会生效;具体使用见例子:

#首先我们看一下不约束时使用*的方式进行模块导入;
#准备了一个自定义模块 mod.py
print("hello world")
name = "zjk"
def func1():print("zjk1")def func2():print("zjk2")func1()def func3():print("zjk3")func2()
#在当前py中导入mod模块;
from mod import *
print(name)
func1()
func2()
func3()
#调用mod模块里的功能;
------------------------------------------------打印输出---------------------
hello world
zjk
zjk1
zjk2
zjk1
zjk3
zjk2
zjk1
#可以看到,所有的功能和名字都可以被调用;#那么我们现在对其进行约束一下,要求只能使用fun3()功能;
#我们在mod模块开头加入一下
__all__ = ["func3"]print("hello world")
name = "zjk"
def func1():print("zjk1")def func2():print("zjk2")func1()def func3():print("zjk3")func2()#我们再次在当前py中进行调用;
from mod import *
func3()
print(name)
func1()
func2()
-----------------输出结果---------------------------------------------------
hello world
zjk3
zjk2
zjk1
Traceback (most recent call last):File "E:/python/zjk/模块和包/模块和包.py", line 3, in <module>print(name)
NameError: name 'name' is not defined
#可以看到只有func3执行成功了;为什么我要将func3放在最开头呢?你知道了吗?from import * 例子

小案例

•大家在使用手机QQ进行群聊时,经常会有小伙伴发红包,如图所示。

•发红包模块需具备以下3点要求:

•设定红包金额与数量。

•金额数最大的为运气王。

•随机分配金额。

接下来按照上述要求编写发红包功能模块,具体实现如例所示

本章小结

•本章主要介绍了Python程序中的模块与包,包括模块的概念、模块的导入、内置标准模块、自定义模块、包的概念、包的发布及安装。在开发应用时可以将程序组织成模块架构,这样不仅可以提高代码的重用性,而且便于将复杂任务分解并进行分块调试。

import pymysql 没有模块_python模块与包相关推荐

  1. python 怎么安装电脑摄像头模块_Python模块及安装

    Python模块及安装 09-Python模块及安装思维导图下载 1.模块的使用及安装 <1>Python中的模块 在Python中有一个概念叫做模块(module),这个和C语言中的头文 ...

  2. python模块调用模块_Python模块调用

    目录 1 模块 一个模块是包含了Python定义和声明的文件,文件名,就是模块名字加上py 后缀 把定义的函数.变量保存到文件中,通过Python test.py的方式执行,test.py就是脚本文件 ...

  3. python模块_python模块

    (随手花的草图,字模仿狂草,多多见谅,哈哈哈) 一.模块导入 1.import 语句 模块.py定义好后,我们可以使用 import 语句来引入模块,语法如下: import requests 在调用 ...

  4. python利用什么写模块_python模块是什么?写法及作用分析

    在这篇文章之中我们来了解一下python这门编程语言之中的模块.刚刚接触这门语言的朋友可能并不懂Python中的模块这个概念是什么意思.那么这篇文章就来带大家来认识一下模块.我们首先要知道python ...

  5. python 包和模块_Python中的包和模块实例

    一.实例和结果 1)实例的结构和具体的文件: PyPackage │ PyCommonM.py │ __init__.py │ ├─p1Package │ P1M.py │ P1MC.py │ __i ...

  6. python安装rarfile模块_python模块整理7-zipfile模块

    官方文档:http://docs.python.org/library/zipfile.html#module-zipfile 如果考虑到跨平台,要考虑用zip压缩文件 一.压缩 使用zipfile模 ...

  7. 如何查看python安装了哪些模块_Python模块如何安装 并确认模块已经安装好?

    看自己有没有安装好,最简单的办法在可以再控制台下: C:\Users\sony>python Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC ...

  8. python存文件的模块_python模块之StringIO/cStringIO(内存文件)

    1. StringIO/cStringIO是什么 这个模块提供了一个类,这个类的实例就像是一个文件一样可以读写,实际上读写的是一个字符串缓存,也可以称之为内存文件. StringIO和文件对象拥有共同 ...

  9. python从其他文件导入模块_Python模块可以使用其他文件的导入吗?

    我有这样的事情: # a.py import os class A: ... # b.py import a class B(A): ... 在B类(b.py)中,我希望能够使用在a.py中导入的模块 ...

最新文章

  1. 常用的xshell用vi命令编辑文本
  2. Python 私有变量的访问和赋值
  3. idea 保存设置 新建项目_配置、创建IntelliJ IDEA Spring MVC 项目
  4. k8s pod里访问不到外部ip_K8S容器网络如何实现通信?
  5. SiamFC++: Towards Robust and Accurate Visual Tracking with Target Estimation Guidelines 论文学习
  6. CAD增强属性块的还原
  7. 初级java程序员面试题大全_Java初级程序员面试题大全
  8. 最适合菜鸟的汉诺塔讲解
  9. Turtle画图之太阳花
  10. 39.安装PH5\PH7
  11. 小白学python#Day5#笔耕不辍#每日一句,提高认知
  12. Python——简化表达
  13. 聊聊游戏本推荐排行榜 这一款竟成黑马
  14. matplotlib绘制图例
  15. 小程序源码:AI微信小程序源码下载人脸照片AI转换动漫照片全新源码安装简单无需服务器域名-多玩法安装简单
  16. window10家庭版安装docker记录
  17. “丧偶式”恋爱?博士男友每晚12点才回家,要分手吗......
  18. excel 您输入的公式存在错误。如果您输入的内容不是公式,请在第一个字符之前输入单引号(‘)
  19. oracle jta,JTA和两阶段提交,处理全局事务
  20. Postman进阶篇动态参数、自定义动态参数及自定义动态参数全局变量断言

热门文章

  1. java jshelllink_02--Java Jshell的使用 最适合入门的Java教程
  2. php xml namespaces,PHP getDocNamespaces()函数讲解
  3. element-ui下拉框使用value绑定id
  4. 【链表】剑指offer:反转链表
  5. Leetcode445 两数相加||(单链表)
  6. 【数据结构算法】图解prime算法和Kruskal算法(最短路径问题)
  7. FFMPEG结构体分析:AVPacket
  8. 蓝宝石rx580怎么超频_台式机显卡怎么选?小百科教你准确定位合理选择(3)
  9. Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4
  10. Windows10/Servers2016应用商店恢复/安装