#当python文件被运行时 __name__的值为 __main__
#当python文件被当作模块导入时 __name__的值为python的文件的值
if __name__ __main__ :
print( 文件被执行 )
else:
print( 文件被导入 )
3、模块导入方式
#import ; from...import.....
#1、import导入模块在使用时必须加前缀 模块
#优点 肯定不会与当前名称空间中的名字冲突
#缺点 加前缀显得麻烦
#2、from...import...导入也发生三件事
#1、产生一个名称空间
#2、运行func.py将运行过程中产生的名字都丢到模块的名称空间中
#3、在当前名称空间拿到一个名字 该名字与模块命名空间中的某一个内存地址
from func import binary_search
#优点 代码更精简
#缺点 容易与当前命名空间混淆
4、模块的循环导入问题
#循环导入问题(无论那种方案都是垃圾 最好不要用)
#1、第一种方案
#m1.py
print( 正在输入m1 )
x a1
from m2 import y
#m2.py
print( 正在输入m2 )
y m2
from m1 import x
#2、第二种方案 推荐
#将导入语句放在函数里
print( 正在导入m1 )
def f1():
from m2 import y
pprint(y)
x m1
5、搜索模块的路径与优先级
#搜索模块的路径与优先级
#1、无论是import还是from...import在导入模块时都涉及到查找问题
#优先级
#1、内存 内置模块
#2、从硬盘找 按照sys.path中存放的文件顺序依次寻找要导入的模块
import sys
#值为一个列表 存放了一系列的文件夹
#其中第一个文件夹是当前执行文件所在的文件夹
print(sys.path)
#3、了解 sys.modules查看已经加载到内存中的模块
import sys
print(sys.modules)
#使用sys.path到模块
import sys
sys.path.append(r D:pycharmday3func.py )
import func
func.binary_search()
6、编写一个模块的规范
#编写一个模块的规范
the module is used to... #模块的文档描述
import sys #导入模块
x 1 #定义全局变量
class foo: #定义类 并写好类的注释
class foo is used to...
pass
def test() #定义函数 并写好函数注释
function test is used to..
pass
if __name__ __main__ : #主程序
test() #在被当作脚本执行时 执行此处代码
7、包
#包
#1、包就是一个包含有__init__.py文件的文件夹
#2、为何要有包
#的本质是模块的一种形式 包是用来当作模块导入
#作为模块的设计者 模块的功能越来越多时 需要很好管理自己的模块 以文件的方式管理 但还需要暴露给使用者还应该是一个模块
#3、包的导入
#以下导入都是在包内的__init__.py文件内的导入
#绝对导入 以包的文件夹作为起始导入点
from w.a.b import xxx
import w.a.b
#其中点的左边都必须是包
#相对导入:仅限于包内使用 不能跨出包(包内模块之间的导入推荐相对导入)
#. 代表当前文件夹
#..:代表上一层文件夹
from .m1 import f1
from ...m1 import f1
8、软件开发的目录规范
#软件开发的目录规范
#bin 该目录放一些可执行文件
#conf 项目的配置文件
#db 存放数据库相关的操作代码
#lib 存放程序常用的库 模块
#core 存放核心代码的逻辑
#如何获取父级模块
import os
import sys
base_DIR os.path.dirname(os.path.dirname(__file__))
sys.path.append(base_DIR)