模块与包&常用模块
Posted xiaomogula
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块与包&常用模块相关的知识,希望对你有一定的参考价值。
一、模块的使用
模块定义:一系列功能的集合体
分为三大类:1.自定义模块
2.内置模块(比如 time,os,sys)
3.第三方模块
模块的表现形式:
1.使用python编写的py文件
2.已被编译为共享库或DLL的C或C++扩展
3.把一系列模块组织到一起的文件夹(ps:文件夹下有一个__init__.py文件,该文件夹称为包)
4.使用C编写并链接到python解释器的内置模块
为什么要用模块:
1.可以拿来内置、第三方的模块,然后直接使用,这种拿来就用的方式,会极大的提升开发效率
2.将程序中共用的一些功能组织到一个文件中,然后程序各部分组件可以重用该文件中的功能。
优点是 减少代码冗余,增强程序的组织结构性与可维护性
怎么用模块:
一个py文件就是一个模块,如果文件名为modules.py,模块名则为modules
ps:模块的使用必须搞清楚谁是执行文件,谁是被导入的模块
1、模块的使用之import
#:coding:utf-8 #modules.py print(‘from the modules.py‘) money=1000 def read1(): print(‘modules模块.read1‘,money) def read2(): print(‘modules模块.read2‘) read1() def change(): global money money=0
import modules money=111111111111 print(modules.money) print(modules.read1) print(modules.read2) print(modules.change) modules.money=2222 print(money)###结果为money=111111111111 modules.read1()#modules模块.read1 2222 #这个更改成功modules.money=2222 def read1():#此处定义read1 print(‘run.py中的read1‘) modules.read1()#执行结果仍为modules模块.read1 2222 money=20000000 modules.change()#此处执行了modules中change函数 print(money)###此处为上述money=20000000 print(modules.money)##结果为0 import modules as spam ##可以as 起个别名 print(spam.money) #依旧执行成功 结果为0
执行文件:run.py 被导入模块是:modules.py
首次导入模块会发生三件事:
1、创建一个模块modules.py的名称空间
2、执行模块对应的文件modules.py,将产生的名字丢到模块的名称空间中
3、在当前执行文件的名称空间中拿到一个名字modules,该名字就是指向模块modules.py的名称空间的
import modules# modules=modules.py名称空间的内存地址
ps:
在当前执行文件中引用模块中的名字语法为:modules.名字,必须加上modules.作为前缀
modules.名字相当于指名道姓地跟某一个名称空间要名字,根本不会与当前执行文件的名字冲突
2、模块的使用之 from import
#modules.py # print(‘from the modules.py‘) __all__=[‘money‘,‘read1‘] money=1000 def read1(): print(‘spam模块.read1‘,money) def read2(): print(‘spam模块.read2‘) read1() def change(): global money money=0
from spam import money,read1,read2,change # def read1(): print(‘run.py.read1‘) read1() # run.py.read1 read2() # spam模块.read2 ------------> spam模块.read1 1000 from spam import money as my print(my) #1000 # =========================================== from spam import * # * 会检索被导入模块中的__all__指定的名字,如果没有该变量那默认导入所有 print(money) #1000 print(read1) # <function read1 at 0x0000000001EB1C80> # print(read2) #会报错 # print(change) #会报错
执行文件:run.py 被导入模块: spam.py
首次导入模块会发生三件事
1、创建一个模块spam.py的名称空间
2、执行模块对应的文件spam.py,将产生的名字丢到模块的名称空间中
3、在当前执行文件的名称空间中拿到一个名字money,该名字就是指向模块spam.py的名称空间的那个money
from spam import money,read1,read2,change
两种导入方式的对比
相同点:函数的作用域关系在定义阶段就规定死了,与调用位置无关
from import
优点:可以不用加前缀而直接引用名字,更简洁
缺点:容易与当前执行文件中的名字冲突
import
优点:指名道姓跟某一个名称空间要名字,肯定不会与当前名称空间中的名字冲突
缺点:必须加上前缀
3、循环导入的问题
# print(‘正在导入m1‘) # # x=‘m1.py‘ # # from m2 import y # print(‘正在导入m1‘) def f1(): from m2 import y,f2 print(y) f2() x=‘m1.py‘
# print(‘正在导入m2‘) # # y=‘m2‘ # # from m1.py import x print(‘正在导入m2‘) def f2(): from m1 import x print(x) y=‘m2.py‘
### run.py # 1、创建m1.py的名称空间 # 2、执行m1.py的代码,将产生的名字丢到m1.py的名称空间中 # 3、在当前执行文件的名称空间中拿到一个名字m1 import m1 m1.f1()
4、模块的搜索路径
模块搜索路径优先级:
内存 --------> 内置的模块 --------> sys.path(环境变量)
5、区分python文件的两种用途
一个python文件有两种用途:
1、可以执行运行:__name__ == ‘__main__‘
2、可以被当做模块导入:__name__ == ‘模块名‘
if __name__ == ‘__main__‘:
以上是关于模块与包&常用模块的主要内容,如果未能解决你的问题,请参考以下文章
三阶段课程——Day05(模块系统:自定义模块内置模块第三方模块;npm与包:包管路工具常用命令package.json包的分类包加载机制全局包)