博客整理来源: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.模块和包相关推荐

  1. python笔记6 模块与包 程序开发规范 包 re sys time os模块

    模块与包 python 模块首引用加载到内存,如果再次引用此模块,直接从内存中读取. python文件分为:执行文件(解释器运行的文件),被引用文件(import) 模块引用一共发生了3件事: 1.他 ...

  2. python之路——模块和包

    一.模块 1.什么是模块? 常见的场景:一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1.使用Python编 ...

  3. Python中的类、模块和包究竟是什么?

    Python培训教程:Python中的类.模块和包究竟是什么?在Python和其他编程语言中,都有类似或相同的概念,如对象.类.模块.包,名称都是一样的,只不过会有细微的一些区别,正是因为有这些存在, ...

  4. python模块和包用法详解(__all__)

    1. 模块         Python 模块(Module),是⼀个 Python ⽂件,以 .py 结尾,包含了 Python 对象定义和Python语句.         模块能定义函数,类和变 ...

  5. python类、模块、包

    通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块.包目录下为首的一个文件便是 __init__.py.然后是一些模块文件和子目录,假如子目录中也有 _ ...

  6. python入门是哪个包_python入门(十):模块、包

    模块:py文件 包:目录,目录里面包含__init__.py,内容可以是空 里面可以包含多个模块文件,还可以包含子包 1.模块和包,可以很方便的提供给其他程序以复用 1) 利于组织复杂工程 我们写代码 ...

  7. python哪里下载import包-【Python实战】模块和包导入详解(import)

    1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...

  8. python哪里下载import包-详解python中的模块及包导入

    python中的导入关键字:import 以及from import 1.import import一般用于导入包以及模块. 不过有个小问题: (1)当导入的是模块的时候是可以直接可以使用模块内的函数 ...

  9. python 模块与包

    什么是模块? 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能.即一个模块就是一个包含了一组功能的python文件,比如spam.py,模块名为spam,可以通过import spa ...

最新文章

  1. 当我们做MVP产品时,我们到底在做什么?
  2. 2017-2018-1 201553334 实验五 通讯协议设计
  3. Linux无法解析hosts里面绑定域名的排查方法
  4. c远程连接mysql数据库_MySQL数据库远程连接开启方法
  5. java hibernate 插入数据_[Java教程]hibernate 返回新插入数据的Id
  6. iphone查看删除的短信_苹果删除的短信
  7. linux ortp 编译,Linux下oSIP的编译使用应该是很简单的,其Install说明文档.doc
  8. tensorflow安装以及在Anaconda中安装使用
  9. 小任务:简单实现银行业务系统(附 ideal编辑器固定序列化版本方法)
  10. 【mosek.fusion】Primal SVM
  11. 国内智能硬件行业 调研报告
  12. python实现随机抽奖游戏
  13. 线程中常用的锁,有哪几种?
  14. 转置卷积详解(原理+实验)
  15. 中国第四个南极科考站
  16. 稍微好看点的登录页面html
  17. Params和Body的区别
  18. 2021 ICPC Gran Premio de Mexico 2da Fecha(C,D,G,I)
  19. 一对一视频聊天软件源码,Android AlertDialog 对话框
  20. 几种常用图像处理开源库简介及使用总结

热门文章

  1. Guide To Using The Gnosis Multisig Wallet
  2. LSTM简介以及数学推导(FULL BPTT)
  3. 【进阶】从linux到android,进程的方方面面
  4. 梳理各算法基础应用及场景
  5. Android View坐标系
  6. JZOJ 3617. 【ZJOI2014】力
  7. socket-tcp 、udp、rawIP
  8. QtGraphicView添加图元
  9. java 非静态语句块_静态初始化代码块与非静态初始化代码块之间的区别是什么?...
  10. 使用t-sql语句修改表中的某些数据及数据类型。_测试开发工程师数据库篇(一)...