Python基础学习笔记(15) 自定义模块 random模块

Python基础学习(15)自定义模块 random模块

一、今日内容

  • 自定义模块
  • random 函数

二、自定义模块

  1. 模块的定义

    模块是 Python 代码封装的最小单位,本质就是.py文件,一个模块不宜多大,最高应该控制在 2000-3000 行左右;自定义模块就是自定义的.py文件,其中可包含:变量定义、可执行语句、for 循环、函数定义等,他们统称为模块的成员。

  2. 模块的运行方式

    • 脚本(script)方式:直接用解释器执行、在 PyCharm 中运行等。
    • 模块(module)方式:被其他的模块导入,为导入它的模块提供资源(变量、函数定义、类定义等)。
  3. __name__属性的使用

    • 在脚本方式运行时,__name__是固定的字符串__main__
    • 在以模块方式被导入时,__name__就是本模块的名字。
  4. 模块的导入

    当我们在同目录下假设已经设置了一个自定义模块module.py,新建一个test_import.py,在其中编写import module,可以立即得到module.py运行的结果,故我们可知自定义模块被其他模块导入时,其中的可执行语句会立即执行。

    这时就有了一个矛盾,在测试模块开发模块的过程中,需要在模块中穿插一些可执行语句来更加直观地测试开发模块;而在使用模块的时候却不需要模块中的可执行语句。

  5. 利用__name__属性给模块嵌入开发功能

    根据__name__属性我们可以利用在模块中编写下列语句,使其脚本方式执行可以运行可执行语句,模块方式被导入时不运行可执行语句:

    if __name__ == '__main__':
    	"""
    	可执行语句。。。
    	"""
    

    这时基本功能已经完成,为了方便与美观,我们可以把这些测试哦功能包装在一个main()函数语句中:

    def main():
        """
    	可执行语句。。。
    	"""
    
    if __name__ == '__main__':
        main()
    
  6. 使用自定义模块成员的方法

    import module
    module.function()
    print(module.variable)
    
  7. 系统导入模块的路径问题

    当我们在文件中import time时,time.py并不在同一文件路径下,却可以顺利加载模块,这是为什么?

    文件的模块路径具有以下原则:

    • 在内存中已经导入的模块,会直接使用,无需导入多次。

    • Python安装路径的相对路径Python36\Lib中存放默认的模块,Python36\Lib\site-packages存放下载的第三方模块。

    • PYTHONPATH是模块的搜索路径,可在Windows属性中修改,可以永久修改模块的搜索路径。

    • sys.path是一个模块路径的列表(需要导入sys模块,为system的简写),可以动态地在程序中编写。

      import sys  # 是system的简写
      print(sys.path)
      # ['D:\\Python\\Python Project\\day15',  # 默认包含脚本执行的路径以及项目的,中间路径一般不包含
      # 'D:\\Python\\Python Project',
      ......
      ]
      
  8. 利用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__))  # 成功添加模块路径
    
  9. 导入模块的多种方式

    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 modulefrom module import *的区别:

    • 第一种方式在使用模块成员时,必须使用模块名做前缀。

      module.func()
      module.variable
      
    • 第二章方式在使用其成员时,不用使用模块名做前缀,但容易出现命名冲突。

      func()
      variable
      
  10. 解决命名冲突

    • 改用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()
      
  11. 解决from module import *导入成员过多问题

    默认情况下,所有的成员都会被导入;我们可以利用__all__控制导入的成员,__all__是一个列表,用于表示本模块可以被导入时使用的成员,由成员们的字符串形式组成;但该方法只适用于from module import *,利用import module形式导入模块,仍然会导入模块中所有的成员。

  12. 相对导入(同个项目不同模块之间的导入操作)

    可以利用from relative_path import module功能,从附近的相对路径导入其他的模块,relative_path的编写中,可以添加以下字符实现以下功能:

    • .表示目录路径,..表示目录路径的父路径,以此类推。
    • name.表示相对路径name目录下。

三、Random 模块

本模块提供了和随机数获取相关的方法,在 Python 安装路径相对目录Python36\Doc\python365.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)
posted @ 2020-07-13 22:59  Raigor  阅读(149)  评论(0编辑  收藏  举报