Python基础学习(15)自定义模块 random模块
一、今日内容
- 自定义模块
- random 函数
二、自定义模块
-
模块的定义
模块是 Python 代码封装的最小单位,本质就是
.py
文件,一个模块不宜多大,最高应该控制在 2000-3000 行左右;自定义模块就是自定义的.py
文件,其中可包含:变量定义、可执行语句、for 循环、函数定义等,他们统称为模块的成员。 -
模块的运行方式
- 脚本(script)方式:直接用解释器执行、在 PyCharm 中运行等。
- 模块(module)方式:被其他的模块导入,为导入它的模块提供资源(变量、函数定义、类定义等)。
-
__name__
属性的使用- 在脚本方式运行时,
__name__
是固定的字符串__main__
。 - 在以模块方式被导入时,
__name__
就是本模块的名字。
- 在脚本方式运行时,
-
模块的导入
当我们在同目录下假设已经设置了一个自定义模块
module.py
,新建一个test_import.py
,在其中编写import module
,可以立即得到module.py
运行的结果,故我们可知自定义模块被其他模块导入时,其中的可执行语句会立即执行。这时就有了一个矛盾,在测试模块开发模块的过程中,需要在模块中穿插一些可执行语句来更加直观地测试开发模块;而在使用模块的时候却不需要模块中的可执行语句。
-
利用
__name__
属性给模块嵌入开发功能根据
__name__
属性我们可以利用在模块中编写下列语句,使其脚本方式执行可以运行可执行语句,模块方式被导入时不运行可执行语句:if __name__ == '__main__': """ 可执行语句。。。 """
这时基本功能已经完成,为了方便与美观,我们可以把这些测试哦功能包装在一个
main()
函数语句中:def main(): """ 可执行语句。。。 """ if __name__ == '__main__': main()
-
使用自定义模块成员的方法
import module module.function() print(module.variable)
-
系统导入模块的路径问题
当我们在文件中
import time
时,time.py
并不在同一文件路径下,却可以顺利加载模块,这是为什么?文件的模块路径具有以下原则:
-
在内存中已经导入的模块,会直接使用,无需导入多次。
-
在
Python
安装路径的相对路径Python36Lib
中存放默认的模块,Python36Libsite-packages
存放下载的第三方模块。 -
PYTHONPATH
是模块的搜索路径,可在Windows
属性中修改,可以永久修改模块的搜索路径。 -
sys.path
是一个模块路径的列表(需要导入sys
模块,为system
的简写),可以动态地在程序中编写。import sys # 是system的简写 print(sys.path) # ['D:\Python\Python Project\day15', # 默认包含脚本执行的路径以及项目的,中间路径一般不包含 # 'D:\Python\Python Project', ...... ]
-
-
利用
sys.path
自行导入模块路径# print(__file__) # 会返回当前文件的绝对路径 D:/Python/Python Project/day15/01 自定义模块.py import os # 使用os模块可以获得文件目录路径 import sys # print(os.path.dirname(__file__)) # 返回文件的目录路径 directory name D:/Python/Python Project/day15 sys.path.append(os.path.dirname(__file__)) # 成功添加模块路径
-
导入模块的多种方式
import module
:导入一个模块的所有成员。import module_1, module_2
:一次性导入多个模块的成员,不推荐这种写法,一般只会在import os, sys
使用。from module import menber
:从某个模块导入指定的成员。from module import menber_1, menber_2
:从某个模块导入多个成员。from module import *
:从某个模块中导入所有成员。import module
和from module import *
的区别:-
第一种方式在使用模块成员时,必须使用模块名做前缀。
module.func() module.variable
-
第二章方式在使用其成员时,不用使用模块名做前缀,但容易出现命名冲突。
func() variable
-
-
解决命名冲突
-
改用
import module
方式导入 -
避免使用重名
-
使用别名
alias
避免冲突# 使用方法1:给模块成员起别名 from module import variable as alias_1 from module import func as alias_2 alias_1 alias_2() # 使用方法2:给模块起别名 import module as alias_module alias_module.virable alias_module.func()
-
-
解决
from module import *
导入成员过多问题默认情况下,所有的成员都会被导入;我们可以利用
__all__
控制导入的成员,__all__
是一个列表,用于表示本模块可以被导入时使用的成员,由成员们的字符串形式组成;但该方法只适用于from module import *
,利用import module
形式导入模块,仍然会导入模块中所有的成员。 -
相对导入(同个项目不同模块之间的导入操作)
可以利用
from relative_path import module
功能,从附近的相对路径导入其他的模块,relative_path
的编写中,可以添加以下字符实现以下功能:.
表示目录路径,..
表示目录路径的父路径,以此类推。name.
表示相对路径name
目录下。
三、Random 模块
本模块提供了和随机数获取相关的方法,在 Python 安装路径相对目录Python36Docpython365.chm
(365代表版本,不同版本会有不同)有所有的帮助信息。
random.random()
:返回[0.0, 1.0)
范围内的一个浮点数。random.randint(a, b)
:返回[a, b]
范围内的一个整数。random.uniform(a, b)
:返回[a, b)
范围内的一个浮点数。random.shuffle(x)
:直接修改参数把传入的元素打乱,参数必须是一个可变的数据类型,无返回值。random.sample(population, k)
:从population
中随机抽取 k 个元素,以列表的形式返回。
"""
random模块演示
"""
import random
# 获取[0.0, 1.0)范围内的浮点数。
print(random.random())
# 获取[a, b]范围内的一个整数
print(random.randint(0,1))
# 获取[a, b)范围内的浮点数
print(random.uniform(2,6))
# 把参数指定的数据中元素打乱,参数必须是一个可变的数据类型。
li = [1, 3, 5, 7, 9]
random.shuffle(li)
print(li)
# 通过sample变相打乱元组
tu = (1, 2, 3)
li = random.sample(tu, len(tu))
tu = tuple(li)
print(tu)