python day12 标准库 、 包(模块包) package 、 Python 调试器 pdb 模块

目录:

标准库 、 包(模块包) package 、 Python 调试器 pdb 模块

系统模块 sys

运行时系统相关的信息和函数

sys模块的变量:

变量描述
sys.path模块搜索路径 path[0] 是当前脚本程序的路径名,否则为 ”
sys.modules已加载模块的字典
sys.version版本信息字符串
sys.version_info版本信息的命名元组
sys.platform操作系统平台名称信息
sys.argv命令行参数 argv[0] 代表当前脚本程序路径名
sys.copyright获得Python版权相关的信息
sys.builtin_module_names获得Python内建模块的名称(字符串元组)标准输入输出时会用到
sys.stdin标准输入文件对象,多用于input()
sys.stdout标准输出文件对象,多用于print()
sys.stderr标准错误输出文件对象, 用于输出错误信息

sys模块的方法

函数名描述
sys.exit([arg])退出程序,正常退出时sys.exit(0)
sys.getrecursionlimit()得到递归嵌套层次限制(栈的深度)
sys.setrecursionlimit(n)得到和修改递归嵌套层次限制(栈的深度)

自定义模块

自定义模块示例

  1. 文件格式:
    |test
    ——|mymod.py
    ——|test.py
  2. mymod.py # 被导入模块
# 此文件用来示意自定义模块的定义和导入
        def fac(n):
            print("正在计算", n, "的阶乘...")
        def sum_fac(n):
            print("正在计算", n, "的阶乘的和!!") 
        name1 = 'audi'
        name2 = 'tesla'
        print("mymod 模块被加载!")
  1. test.py # 主模块
# 此示例来示意调用mymod.py中的函数和变量
import mymod  # 导入自定义的mymod模块
print("---------------------")
mymod.fac(10)
mymod.sum_fac(30)
print("mymod.name1 =", mymod.name1)
name1 = 'home'

导入模块时的路径索引顺序:

  1. 索引程序的运行时路径(当前路径)
  2. 搜索 sys.path里提供的路径
  3. 搜索内置模块

模块化编程的优点:

  1. 有利于多人合作开发
  2. 使代码更加易于维护
  3. 提高代码的复用率
  4. 模块化编程有助于解决函数名和变量名冲突(重名)问题,模块内的变量的作用域为模块内全局

模块的加载过程

  1. 在模块导入时,模块的所有语句都会执行
  2. 如果一个模块已经导入,则再次导入时不会重新执行模块内的语句

模块的重新加载:

  1. 不同版本:
版本方案
Python 2.xreload() 是内置函数
Python 3.0 - 3.3import imp 后 imp.reload(module)
Python 3.4+imp 已经被废弃,取而代之的是 importlib

模块被导入和执行的过程:

  1. 先搜索相关路径找模块(.py)
  2. 判断是否有此模块对应的.pyc文件,如果没有此文件,则用.py文件 生成相应的.pyc文件再进行加载
  3. 如果文件已经存在,则判断.pyc文件和.py文件的修改时间,再决定是否重新生成.pyc文件

模块的编译 compile

              编译             解释执行
   mymod.py   --->>  mymod.pyc  ---> python3

模块的文档字符串 :

  1. 模块内第一行没有赋值给任何变量的字符串为文档字符

    1. 此文档字符串可以用help函数查看
    2. 示例见:

      """这是mymod2模块的文档字符串
      此模块有两个函数和两个变量
      此处省略100字...
      """
      
      def fac(n):
          print("正在计算", n, "的阶乘...")
      def sum_fac(n):
          print("正在计算", n, "的阶乘的和!!")
      name1 = 'audi'
      name2 = 'tesla'
      print("mymod 模块被加载!")
      
    3. 说明:
      模块的文档字符串被绑定在模块的 doc属性上
  2. file属性

    1. 用来绑定模块对应的文件路径名
    2. 示例:
      import mymod2
      print(mymod2.__file__)
  3. 模块的 name 属性:

    1. 用来记录模块自身的名字
    2. 作用:
      1. 记录模块名
      2. 用来判断是否为主模块
      3. name 说明:
      1. 当此模块作为主模块(也就是第一个运行的模块)运行时,name绑定’main
      2. 当此模块不是主模块时,模块为名文件名去掉’.py’

    3. 模块的 all列表
        模块中的all列表是一个用来存放可导出属性的字符串列表
      作用:
        当用from import * 语句导入模块时,只导入 all 列表内的属性
      示例:
       

      
      # 此示例用来示意__all__列表的用法
      
      
      __all__ = ['fun1', 'name1']
      def fun1():
          pass
      def fun2():
          pass
      def fun3():
          pass
      name1 = 'aaaa'
      name2 = 'bbbb'
      

