Skr-Eric的Python课堂(十五)——Python的模块和包

模块 Module

  什么是模块

    模块是一个包含有一系列数据,函数,类等组成的程序组

    模块是一个文件 ,模块文件名通常以.py结尾

 

  作用:

    让一些相关的数据,函数,类等有逻辑的组织在一起,使逻辑结构更新加清晰

    模块中的数据,函数和类等可以提供给其它模块或程序使用

 

  模块的分类:

    1. 内置模块, 在解释执行器内部定义,可以直接使用

    2. 标准库模块, 安装python时已安装且可以直接使用

    3. 第三方模块(通常为开源), 需要自己安装

    4. 用户自定义模块(可以作为其它人的第三方模块)

 

模块的导入 import

import 语句

  语法:

    import 模块名1 [as 模块新名1], 模块名2 [as 模块新名2], ...

  作用:

    将某模块整体导入到当前模块中

  示例:

import math  # 导入数学模块

print(math.factorial(5))
print(math.factorial(4))
print(math.cos(0))  # 1

  用法:

    模块名.属性名

    如:

      print(math.factorial(5))

      print(math.cos(0))

 

函数:

  dir(obj)函数,返回所有属性的字符串列表

  help(obj)函数,可以查看模块的文档字符串

 

from import 语句

  语法:

    from 模块名 import 模块属性名1 [as 属性新名1], 模块属性名2 [as 属性新名2], .....

  作用:

    将某模块内的一个或多个属性导入到当前模块的作用域

  示例:

from math import factorial as fac
from math import sqrt
from math import pi, e, sin, cos
print('5的阶乘是:', fac(5))
print('9的平方根是:', sqrt(9))
print('圆周率是:', pi)

 

from import * 语句

  语法:

    from 模块名 import *

  作用:

    将某模块的所有属性导入到当前模块

  示例:

from math import *
print(sin(pi/2))
print(factorial(5))  # 可以直接使用math里的全部属性

 

dir 函数:

  dir([对象])  返回一个字符串列表

  作用:

    1.如果没有参数调用,则返回当前作用域内所有变量的列表

    2.如果给定一个对象作为参数,则返回这个对象的所有变量的列表

      1) 对于一个模块,返回这个模块的全部属性

      2) 对于一个类对象,返回类对象的所有变量并递归基类对象的所有变量

      3) 对于其它对象返回所有变量,类变量和基类变量

用户自定义模块

  要求:

    模块名以".py"结尾

    模块名必须是标识符的命名规则

    避免名称和内建模块冲突

  导入方式:

    import 语句

    from import 语句

    from import * 语句

  示例:

# 此示例示意自义模块
def myfac(n):
    print("正在计算%d的阶乘...." % n)

def mysum(n):
    print("正在计算1+2+3+....+", n, '的和....')

name1 = "audi"
name2 = 'Tesla'

print('mymod模块被加载!')
print("我的模块名是:", __name__)

if __name__ == '__main__':
    print("我正在以主模块方式运行")
    mysum(10000)

 

import 语句的搜索路径顺序

   1. 索引内建模块 builtin

   2. 搜索程序的运行时路径(当前路径)

   3. sys.path提供的路径

      两种方法让用户自定义模块被导入:

          1) 将模块安装(复制)到 sys.path提供的路径

          2) 在运行程序时,在sys.path里添加自定义的路径

 

模块的加载过程:

  在模块导入时,模块的所有语句都会执行

  如果一个模块已经被导入,则再次导入时不会重新执行模块内的语句

 

模块的重新加载:

  import mymod

  import imp

  imp.reload(mymod)

 

模块被导入和执行的过程

  1. 先搜索相关路径找模块文件(.py文件)

  2. 判断是否有此模块对应的.pyc,如果pyc文件存在且比.py文件新则直接加载.pyc文件 

  3.否则用模块名.py 文件生成.pyc 并加载执行

 

模块的编译

             编译            解释执行

   mymod.py  ---> mymod.pyc  ----> python3

 

