day21.模块和包
博客整理来源:http://www.cnblogs.com/Eva-J/articles/7292109.html
模块
1.什么是模块
常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
但其实import加载的模块分为四个通用类别:
1 使用python编写的代码(.py文件)
2 已被编译为共享库或DLL的C或C++扩展
3 包好一组模块的包
4 使用C编写并链接到python解释器的内置模块
2.为何要使用模块
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,
需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。
这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用,
3.如何使用模块
3.1 import
示例文件:自定义模块my_module.py,文件名my_module.py,模块名my_module
#my_module.py print('from the my_module.py')money=1000def read1():print('my_module->read1->money',money)def read2():print('my_module->read2 calling read1')read1()def change():global moneymoney=0
3.1.1 模块单次调用
模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行.
模块第一次导入后加载进内存,后续的import语句加载内存模块,不会重复调用
#demo.py import my_module #只在第一次导入时才执行my_module.py内代码,此处的显式效果是只打印一次'from the my_module.py',当然其他的顶级代码也都被执行了,只不过没有显示效果. import my_module import my_module import my_module''' 执行结果: from the my_module.py '''
3.1.2 模块变量不会影响自定义变量
每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,
就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突
#测试一:money与my_module.money不冲突 #demo.py import my_module money=10 print(my_module.money)print(money)''' 执行结果: from the my_module.py100010 '''
#测试二:read1与my_module.read1不冲突 #demo.py import my_module def read1():print('========') my_module.read1()''' 执行结果: from the my_module.py my_module->read1->money 1000 '''
3.1.3 总结
总结:首次导入模块my_module时会做3件事
1.为源文件(my_module模块)创建新的名称空间,在my_module中定义的函数和方法若是使用到了global时访问的就是这个名称空间。
2.在新创建的命名空间中执行模块中包含的代码,见初始导入import my_module
3.创建名字my_module来引用该命名空间
3.1.4 为模块重命名
事例1:方便调用
有两中sql模块mysql和oracle,根据用户的输入,选择不同的sql功能
#mysql.py def sqlparse():print('from mysql sqlparse') #oracle.py def sqlparse():print('from oracle sqlparse')#test.py db_type=input('>>: ') if db_type == 'mysql':import mysql as db # 将mysql 和oracle 都命名为 db,调用mysql或oracle都可直接调用db,方便快捷 elif db_type == 'oracle':import oracle as db
3.1.5 一行导入多个模块 (不常用)
import sys,os,re
3.2 from ... import ...
3.2.1
对比import my_module,会将源文件的名称空间'my_module'带到当前名称空间中,使用时必须是my_module.名字的方式
而from 语句相当于import,也会创建新的名称空间,但是将my_module中的名字直接导入到当前的名称空间中,在当前名称空间中,直接使用名字就可以了、
#测试一:导入的函数read1,执行时仍然回到my_module.py中寻找全局变量money #demo.py from my_module import read1 money=100 read1() ''' 执行结果: from the my_module.py spam->read1->money 1000 '''#测试二:导入的函数read2,执行时需要调用read1(),仍然回到my_module.py中找read1() #demo.py from my_module import read2 def read1():print('==========') read2()''' 执行结果: from the my_module.py my_module->read2 calling read1 my_module->read1->money 1000 '''
如果当前有重命名read1或者read2,那么会有覆盖现象。(函数级别)
#测试三:导入的函数read1,被当前位置定义的read1覆盖掉了 #demo.py from my_module import read1 def read1():print('==========') read1() ''' 执行结果: from the my_module.py ========== '''
需要特别强调的一点是:python中的变量赋值不是一种存储操作,而只是一种绑定关系,如下:
from my_module import money,read1 money=100 #将当前位置的名字money绑定到了100 print(money) #打印当前的名字 read1() #读取my_module.py中的名字money,仍然为1000''' from the my_module.py my_module->read1->money 1000 '''
3.2.2 也支持重命名
3.2.3 也支持多行导入
3.3 把模块当做脚本执行
我们可以通过模块的全局变量__name__来查看模块名:
当做脚本运行:
__name__ 等于'__main__'
当做模块导入:
__name__= 模块名
作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
if __name__ == '__main__':
# 模块a a = 100 print('这是模块a') if __name__ == '__main__':print(a)# 模块b import a b = 200 print('这是模块b') print(b)# 在模块 b 中调入模块a 的执行结果: 这是模块a 这是模块b 200
当你要导入某个模块,但又不想改模块的部分代码被直接执行,那就可以这一部分代码放在“if __name__=='__main__':
二 包
1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法
2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)
3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
强调:
1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块
转载于:https://www.cnblogs.com/jiuyachun/p/10592604.html
day21.模块和包相关推荐
- python笔记6 模块与包 程序开发规范 包 re sys time os模块
模块与包 python 模块首引用加载到内存,如果再次引用此模块,直接从内存中读取. python文件分为:执行文件(解释器运行的文件),被引用文件(import) 模块引用一共发生了3件事: 1.他 ...
- python之路——模块和包
一.模块 1.什么是模块? 常见的场景:一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1.使用Python编 ...
- Python中的类、模块和包究竟是什么?
Python培训教程:Python中的类.模块和包究竟是什么?在Python和其他编程语言中,都有类似或相同的概念,如对象.类.模块.包,名称都是一样的,只不过会有细微的一些区别,正是因为有这些存在, ...
- python模块和包用法详解(__all__)
1. 模块 Python 模块(Module),是⼀个 Python ⽂件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块能定义函数,类和变 ...
- python类、模块、包
通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块.包目录下为首的一个文件便是 __init__.py.然后是一些模块文件和子目录,假如子目录中也有 _ ...
- python入门是哪个包_python入门(十):模块、包
模块:py文件 包:目录,目录里面包含__init__.py,内容可以是空 里面可以包含多个模块文件,还可以包含子包 1.模块和包,可以很方便的提供给其他程序以复用 1) 利于组织复杂工程 我们写代码 ...
- python哪里下载import包-【Python实战】模块和包导入详解(import)
1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...
- python哪里下载import包-详解python中的模块及包导入
python中的导入关键字:import 以及from import 1.import import一般用于导入包以及模块. 不过有个小问题: (1)当导入的是模块的时候是可以直接可以使用模块内的函数 ...
- python 模块与包
什么是模块? 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能.即一个模块就是一个包含了一组功能的python文件,比如spam.py,模块名为spam,可以通过import spa ...
最新文章
- 当我们做MVP产品时,我们到底在做什么?
- 2017-2018-1 201553334 实验五 通讯协议设计
- Linux无法解析hosts里面绑定域名的排查方法
- c远程连接mysql数据库_MySQL数据库远程连接开启方法
- java hibernate 插入数据_[Java教程]hibernate 返回新插入数据的Id
- iphone查看删除的短信_苹果删除的短信
- linux ortp 编译,Linux下oSIP的编译使用应该是很简单的,其Install说明文档.doc
- tensorflow安装以及在Anaconda中安装使用
- 小任务:简单实现银行业务系统(附 ideal编辑器固定序列化版本方法)
- 【mosek.fusion】Primal SVM
- 国内智能硬件行业 调研报告
- python实现随机抽奖游戏
- 线程中常用的锁,有哪几种?
- 转置卷积详解(原理+实验)
- 中国第四个南极科考站
- 稍微好看点的登录页面html
- Params和Body的区别
- 2021 ICPC Gran Premio de Mexico 2da Fecha(C,D,G,I)
- 一对一视频聊天软件源码,Android AlertDialog 对话框
- 几种常用图像处理开源库简介及使用总结
热门文章
- Guide To Using The Gnosis Multisig Wallet
- LSTM简介以及数学推导(FULL BPTT)
- 【进阶】从linux到android,进程的方方面面
- 梳理各算法基础应用及场景
- Android View坐标系
- JZOJ 3617. 【ZJOI2014】力
- socket-tcp 、udp、rawIP
- QtGraphicView添加图元
- java 非静态语句块_静态初始化代码块与非静态初始化代码块之间的区别是什么?...
- 使用t-sql语句修改表中的某些数据及数据类型。_测试开发工程师数据库篇(一)...