##############################总结#######################

主要内容:

  • 1. 模块
  • 2. import
  • 3. from xxx import xxx

1.模块

  (1)模块的概述

  模块就是一个包含了py定义和声明的文件,文件名就是模块的名字.py后缀,我们写的所有的py文件都可以看成是一个模块

我们加载的模块一般分成4哥通常类别

  • 使用pyhton编写的py文件
  • 已被变异为共享库或者DLL或C或者C++的扩展
  • 包好的组模块的包.
  • 使用c编写并连接到python解释器的内置模块

(2)模块的使用缘由

使用模块是为了我们写的代码可以重用,不至于把所有的代码都写在一个文件内,当项目规模比较小的时候. 完全可以使用一个py搞定整个项目的开发,但是如果是一个非常庞大的项目,此时就必须要把相关的功能进行分离,方便我们日常维护,以及新项目的开发.

(2)模块的使用

导入模块有2中方式

  import 模块

  from xxx import xxxx

2.import

创建一个文件yitian

  1. print("片头曲,倚天屠龙........")
  2. main_person_man = "张无忌"
  3. main_person_woman = "赵敏"
  4.  
  5. bad_person_one = "成昆"
  6. bad_person_two = "周芷若"
  7.  
  8. def fight_on_light_top():
  9. print(main_person_man, "粉碎了",bad_person_one ,"的阴谋")
  10.  
  11. def fight_in_shaolin():
  12. print(main_person_man, "粉碎了", bad_person_two, "的阴谋")

打开另一个py文件

  1. import yitian
  2. print(yitian.main_person_man)#使用模块中定义好的名字
  3. print(yitian.bad_person_one)
  4.  
  5. yitian.fight_in_shaolin()#调用模块中的函数
  6. yitian.fight_on_light_top()

此时在这个跑一趟文件中 引入了yitian模块

注: 在Python中模块是不能够重复导入的,当重复导入模块时,系统会根据sys.modules来判断该模块是否已经导入了,如果已经导入,则不会重复导

  1. import sys
  2. print(sys.modules.keys()) # 查看导入的模块.
  3. import yitian # 导入模块. 此时会默认执行该模块中的代码
  4. import yitian # 该模块已经导入过了. 不会重复执行代码
  5. import yitian
  6. import yitian

导入模块(import之后)时候做了什么?

  • python解释器会先通过 sys.modules来判断该模块是否已经导入了该模块. 如果已经导入了则不再导入.
  • 为导入的模块创立新的名称空间
  • 在新创建的名称空间中运行该模块中的代码
  • 创建模块的名字,并使用该名称作为该模块在当前模块中引用的名字.
  1. import yitian
  2. print(globals())
  3. #{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000018141DE4A90>,
  4. # '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/Python_workspace/day 025/金庸.py', '__cached__': None,
  5. # 'yitian': <module 'yitian' from 'E:\\Python_workspace\\day 025\\yitian.py'>}

注意. 由于模块在导入的时候会创建其自己的名称空间,所以,我们在使用模块中的变量的时候一般是不会产生冲突的

  1. import yitian
  2. main_person_man="萧峰"
  3. def fight_in_shaolin():
  4. print(main_person_man+"大战扫地僧")
  5. print(yitian.main_person_man) #张无忌
  6. print(main_person_man) #萧峰
  7.  
  8. yitian.fight_in_shaolin() #张无忌粉碎了周芷若的阴谋
  9. fight_in_shaolin() #萧峰大战扫地僧

注意. 在模块中使用global. 我们之前说global表示把全局的内容引入到局部,但是,这个全局指的是py文件,换句句话说. global指向的是模块内部. 并不会改变外部模块的内容 

  1. print("片头曲,倚天屠龙........")
  2. main_person_man = "张无忌"
  3. main_person_woman = "赵敏"
  4.  
  5. bad_person_one = "成昆"
  6. bad_person_two = "周芷若"
  7.  
  8. def fight_on_light_top():
  9. print(main_person_man+"粉碎了"+bad_person_one+"的阴谋")
  10.  
  11. def fight_in_shaolin():
  12. global bad_person_two
  13. bad_person_two = "战五渣"
  14. print(main_person_man+"粉碎了"+bad_person_two+"的阴谋")
  15.  
  16. # 调用方
  17. import yitian
  18. bad_person_two = "宋青书"
  19. yitian.fight_in_shaolin()
  20. print(yitian.bad_person_two) # 战五渣
  21. print(bad_person_two) # 宋青书,并没有改变当前模块中的内容. 所以模块内部的 global只是用于模块内部

特别特别要注意:如果我们在不同的模块中引入了同一个模块. 并且在某一个模块中改变了被引入模块中的全局变量,则其他模块看到的值也跟着边,原因是python的模块只会引入一次,大家共享同一个名称空间

  1. if __name__ == '__main__':
  2. yitian.main_person_man = "灭绝师太" # 此时, 只有从该模块作为⼊口运行的时候才会把main_person_man设置成灭绝师太
  3. print("哇哈哈哈哈哈") # 只有运行该模块才会打印. import的时候是不会执行这里的代码的

我们还可以对导入的模块进行重新命名:

  1. import yitian as yt # 导入yitian. 但是名字被重新命名成了yt. 就好比变量赋值一样. a = 1 b = a

一次可以引入多个模块

  1. import time, random, json, yitian

  正确的导入模块的顺序:       

  • 所有的模块导入都要写在最上面,这是最基本的           
  • 先引入内置模块           
  • 再引入扩展模块           
  • 最后引入你自己定义的模块

3. from xxx import xxx