模块的属性

  模块的文档字符串

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

    模块内的文档字符串绑定在模块的__doc__属性上

 

  __doc__ 属性 用来绑定文档字符串

 

__file__属性

  __file__ 属性用于绑定此模块对应的文件路径

 

__name__属性

  作用:

    1. 用来记录模块自身的名字

    2. 用来判断是否为主模块

         (注: 主模块是指程序最先被python3执行的模块)

  说明:

    当此模块为主模块运行时,__name__的值为'__main__'

    当此模块不是主模块时,__name__绑定模块的名字

 

模块的__all__ 列表:

  模块中的__all__列表必须是一个字符串列表

  作用:

    当用from xxx import *导入时,只导入__all__列表内的属性

 

  示例:

# 此例表限定当用from mymod2 import *时只导入f1和var1
__all__ = ['f1', 'var1']

def f1():
    pass

def f2():
    pass

def f3():
    pass

var1 = 100
var2 = 200

 

模块的隐藏属性

   模块中以'_' 开头的属性,在from xxx import *导入时将不 被导入,通常称这些属性为隐藏属性

包(模块包)  Package

  包的定义

    包是将模块以文件夹的组织形式进行分组管理的方法

  作用:

    将一系列模块进行分类管理,有利于防止命名冲突

    可以在需要时加载一个或部分模块而不是全部模块

  包示例:

    mypack/

        __init__.py

        menu.py

        games/

            __init__.py

            contra.py

            supermario.py

            tanks.py

        office/

            __init__.py

            word.py

            excel.py

 

包内的 __init__.py 文件 

  __init__.py 是常规包内必须存在的文件

  __init__.py 文件会在包加载时被自动调用

  作用:

    编写此包的内容

    编写包的文档字符串

 

包的导入:

  规则类似于模块的导入规则

  import 包名 [as 包新名]

  import 包名.模块名 [as 模块新名]

  import 包名.子包名.模块名 [as 模块新名]

  ...

 

  from 包名 import 模块名 [as 模块新名]

  from 包名.子包名 import 模块名 [as 模块新名]

  from 包名.子包名.模块名 import 属性名 [as 属性新名]

  ...

 

  from 包名 import *

  from 包名.模块名 import *

  ...

 

import 语句搜索引 包的路径顺序

   1. 搜索程序运行时的路径(当前路径)

   2. sys.path提供的路径

 

__init__.py 内的__all__列表

  作用:

    用来记录此包中有哪儿些子包或模块需要导入

    当用from 包 import *语句导入模块时,只查找 __all__ 列表中所有的模块或子包

  说明:

    __all__列表只有在from xxx import *导入时起作用

 

包的相对导入

  包的相对导入是指包内模块的相互导入

  语法:

    from 相对路径包或模块名 import 属性或模块名

    或

    from 相对路径包或模块名 import *

  相对路径

    在 from 和 import 间可以用相对路径:

      . 代表当前目录

      .. 代表上一级目录

      ... 代表上二级目录

      .... 以此类推

    注: 相对导入时不能超出包的外部

 

课后习题:

  1. 模拟斗地主发牌,牌共 54张

    黑桃('\u2660'), 梅花('\u2663'), 方块('\u2665'), 红桃('\u2666')

    A2-10JQK

    大王,小王

    三个人,每个人发17张,底牌留三张

    要求:

      输入回车,打印第1个人的17张牌

      输入回车,打印第2个人的17张牌

      输入回车,打印第3个人的17张牌

      输入回车,打印三张底牌

  2. 打印 九九乘法表:

      1x1=1

      1x2=2 2x2=4

      1x3=3 2x3=6 3x3=9

      .....

      1x9=9 ..............9x9=81

  3. 将学生信息管理程序拆分为模块

    要求:

      1. 主事件循环放在main.py中

      2. show_menu 函数放在menu.py中

      3. 写学生操作相关的函数放在 student_info.py中

    主模块为 main.py

 

 

想要看更多的课程请微信关注SkrEric的编程课堂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值