python基础day19 模块

模块的简介

python语言

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

什么是模块

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

为什么要用模块

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

模块的来源

1. 内置的(python解释器自带的,直接用,eg:time)

2. 第三方的(别人写好的放在网上的,我们要先用需要先下载)

3. 自定义的(我们自己写的,以后也可以上床到网上去)

模块的存在形式

ps:总共有4种形式,但是目前只需要知道2种即可

1. 我们自己写的单个py文件(一个py文件就是一个模板)

2. 包:

  其实就是一系列模块的结合体,其实就是文件夹

  在python3种的包,一般里面会有一个__iter__.py文件

ps:

以后在编写一些复杂项目的复杂功能的时候,我们可以先想想看有没有可以使用的模块,有就直接拿来用,没有就只能自己写了。

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  # 连续导入

首次导入也会执行导入文件

导入多次,也只会执行一次

  发生了什么事?

    1. 运行执行文件,产生执行文件的全局名称空间

    2. 运行导入文件md.py,产生md文件的全局名称空间,然后把md中所有的名字都丢到md的全局名称空间中去

    3. 再执行文件中有一个变量money指向导入文件中money的空间地址

    4. 我们想要使用导入文件的money,直接用money即可,不再使用md.money了,此时,只是把导入文件的money导入到了执行文件,其他都没有

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

导入模块的扩展用法

# 1. 起别名
import testttttttttttttttttttttttttttttttttttttttttttttttttttt as t
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.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')

if __name__=='__main__'
    index()

循环导入

如果在你的程序里面出现了循环导入的问题,说明你的程序设计的不合理

我们遇到循环导入的问题必须处理掉,否则代码会报错,不能正常运行

如何解决循环导入的问题

  1. 把导入语句放到代码的最下面

  ps:虽然问题解决了,但是不推荐这样用,我们一般把导入语句都放在文件的开头

  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 15:30  吼尼尼痛  阅读(10)  评论(0)    收藏  举报