python基础:包
目录
一、初识模块
1.概念
一个包含python代码的文件就是一个模块
使用模块的作用:
1.现在程序开发文件比较大,都放在一个文件中维护不方便,拆分成多个文件方便维护与管理
2.模块可以增加代码的重用率
2.创建模块
模块本身就是一个文件,所有py代码都可以在文件中直接书写。
不过我们开发共用模块时,最好在模块中书写以下内容。
变量 |
模块中的属性值 |
函数 |
单独的功能 |
类 |
相似功能组合 |
模块测试代码 |
临时使用,被导入时不会执行 |
先创建一个model1.py模块,如下:
-
print('哈哈哈,呵呵呵')
-
name='zs'
-
def say_hello():
-
print('小星星')
-
print('xxxx')
3. 导入模块
注意:
1.第一次导入模块的时候,模块会从上到下执行一遍
-
#导入模块
-
import model1
-
model1.say_hello()#调用model1中的say_hello函数
2.模块可以导入多次,就不会执行模块中的内容, 直接在内存中找,不会再重新加载,节省内存
-
#第二次导入模块
-
import model1
-
model1.say_hello()
二、模块导入的原理
1. 模块导入会将要导入的文件执行一遍
2. 导入模块的名称就是我们定义的脚本或包的名称
3. 我们导入模块的过程总结就是:在指定的范围内搜索指定名称的python脚本或者包,将其运行,获取其中的方法
三、模块的导入方式
1.import 模块名
直接导入模块
-
import model1
-
model1.say_hello()#调用model1中的say_hello函数
2.import 模块名 as 别名
如果模块的名称太长,我们可以给这个模块起一个别名
-
import model1 as m
-
m.say_hello()
-
print(m.name)
如果要导入名称相同但功能不同的两个模块,便将模块分别取一个别名用来区分两个模块
3.一行导入多个模块
(1)第一种
不推荐,但经常用,比较方便
import model1,model2
(2)第二种
-
import model1
-
import model2
-
print(model1.name)
-
print(model2.age)
4.from......import......局部导入
当使用模块中的部分功能的时候,就可以使用局部导入方式。
格式:from 模块 import 某个函数或者类。
作用:直接导入模块中的某个函数或者某个类或变量
-
#导入test函数,只能使用test函数,不能使用其他函数
-
from model2 import test
-
#调用函数
-
test()#调用的是model2中的test函数
注意:
如果当前文件中的变量或者函数名称和模块中的名称重复,会使用就近原则
-
#导入test函数,只能使用test函数,不能使用其他函数
-
from model2 import test
-
#调用函数
-
test()#调用的是model2中的test函数
-
#就近原则
-
def test():
-
print('azyazyazy')
-
test()#调用的是该模块中的test函数
5.支持导入多行
格式:from 模块名 import 功能1,功能2,功能3
-
from model2 import test,test_2
-
test()
-
test_2()
6.from......import......as 别名
当导入的模块和当前模块中的名称相同的时候可以起别名进行区分
-
def test():
-
print('azyazyazy')
-
test()
-
from model2 import test as t#给test起一个别名
-
t()#通过别名 调用函数
7.from 模块 import *
格式:from my_module import *
直接导入模块中的所有方法和类和变量
把my_module中所有的不是以下划线(_)开头的名字都导入到当前位置,
大部分情况下我们的python程序不应该使用这种导入方式,
因为*你不知道你导入什么名字,
很有可能会覆盖掉你之前已经定义的名字,而且可读性极其的差。
* 不清楚导入的究竟是什么,可读性差,容易被覆盖
*代表所有
-
from model2 import *
-
age=20
-
test()
-
print(age)
注意:
如果model2.py中的名字前加_,如_name,在使用from model2 import *时,_name不能被导入
解决办法:
__all__属性
格式:__all__ = [变量1,变量2 ...]
设置导入模块的功能
__all__=['money','read1']
这样在另外一个文件中用from my_module import *就这能导入列表中规定的两个名字
该属性只在from 模块名 import * 情况下使用,其他的都不用使用可正常导入(如:_name)的功能
四、模块的搜索路径
当你导入一个模块,Python解析器对模块位置的搜索顺序是:
1、当前目录
2、如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
由sys模块的sys.path方法来规定
-
import sys
-
ret=sys.path
-
print(ret)#返回的为列表
因为sys.path返回的数据类型是列表
1、列表可以修改、我们导入的范围也可以通过修改sys.path这个列表获得暂时的修改。例如通过 sys.path.append()添加目录,导入额外目录的模块。
2、列表是有序的,当搜索的过程当中,在第一个路径下搜索到了,就停止搜索。而且sys.path第一个路径是脚本的当前路径,所以禁止大家将自己的脚本命名成模块的名称。
注意:自己模块命名的时候不能和系统的模块名称相同
五、.pyc临时文件
为了提高加载模块的速度,python解释器会在__pycache__目录中下缓存每个模块编译后的版本,之后,再次被导入时,实际上导入的是这个.pyc的临时文件。
(1) (2)
(3) (4)
六、把模块当做脚本运行
我们可以通过模块的全局变量__name__来查看模块名:
1.当做脚本运行
__name__ 的值 等于'__main__'
直接右键Run 'test',执行脚本文件
2.当做模块导入
__name__的值等于模块名
作用:
用来控制.py文件在不同的应用场景下执行不同的逻辑
格式:
if __name__ == '__main__':
pass
当测试代码
-
if __name__ == '__main__':
-
print('恭喜过关,撒花撒花~~~')
当程序入口
-
def hs_1():
-
print('我')
-
def hs_2():
-
print('你')
-
def hs_3():
-
print('我和你')
-
if __name__ == '__main__':
-
hs_1()
-
hs_2()
-
hs_3()