"""
1. 什么是模块
    模块是一系列功能的集合体,分为三大类
        (1)内置模块
        (2)第三方模块

        (3)自定义模块
                一个Python文件本身就是一个模块,文件名m.py,模块名叫m

                ps:模块的四种形式
                    1 使用Python编写的.py文件
                    2 已被编译为共享库或dll的c或c++扩展
                    3 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
                    4 使用c编写并链接到Python解释器的内置文件

2. 为何要用模块
    (1)内置与第三方模块拿来就用,无需定义,可以极大地提升自己的开发效率
    (2)自定义模块
            可以将程序的各部分功能提取出来放到一个模块中共享使用
            减少了代码冗余,程序组织结构更加清晰


"""

# 导入模块

import foo

# 首次导入模块会发生3件事
#   1.执行foo.py
#   2.产生foo.py的名称空间,将foo.py运行过程中产生的名字都丢丢到foo的名称空间中
#   3.在当前文件中产生一个名字foo,该名字指向2中产生的名称空间

# 引用
# 强调1:模块名.名字
print(foo.x)

# 强调2:无论查看还是修改,都是以原模块为基准,与调用位置无关
x = 3333
print(foo.x)


# Python模块导入规范:导入顺序
# 内置模块
# 第三方模块
# 自定义模块

# import ... as ... 重命名
------------------------------------

# from...import...导入模块
# import导入模块在使用时必须加前缀"模块."
# 优点:肯定不会与当前名称空间中的名字冲突
# 缺点:加前缀会显得麻烦

# from...import...导入也发生了三件事
# 1.产生一个模块的名称空间
# 2.运行foo.py将运行过程中产生的名字都丢到模块的名称空间中
# 3.在当前名称空间拿到一个名字,该名字与模块名称空间中某一内存地址

# from...import...import导入模块在使用时不用加前缀"模块."
# 优点:代码更精简
# 缺点:容易与当前名称空间混淆

from foo import x
from foo import change
----------------------------------

# 模块的搜索路径优先级
# 无论是import还是from...import...在导入模块时都涉及到查找优先级问题
# 1.内存(内置模块)
# 2.按照sys.path中存放的文件的顺序依次查找要导入的模块

import sys
# 值为一个列表,存放了一系列的文件夹
# 其中第一个文件夹是当前执行文件所在的文件夹
print(sys.path)

# 临时追加路径
# sys.path.append(r'路径')