当一个模块中的内容过多的时候. 我们可以选择性的导入要使用的内容. 

  1. from yitian import fight_in_shaolin
  2. fight_in_shaolin()

此时是可以正常运行的. 但是我们省略了之前的模块,函数() 直接函数()就可以执行了, 并且from语句也支持行语句导入多个内容.

  1. from yitian import fight_in_shaolin, fight_on_light_top, main_person_man fight_in_shaolin()
  2. fight_on_light_top()
  3. print(main_person_man)

同样支持as

  1. from yitian import fight_in_shaolin, fight_on_light_top, main_person_man as
  2. big_lao
  3. fight_in_shaolin()
  4. fight_on_light_top()
  5. print(big_lao)

最后. 看一下from的坑,当我们从一个模块中引入一个变量的时候,如果当前文件中出现了重名的变量时. 会覆盖掉模块引入的那个变量.

所以,不要重名 切记. 不要重名! 不仅是变量量名不要重复,我们自己创建的py文件的名字不要和系统内置的模块重名.否则,引入的模块都是python内置的模块. 切记, 切记. 

python 包和模块间的引入的更多相关文章

  1. python 模块间的引入

    转载来自: https://www.cnblogs.com/whitemouseV2-0/p/9925344.html https://www.cnblogs.com/whitemouseV2-0/p ...

  2. python包-logging-hashlib-openpyxl模块-深浅拷贝-04

    包 包: # 包是一系列模块文件的结合体,表现形式是文件夹,该文件夹内部通常会包含一个__init__.py文件,本质上还是一个模块 包呢,就是前两篇博客中提到的,模块的四种表现形式中的第三种 # 把 ...

  3. python 包和模块

    一. 模块 使用内置函数vars()可以查看当前环境下有哪些对象(变量.函数.类) from 模块 import *: 不会导入以下划线开头的对象 只会导入__all__中定义了的对象(__all__ ...

  4. Python 包、模块、函数、变量作用域

    Python 项目的组织结构 - 包 -- 模块 --- 类 ---- 函数.变量   Python是利用包和模块来组织一个项目的.   包: 包的物理表现是一个文件夹,但是一个文件夹却不一定是个包, ...

  5. 关于python包,模块,.pyc文件和文件导入理解

    参考文献 一.包 包是一个文件夹,用来存放模块和子包. 包里一般会有一个__init__.py的文件(也可以没有). 包里会有一个__pycache__文件夹,存放.py文件经解释器解释后的中间字节码 ...

  6. python包与模块

    Python基础-包与模块 摘要 为重用以及更好的维护代码,Python使用了模块与包:一个Python文件就是一个模块,包是组织模块的特殊目录(包含__init__.py文件). 模块搜索路径,Py ...

  7. python包与模块导入

    一 .module 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py".".pyo".".pyc&quo ...

  8. Pycharm 导入 Python 包、模块

    1.点击File->settings 2.选择Project Interpreter,点击右边绿色的加号添加包 3.输入你想添加的包名,点击Install Package 4.可以在Pychar ...

  9. Python(五) 包、模块、函数与变量作用域

    一.while循环与使用场景 CONDITION=1 while CONDITION <=5 : CONDITION +=1 print("hello") else: pri ...

随机推荐

  1. AtcoderARC062F Painting Graphs with AtCoDeer 【双连通分量】【polya原理】

    题目分析: 如果一个双连通分量是简单环,那么用polya原理计数循环移位即可. 如果一个双连通分量不是简单环,那么它必然可以两两互换,不信你可以证明一下相邻的可以互换. 如果一条边是桥,那么直接乘以k ...

  2. 洛谷P1216数字三角形题解

    题目 这道题是一个典型的DP,可以用倒推,顺推的方法,来解这道题.当然用不同的方法他的循环次序是不一样的,所以我们一定要深刻地理解题目的大意,再采用状态转移方程与边界每次求出最优解,并记录循环一遍后就 ...

  3. Flask 构建微电影视频网站(三)

    搭建后台页面 视图函数位于admin文件夹下, app/admin/views.py 管理员登录页面搭建 视图函数 @admin.route('/') def index(): return '后台主 ...

  4. scrapy爬取知乎问答

    登陆 参考 https://github.com/zkqiang/Zhihu-Login # -*- coding: utf-8 -*- import scrapy import time impor ...

  5. 【XSY2484】mex 离散化 线段树

    题目大意 给你一个无限长的数组,初始的时候都为\(0\),有3种操作: 操作\(1\)是把给定区间\([l,r]\)设为\(1\): 操作\(2\)是把给定区间\([l,r]\)设为\(0\): 操作 ...

  6. LOJ #2142. 「SHOI2017」相逢是问候(欧拉函数 + 线段树)

    题意 给出一个长度为 \(n\) 的序列 \(\{a_i\}\) 以及一个数 \(p\) ,现在有 \(m\) 次操作,每次操作将 \([l, r]\) 区间内的 \(a_i\) 变成 \(c^{a_ ...

  7. Hdoj 1233.还是畅通工程 题解

    Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直 ...

  8. 【转】使用STM32F4的CCM内存

    我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?网上这个资料还真的很少,今天我就给大家分享一下,献给 ...

  9. Eclipse Memory Analyzer(MAT)使用

    https://user.qzone.qq.com/731573705/blog/1436389384 Eclipse Memory Analyzer(MAT)使用  一.OutOfMemoryErr ...

  10. [CTSC2010]性能优化

    [CTSC2010]性能优化 循环卷积快速幂 两个注意点:n+1不是2^k*P+1形式,任意模数又太慢?n=2^k1*3^k2*5^k3*7^k4 多路分治!深刻理解FFT运算本质:分治,推式子得到从 ...