一、模块的四种形式
1.1 什么是模块
模块是一系列功能的集合体,而函数是某一个功能的集合体,因此模块可以看成是一堆函数的集合体。一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块。如果这个py文件的文件名为module.py
,模块名则是module
。
1.2 模块形式:
1、自定义模块:就是自己创建的py文件,里面写入一堆函数,则这个文件被称为自定义模块,即使用python编写的.py文件。
2、第三方模块:需要自己安装,有13万个第三方库,无所不能
3、内置模块:python解释器自带的,不需要安装
4、包:含有__inti__
.py的文件夹,一种特殊的模块(解决了一个问题)
1.3 为什么要用模块
- 用第三方或者内置的模块是一种拿来主义,可以极大地提升开发效率。
- 自定义模块,将我们自己程序中用到的公共功能,写入一个python文件,然后程序的各部分组件可以通过导入的方式来引用自定义模块的功能。
二、import 和 from...import...
2.1 import 模块名
python看成一个手机,pip是应用管家,time就是应用管家里的一个应用,要用它就import
import time
time.time()
import 首次导入模块发生的3件事情:
1、在内存中生成一个叫做time的名称空间
2、运行time.py文件,然后把time.py文件内的名称空间放入time的名称空间内
3、把time的名称空间指向import和from...import.py(当前导入time模块的文件) 的名称空间中
模块的重复导入会直接引用之前创造好的加过,不会重复执行模块的文件
使用import time导入的时候,使用方法只能time.方法名(),不能直接方法名
2.2 from...import... 模块名
不推荐使用这个方法
from time import gmtime
print(gmtime())
from...import...首次导入模块发生的3件事情:
1、在内存中生成一个叫做time的名称空间
2、运行time.py文件,然后把time.py文件内的名称空间放入time的名称空间内
3、把gmtime方法指向import和from...import.py(当前导入time模块的文件) 的名称空间内,该方法可以不用加任何前缀而直接使用
- 优点:不用加前缀,代码更加精简
- 缺点:容易与当前执行文件名中名称空间中的名字冲突
导入文件内所有内容的功能:
__all__
在两种模块名中的区别
from test import * # __all__限制了 from test import *(导入全部)
from test import f3 # __all__不会限制
import test # __all__ 不会限制
2.3 import 和 from...import...的异同
相同点:
1、两者都会执行模块对应的文件,两者都会产生模块的名称空间
2、两者调用功能时,需要跑到定义时寻找作用域关系,与调用位置无关
不同点:
import 需要加前缀;from...import...不需要加前缀
三、循环导入问题
#m1.py
from m2 import y
x = 10
#m2.py
from m1 import x
y = 20
过程:m1.py --> m2.py --> m1.py ... 就进入了循环导入的死循环
结果:x/y在这个过程中一直没有生成
解决方案一 :把导入语句写在最下面一行
#m1.py
x = 10
from m2 import y
#m2.py
y = 20
from m1 import x
过程:m1.py --> x = 10 --> m2.py --> y = 20 --> m1.py --> x = 10
结果:x = 10 --> y = 20 --> x = 10
解决方案二:把导入语句写在函数里面
#m1.py
def f1():
from m2 import y
print(y)
x = 10
#m2.py
def f1():
from m1 import x
y = 20
过程:f1() --> m2.py --> y = 20
结果:y = 20
四、模块的搜索路径
1、先从内存中找
from m2 import y
print(y)
import time
time.sleep(10) # 10s内删除了m2
from m2 import y
print(y)
2、再从内置模块中找
from time import time
print(time)
3、然后从自定制模块中找
也就是在自己创建的文件模块中找
4、最后从环境变量中找(未来项目的执行文件一定要弄一个环节变量)
import sys
print(sys.path) # 环境变量,模块就是在某个路径中,需要添加路径,在这里找
sys.path.append(r'D:上海Python11期视频python11期视频day 16')
# del sys.path[1]
print(sys.path)
import testt
testt.f1()
五、python文件的两种用途
1、作为模块文件(m1.py中调用m2.py,运行m1.py时,m2.py即为模板文件),模块可以有多个
2、作为执行文件(当前运行的文件),执行文件只有一个
3、执行文件和模块文件是相对的
# m1.py
x = 10
if __name__ == '__main__':
print(x)
# m2.py
import m1
当运行m1.py时,即m1.py作为执行文件,此时 name== main,打印x
当运行m2.py时,即m1.py作为模板文件,此时name== m1,if条件不成立,报错
if __name__ == '__main__':
实际上就是一个if
判断,或者是过滤器。可以用main+tab键快速打出来
六、random 模块
random 模块的使用方法
-
掌握
1、random.random() 随机生成一个0--1之间的小树
import random print(random.random()) #随机生成一个大于0小于1之间的小数 ------------------------------------------------------------ 0.6331352272344526
2、random.randint():随机生成一个数值范围内两头都包括之间的整数
import random print(random.randint(1,5)) #随机生成一个大于等于1且小于等于5之间的整数 ------------------------------------------------------------ 5
3、random.shuffle():打乱容器类元素--->列表和字典
import random list = [1,3,5,7,9] random.shuffle(list) #打乱list的顺序,相当于“洗牌” print(list) ------------------------------------------------------------ [9, 5, 3, 7, 1]
-
了解
1、random.randrange():随机生成一个给定范围内(顾头不顾尾)的整数
import random #随机生成一个大于等于1且小于3之间的整数 # print(random.randrange(1,3)) ------------------------------------------------------------ 1
2、random.uniform():随机生成给定范围内(头尾都不顾)的小数
import random #随机生成一个大于1小于3的小数 print(random.uniform(1,3)) ------------------------------------------------------------ 2.7201432742975458
3、random.choice():随机取出列表内的任意一个元素
import random #随机生成列表内的任意一个元素 print(random.choice([1,'23',[4,5]])) ------------------------------------------------------------ 1
4、random.sample():随机取出列表元素任意n个元素的组合
import random #随机生成列表元素任意n个元素的组合 print(random.sample([1,'23',[4,5]],3)) #这个3就代表n ------------------------------------------------------------ [[4, 5], '23', 1]