五、python的包、模块、函数及变量作用域

5 python的包、模块、函数及变量作用域

5.1 while、for及 break、continue基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
"""
1.while 循环
其主要使用场景:递归 其他一般用for
2.for循环
其主要使用场景:遍历、循环 序列、集合或字典等
"""
# while 循环
count = 0
while count <= 2:
count += 1
print(count)
else:
print('over,last count is : ' + str(count))

# for 循环
cats = [['mini','2kg','blue',1.2],['huahua','1kg','black',1],['kitty','3kg','white',3]]
for cat in cats:
print(cat)
for info in cat:
if info == cat[-1]:
print(info)
else:
print(info,end=',')

# continue

trees = ['松树','杨树','白桦树','榕树']
for tree in trees:
if tree == '白桦树':
continue # 跳过 白桦树 继续往下执行
print(tree)
else:
print('over')
# break
trees2 = ['松树','杨树','白桦树','榕树']
for tree in trees2:
if tree == '白桦树':
break # 跳过 白桦树 且不再继续往下执行
print(tree)
else:
print('over')
for in range()可替代for循环:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for  num in range(1,10):
print(num,end = '|')
print('\n')

for sn in range(1,10,3):
print(sn)

for st in range(10,0,-2):
print(st,end = '、')

al = [1,2,3,4,5,6,7,8] # for in range 与序列结合使用
for a in range(0,len(al),2):
print(al[a],end = '|')

b = al[0:len(al):2] # 三元切片: start,end,step
print(b)

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的用法

  1. 代码换行最好用() 也可以在末尾加上反斜杠\
    示例如图:
  1. init.py 的作用:
    ①当包或该包下的模块,变量..被导入时,该文件自动执行。可以用来做包和模块的初始化;
    举例如图:

②可以在init_.py文件中定义’’all‘’变量来定义该包下哪些模块可以被其它模块引用(from 包 import *),举例如图:

③可以利用init.py文件做批量导入
在子包的 init.py文件里导入需要的模块, 然后在上一级 import 子包名 进行模块的批量导入 ,注意 ::引用的时候注意命名空间 子包名.def;
示例如图:

  1. 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. namemain ;
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 将入口文件作为普通模块进行运行,则可以进行相对导入;
使用相对导入不要超出顶级包(入口文件同级的都不能使用相对导入,需要放到包下面去)

分享到