python模块初识-1

77 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情


大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:



主要内容:

理解模块和包的基本概念 理解模块的导入过程 熟悉sys模块和os模块中的一些重要操作


Python 模块初识

当代码量比较大的时候, 我们最好把代码拆分成一些有组织的代码片段. 每个代码片段里面包含一组逻辑上有关联的函数或者类. 每一个片段里放在一个独立的文件中. 这样的片段就称为模块(module) 使用 import 可以在一个Python文件中引入其他的模块.

对比C语言的 include

回忆我们C语言中, 如果一个文件想使用其他文件的功能, 通过 #include 的方式来引入一个头文件. C语言的 #include 本质上是文本替换. 因此可能会导致一系列的问题 (重复包含, 包含顺序相关).

所以通常加上:

#pragma once    //防止头文件重复包含

模块也是对象

Python的模块则避免了C语言中的这些问题. import 实际上是创建了一个模块对象. 通过这个对象来访问 模块中的具体方法.

import os
print(type(os)) #<class 'module'>  模块
print(id(os))   #2191830213400  有id,所以也是一个对象

模块的搜索路径

我们尝试 import 一个模块名时, Python解释器必须要知道模块文件的路径

例如, 我们此处有一个add.py, 那么对应的模块名就是add (去掉后缀)


sys 是python标准库自带的模块,一些和python解释器相关的模块

Python从sys.path中查找模块.

我们可以看到, sys.path其实是一个列表. 里面里面的内容是Python的一些默认搜索路径. 如果我们想再加 入一些新的路径, 直接修改sys.path即可. ->sys.path.append('....')

import sysq 
print(sys.path)
#执行结果:
['E:\Python文件存储', 'E:\pythonProject1', 'C:\Users\Mango\AppData\Local\Programs\Python\Python37\python37.zip', 'C:\Users\Mango\AppData\Local\Programs\Python\Python37\DLLs', 'C:\Users\Mango\AppData\Local\Programs\Python\Python37\lib', 'C:\Users\Mango\AppData\Local\Programs\Python\Python37', 'C:\Users\Mango\AppData\Local\Programs\Python\Python37\lib\site-packages']
​
import sys
for line in sys.path:
    print(line)
#执行结果:
E:\Python文件存储
E:\pythonProject1
C:\Users\Mango\AppData\Local\Programs\Python\Python37\python37.zip
C:\Users\Mango\AppData\Local\Programs\Python\Python37\DLLs
C:\Users\Mango\AppData\Local\Programs\Python\Python37\lib
C:\Users\Mango\AppData\Local\Programs\Python\Python37
C:\Users\Mango\AppData\Local\Programs\Python\Python37\lib\site-packages

import语句不一定非要写在源代码文件的最开始(推荐写在最上面)

如果在多个目录中, 都存在相同名字的模块, 这个时候Python解释器会从前往后顺序查找, 把找到的第一个 匹配的结果进行加载.


理解 "命名空间"

名字冲突问题: 如果一个项目中的代码量很大, 那么很可能函数/类的名字会冲突.

C语言采用的方案是,给函数名加一个又丑又长的前缀

void Huichuan_AdServer_Strategy_IndexAccessor_Load()

C++中使用命名空间来解决这个问题

namespace Huichuan {
    namespace AdServer {
        namespace Strategy {
            namespace IndexAccessor {
                void Load()
            }
        }
    }
}

Python的模块也相当于是命名空间. 例如os.path.exists , 通过这样的层级结构, 将函数的名字组织起来, 就可以有效的避免命名冲突.