持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流
作者简介:
- CSDN C/C++领域新星创作者blog.csdn.net/chuxinchang…
- 掘金LV3用户 juejin.cn/user/138142…
- 阿里云社区专家博主,星级博主,技术博主 developer.aliyun.com/profile/exp…
- 华为云云享专家 bbs.huaweicloud.com/community/m…
主要内容:
理解模块和包的基本概念 理解模块的导入过程 熟悉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 , 通过这样的层级结构, 将函数的名字组织起来, 就可以有效的避免命名冲突.