模块是Python组织、封装代码的一种形式。在Python中,一个.py
文件就称之为一个模块(Module)
。
创建模块的优点:
创建模块的注意事项:
import abc
,若成功则说明系统存在此模块。为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)
。
现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mycompany,按照如下树形结构图组织文件和文件夹存放:
mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py
引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz。
请注意,每一个包目录下面都会有一个__init__.py
的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py
可以是空文件,也可以有Python代码,因为__init__.py
本身就是一个模块,而它的模块名就是mycompany。
类似的,可以有多级目录,组成多级层次的包结构。比如如下的目录结构:
mycompany
├─ web
│ ├─ __init__.py
│ ├─ utils.py
│ └─ www.py
├─ __init__.py
├─ abc.py
└─ utils.py
文件www.py的模块名就是mycompany.web.www,两个文件utils.py的模块名分别是mycompany.utils和mycompany.web.utils。
import
语句用于导入模块,它有3种形式
(1)导入模块
格式:import 模块1,模块2
多个模块名之间用逗号隔开
例如:import sys,time
(2)导入模块中的某个变量、函数、类定义
格式:from 模块 import 定义
例如:
>>> import sys,time
>>> from sys import path
>>> path
['', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python37\\site-packages', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']
(3)直接导入模块中的所有定义
格式:from 模块 import *
例如:from sys import *
>>> from sys import *
>>> version
'3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)]'
作用:用于给模块或模块中的定义起别名
例如:
>>> from sys import version as v
>>> v
'3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)]'
回忆下前面学习中用到的导入语句
import mcpi.minecraft as minecraft
import mcpi.block as block
import time
这三个语句都是导入模块的语句,每个模块就是一个.py文件,那么这些.py在什么位置呢?
打开minecraft.py文件,看看里面有没有熟悉的某些方法(函数)?
打开block.py文件,看看里面有没有熟悉的某些变量?
模块中复用的主体就是这些函数和变量!包、模块只是一种组织形式。
当我们导入一个模块时,Python会在指定的路径下搜索对应的.py文件,如果找不到,就会报错:
>>> import mymodule
Traceback (most recent call last):
File "" , line 1, in <module>
ImportError: No module named mymodule
默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块。
这也是我们要求编写的程序文件必须保存在MyAdventures目录的原因,因为只有这样,程序才能正常导入“我的世界”相关的模块。
Python安装时自带的模块叫做标准库(standard library)。
库(library)是相关模块、包的集合,是一个虚拟概念。
标准库中的内置模块,可直接用import语句导入。
在windows的Python安装目录中,lib目录中存放着绝大多数标准库和已安装的第三方库,其中第三方库在lib目录的site-packages子目录中。
内置模块random用于生成随机数。
random模块包含多个用于生成随机数的函数。
案例1:随机模块功能演示
import random
#random函数用于生成一个0-1之间的随机浮点数
print(random.random())
#randint() 用于生成一个指定范围内的随机整数
print(random.randint(2,10))
#uniform() 用于生成一个指定范围内的随机浮点数
print(random.uniform(2,10))
#randrange函数用于随机从某个区间按某步长选择一个数字。
#第1个参数起始值,第2个参数终止值,第3个参数步长
print(random.randrange(0,1000,3))
#sample函数可以从序列中随机选择若干个元素,返回数据类型为列表。
print(random.sample(range(100), 4))
#choice函数能够从序列中随机选择一个元素输出。
print(random.choice("abcdefg"))
多次执行该案例,对比结果可知,每次执行结果都不同
请分析下不同结果之间的规律!
import random
#导入模块
import mcpi.minecraft as minecraft
import mcpi.block as block
# 连接游戏
mc = minecraft.Minecraft.create()
# 获取玩家当前坐标
pos = mc.player.getTilePos()
x = pos.x
y = pos.y
z = pos.z
#循环20次,用于输出20个随机的石块
for i in range(20):
#随机生成两个整数
j = random.randint(0,20)
k = random.randint(0,20)
#用两个随机数构造坐标,在东南方向随机生成石块
mc.setBlock(x + j, y , z + k, block.STONE.id)
import random
import time
#导入相关模块
import mcpi.minecraft as minecraft
import mcpi.block as block
# 连接游戏
mc = minecraft.Minecraft.create()
# 获取玩家当前坐标
pos1 = mc.player.getTilePos()
# 获取一个随机整数
R = random.randint(1,10)
# 在玩家东南方随机放置一个钻石方块
mc.setBlock(pos1.x + R, pos1.y - 1 , pos1.z + R, block.DIAMOND_BLOCK.id)
while True:
#每隔0.1秒检测一次玩家坐标
pos = mc.player.getTilePos()
time.sleep(0.1)
#当玩家找到钻石方块时退出循环
if pos.y-1 == pos1.y-1 and pos.x == pos1.x+R and pos.z == pos1.z+R:
mc.postToChat("here")
break
elif pos.y-1 != pos1.y-1 or pos.x != pos1.x+R or pos.z != pos1.z+R:
mc.postToChat("not here")
小结
模块:一个py文件就是一个模块
包:含__init__.py文件的目录层次结构
导入语句:注意三种不同语句的作用
random库:伪随机数生成器