5 python的包、模块、函数及变量作用域
5.1 while、for及 break、continue基本用法
1 | """ |
for in range()可替代for循环:
1 | for num in range(1,10): |
5.2 包、模块及导入
追求高性能、封装性(可复用性)—抽象能力
包–模块–类—函数与变量
如果一个文件夹要成为一个包,那么这个文件夹要包含一个init.py文件(其本身也是个模块).
对于多个包、模块的相互调用,为了提高软件复用性,需要重复引用变量。所以,公用的东西应该提取放置在同一个模块里,方便引用,所以需要导入import功能。
import 导入:可直观看到导入的变量属于哪个模块
1、在同一个路径内:import module_name
举例如图:
2、在不同的路径内:import + 命名空间(文件夹名.模块名)
使用导入模块的变量:module_name(命名空间).变量明
避免命名空间过长,可利用as关键字进行简化 例:import t.c7 as m
注意,import不能直接导入变量,只能导入模块。
举例如图:
frmo导入模式:
5.3 init.py的用法
- 代码换行最好用() 也可以在末尾加上反斜杠\
示例如图:
- init.py 的作用:
①当包或该包下的模块,变量..被导入时,该文件自动执行。可以用来做包和模块的初始化;
举例如图:
②可以在init_.py文件中定义’’all‘’变量来定义该包下哪些模块可以被其它模块引用(from 包 import *),举例如图:
③可以利用init.py文件做批量导入
在子包的 init.py文件里导入需要的模块, 然后在上一级 import 子包名 进行模块的批量导入 ,注意 ::引用的时候注意命名空间 子包名.def;
示例如图:
- init.py文件名 就是包名
注意事项
a.包和模块是不会重复导入的;
b.不能循环导入包或模块,举例如图(需注意还有多包循环导入):
k1导入k2时,会自动执行k2里的所有代码.
5.4 普通模块内置变量
常用的有四种:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16"""
This is k3.py
"""
p = 1
d = 's'
lls = [1,'23',(1,2,3)]
info = dir() # 将模块中的所有变量以一个列表展现出来
print(info)
# 比较重要的四个Python内置变量:
# '__name__', '__package__','__doc__', '__file__'
#cmd下输出结果为:
g:\Python\Demon2\seven\k>k3.py
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'd',
'lls', 'p']
其中doc是模块说明,举例如图:
5.5 入口文件和普通模块内置变量的区别
入口文件(程序执行文件)的内置变量,特点是:
a. name 为 main ;
b. package 不属于任何包;
c. file 的值取决于入口文件在什么位置被执行
举例如下:
5.6 name的经典应用
a. 当查看某一个类或某一个模块中的所有变量时,可以使用dir()
b. name 可用来判断一个.py是被当做一个入口文件使用,还是被当做一个普通模块使用。
经典用法举例:
c. (利用doc做项目的自动文档生成工具)
python中的普通模块必须要有一个包,当想把一个可执行文件当做一个普通模块运行时,可使用-m参数,如下:
python -m 命名空间.模块名
(python 模块名 或 python window路径名\模块名)
举例如图:
5.5 相对导入和绝对导入
顶级包的概念和入口文件的位置相关, 与入口文件同级的包,就是该包下所有模块的顶级包。对于入口文件来说,不存在包的概念。
绝对导入/绝对路径: 从顶级包到被导入模块的完整路径;
相对导入:一个’.’表示当前包,两个’..’表示上一级包,’…’上上级包,以此类推。
举例如图:在m2.py中不可能直接导入pk3下边的模块,因为这超越了其顶级包pk2(当main.py作为入口文件时):
注意:
import不支持相对导入,from .. import .. 支持相对导入;
入口文件因为没有包的概念,故入口文件不能使用相对导入(因为作为入口文件name会自动改变为 main, 而相对导入是根据name来确定路径的),除非返回入口文件的上一层,用python -m 将入口文件作为普通模块进行运行,则可以进行相对导入;
使用相对导入不要超出顶级包(入口文件同级的都不能使用相对导入,需要放到包下面去)