zoukankan      html  css  js  c++  java
  • 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安装路径的相对路径Python36Lib中存放默认的模块,Python36Libsite-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 安装路径相对目录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)
    
  • 相关阅读:
    c++类的大小
    c++面向对象的程序设计
    c++拷贝控制
    vsftpd出现“Response: 500 OOPS: cannot change directory”解决方法(转载)
    CentOS 安装 MRTG 软件完成后的 403 Forbidden(转载)
    Linux服务器 /var/spool/clientmqueue 目录下产生大量文件的删除办法
    mysql修改端口经验
    yum install mysql(转载)
    yum install tomcat
    yun install java
  • 原文地址:https://www.cnblogs.com/raygor/p/13296457.html
Copyright © 2011-2022 走看看