模块的隐藏属性:

  1. 模块中以’_’ 开头的属性,在from import * 语句导入时,将不会导入,通常称这些属性为隐藏属性

    1. 示例见:
        def fun():
            print("hello")
        def _fun():
            print("hello")
        name = "home"
        _name = "world"

标准库模块:

随机模块 random

  1. 作用:
      用于模拟或生成随机数的模块

  2. 模块函数说明见:

函数名描述
R.random()返回一个[0, 1) 之间的随机实数
R.uniform(a,b)返回[a,b) 区间内的随机实数
R.randrange([start,] stop[, step])返回range(start,stop,step)中的随机数
R.choice(seq)从序列中返回随意元素
R.shuffle(seq[, random])随机指定序列的顺序(乱序序列)
R.sample(seq,n)从序列中选择n个随机且不重复的元素
R.getrandbits(nbit)以长整型的形式返回用nbit位来表示的随机数
R.seed(a=None)用给定的数a设置随机种子,不给参数a则用当前时间设置随机种子

3. 练习:
  1. 假设可以作为密码的字符有:
A-Z
a-z
0_9
下划线
写一个程序,随机生成六位密码
8z_A63

包(模块包) package

  1. 包是将模块以文件夹的组织形式进行分组管理的方法
  2. 作用:
    1. 将一系列模块进行分类管理,有利于防止命名冲突
    2. 可以在需要时加载一个或部分模块而不是全部模块
  3. 包示例:

    
    #文件接口
    
    mypack/
            __init__.py
            menu.py
            games/
                __init__.py
                contra.py      # 魂斗罗
                supermario.py  # 超级玛丽
                tanks.py       # 坦克大战
            office/
                __init__.py
                excel.py
                word.py
                powerpoint.py
    
    #       包的导入语法:
    
    import 包名 [as 包别名]
    import 包名.模块名 [as 模块新名]
    import 包名.子包名.模块名 [as 模块新名]
    
    from 包名 import 模块名 as 模块新名
    from 包名.子包名 import 模块名 [as 模块新名]
    from 包名.子包名.模块名 import 属性名[as 属性新名]
    
    from 包名 import *
    from 包名.模块名 import *
  4. 练习:

    1. 编写一个闹钟程序,启动时设置定时时间(小时和分钟) 到时间后打印”时间到…..” 然后退出程序
    2. 模拟斗地主发牌,扑克牌共54张:
      花色:
      黑桃(‘\u2660’), 梅花(‘\u2663’), 方块(‘\u2665’), 红桃(‘\u2666’)
      数值:
      A2-10JQK
      大小王
      三个人,每人发17张牌,底牌留三张:
      输入回车,打印第1个人的17张牌
      输入回车,打印第2个人的17张牌
      输入回车,打印第3个人的17张牌
      再输入回车,打印出三张底牌

    3. 继续完成学生信息管理项目

init.py 文件

  1. 是常规包内必须存在的文件,init.py会在导入包时被自动调用
  2. 作用:
    1. 编写此包的内容
      包个格式要求必须有init.py文件
    2. 在内部添加包的文档字符串
    3. init.py 文件内可以加载此包所依懒的其它模块
      (类似java maven依赖传递)
  3. 示例见:

    """ 这是一个用来测试用的包,此处是标题
    
    此包有两个函数:
    以下略...
    """
    
    __all__ = ['games', 'menu']
    
    def fx():
        print("我是mypack内的fx()函数")
    
    
    name1 = "我是mypack内的name1变量"
    
    import math  # 导入其它的包
    
    print("mypack包被加载!", math.factorial(5))

包的all列表

  1. 作用:
    用来记录此包中有哪儿些子包或模块需要导入
    当用from 包 import * 语句导入时,只查 找all中的模块或子包
  2. 说明:
    all列表只在from xxx import *语句时起作用
  3. 说明:
    当子包或子包内的模块被导入时,上一层的包也会被先导入
    例如:
    import mypack.games.contra
    # 实质会先导入mypack,再导入games,再导入contra

包的相对导入:

  1. 包的相对导入是指包内的模块的相互导入
  2. 语法:
    from 相对路径包或模块 import 属性或模块名

    from 相对路径包或模块 import *
  3. 相对路径:
    在 from xxxx import 语句中,xxxx 部分可以使用相对路径
    . 代表当前目录
    .. 代表上一级目录
    … 代表上二级目录
    …. 以此类推
    注:
    1. 相对导入时不能超出包的外部
    2. 相对的导入要避免循环导入
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值