模块

模块的简介

背景:


python语言
	起源于Linux系统,调包侠(贬义>>>褒义)

1. 什么是模块?

  
模块:就是一系列功能的结合体(模块里面提前开发好的一堆功能而已)

2. 为什么要用模块?


提高开发效率(别人提前开发好的一些功能,我们直接拿来使用节省了我们自己的时间和精力)
# 站在巨人的肩膀上

3. 模块的来源:


1. 内置的(python解释器自带的直接用,eg:time)
2. 第三方的(别人写好的放在网上的,我们要想用,必须先下载才能用)
3. 自定义的(我们自己写的,以后也可以传到网上去)

4. 模块的存在形式:


# 总共有4种形式,但是,我只需要你知道2种就行
1. 我们自己写的单个py文件(一个py文件就是一个模块)
2. 包:
	其实就一系列模块的结合体,其实就是文件夹
# 在python3中的包,一般里面会有一个__init__.py文件
      

import句式

前提:


"""学习模块的导入必须先搞清的一个问题:谁是执行文件,谁是导入文件?"""
import md  # import 模块名字(文件名), 一定不要加文件的后缀,只写文件名字即可

应用、方法:

"""
首次导入文件,会执行导入文件的代码
导入文件不管你导入几次,都只执行一次
    导入文件的过程发生了什么事?
        1. 运行执行文件,产生执行文件的全局名称空间
        2. 运行md.py文件,会产生md文件的全局名称空间,把md文件里的名字都丢到md的全局名称空间去
        3. 在执行文件中有一个md的变量,指向导入文件的空间地址
        4. 以后我们在执行文件中就可以用md来点出导入文件中的名字
    导入文件之后,以后在用导入文件中的名字,只需要使用md点语法的形式点出来就可以
    不会与执行文件中的名字发生冲突,因为我们是指名道姓的取值
"""

# print(md.name)
money = 999
# print(money)
# print(md.money) # 指名道姓的取值
# def read1():
#     print('read1')
# md.read1()
# read1()

md.change()
print(money)

from...import...句式

# from md import money
# from md import read1
# from md import change

from md import money,read1,read2  # 连续导入

小结:

"""
from...import...句式
    首次导入也会执行导入文件
导入多次,也会执行一次
  发生了什么事?
      1. 运行执行文件,产生执行文件的全局名称空间
      2. 运行导入文件md.py, 产生md文件的全局名称空间,然后把md中所有的名字都丢到md的全局名称空间中去
      3. 在执行文件中有一个变量money指向导入文件中money的空间地址
      4. 我们要想使用导入文件的money,直接用money即可,不再使用md.money了,此时,只是把导入文件的money导入到了执行文件,其他都没有

导入文件之后,就有可能发生执行文件中的名字和导入文件中的名字产生冲突,此时,会使用当前执行文件中的名字
"""

导入模块的扩展用法

1. 起别名

起别名需用关键字as来定义
import testttttttttttttttttttttttttttttttttttttttttttttttttttt as t
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(t.name)

from testttttttttttttttttttttttttttttttttttttttttttttttttttt import name as n
print(n)

2. 连续导入


	# import md
    # from md import money,read1,read2
    # from md import money
    # from md import read1

    import md, time, os, sys
    import md
    import time
    import sys
    import os

3. 通用导入


	# from md import money, read1, read2, change,
	# from md import *
	__all__=['money', 'read1'] 

判断文件类型


"""学习模块的时候,必须要清楚执行文件和导入文件"""
区分执行文件和导入文件
__name__:"__main__"

print(__name__) # 该文件只想让他做执行文件,不让被导入使用,怎么办呢

def index():
    print('from index')

# index()
if __name__ == '__main__':
    index()

循环导入


"""如果在你的程序里面出现了循环导入的问题,说明你的程序设计的不合理!"""
# 我们遇到循环导入的问题必须处理掉,否则代码会报错,不能正常运行

如何解决循环导入的问题
	1. 把导入语句放到代码的最下面
    	# 虽然问题解决了,但是不推荐,我们一般把导入语句都放在文件的开头
    2. 函数式(了解)
    	

模块的查找顺序(重要)

"""
	1. 先从内存中查找
	2. 再从内置模块中查找
	3. 从环境变量sys.path中查找(重要)
	4. 如果以上都找不到,则报错!
"""

sys.path列表中的第一个元素永远是:当前文件所在的路径
sys.path列表中的第二个元素是:项目的路径,他是pycharm给你加的

如何解决自定义的模块查找不到的问题:


1. 把路径添加到sys.path中去
	sys.path.append(r'D:\python26\day19\aaa')
		import m3
		print(m3.name)

2. from 模块1.模块2.模块3 import...句式
      # from aaa.bbb import m3
      from aaa.bbb.ddd import m3
      print(m3.name)
    	
posted @ 2023-06-06 17:33  毓见  阅读(40)  评论(0)    收藏  举报