(十三)python 自定义模块,随机模块,包

目录

自定义模块

import 语句搜索模块的路径顺序

模块的加载过程:

模块的重新加载

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

模块的__doc__属性:

__file__属性

__name__属性

模块的__all__列表

随机模块random

包(模块包)package

    创建命令:

    包的导入语法:


系统模块sys

自定义模块

''' 此示例示意自定义模块

此模块中有二个函数:
    myfac(n), mysum(n)
此模块中有两个数据:
    name1, name2
'''

def myfac(n):
    '''我是myfac 的文档字符串'''
    print("正在计算%d的阶乘!" % n)

def mysum(n):
    print("正在计算%d的和!" % n)

name1 = "audi"
name2 = "tesla"

print("mymod 模块被导入")
import mymod
from mymod import name1, name2

mymod.myfac(5)

mymod.mysum(100)

print(mymod.name1)
print(mymod.name2)

print('name1=', name1)
name1 = "魏老师"
print('name1=', name1)
# mymod3 中的内容
print("mymod3模块内的:__name__属性绑定", __name__)


import mymod3
print("我是test_mymod3模块,我最先运行")
print("test_mymod3.__name__ =", __name__)

import 语句搜索模块的路径顺序

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

模块的加载过程:

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

模块的重新加载

    import mymod
    import imp
    imp.reload(mymod) # 在运行时重新加载mymod 模块

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

    1.先搜索相关路径找模块(.py文件)
    2. 判断是否有此模块对应的.py文件,如果.pyc文件比.py文件新,则直接加载.pyc 文件
    3.否则用模块.py文件生成 .pyc并加载执行

pyc模块的编译 compile
          编译          解释执行
mymod.py ----> mymod.pyc ------>python3

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

模块的__doc__属性:

    用于绑定模块文档字符串

__file__属性

    绑定模块对应的文件路径

__name__属性

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


模块的__all__列表

    模块中的__all__列表是一个用来存放可导出属性的字符串列表

    作用:
        限定当用from xxx import*语句导入时,只导入__all__列表内的属性

# __all__ 列表限定其它模块在用from mymod4 import *导入时
# 只导入 'myfun1', 'myfun3', 'name1'

__all__ = ['myfun1', 'myfun3', 'name1']

def myfun1():
    print("myfun1被调用")

def myfun2():
    print("myfun2被调用")

def myfun3():
    print("myfun3被调用")

name1 = 'aaaaa'
name2 = 'bbbbbbb'

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


随机模块random

    作用:
        随机模块random用于模拟或生成随机输出的模块

    文档参见:
        随机模块random.html


练习:
    猜数字游戏:
        随机生成一个0~100的整数,用变量x绑定
        让用户输入一个数y,输出猜数字的结果
        1).如果y等于x,则提示"恭喜您猜对了",退出程序
        2).如果y大于x,则提示"您猜大了"
        3).如果y小于x,则提示"您猜小了"
        让用户循环输入,知道猜对为止,同时显示用户猜数字的次数后
        退出程序

import random

x = random.randrange(101)
# print("x=", x)

count = 0
while True:
    y = int(input("请输入您要猜的数字: "))
    count += 1
    if x == y:
        print("恭喜您猜对了!")
        break
    elif y > x:
        print("您猜大了")
    else:
        print("您猜小了")

print("您共猜了%d次" % count)


包(模块包)package

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

    作用:
        将一系列模块进行分类管理,有利于访问命名冲突
        可以在需要时加载一个或部分模块,而不是全部模块

包示例:
    mypack/
         __init__.py
         menu.py
         games/
             __init__.py
             contra.py
             supermario.py
             tanks.py
        office/
            __init__.py
            excel.py
            word.py
            powerpoint.py

    创建命令:

        mkdir mypack
        cd mypack
        touch __init__.py menu.py
        mkdir games office
        cd games
        touch __init__.py contra.py supermario.py tanks.py
        cd ../office
        touch __init__.py excel.py word.py powerpoint.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*
        ...


 练习:
    1. 模拟'斗地主'发牌 
        牌共54张
        花色:
            黑桃('\u2660'), 梅花('\u2663'), 方块('\u2665'), 红桃('\u2666')
        大小王
        数字:
            A0~10JQK
    1) 生成54张片
    2) 三个人玩牌,每人发17张,底牌留三张
        输入回车, 打印第1个人的17张牌
        输入回车, 打印第2个人的17张牌
        输入回车, 打印第3个人的17张牌
        输入回车, 打印3张底牌

  2. 将学生信息管理程序拆分成相应的模块:
        建议:
            main.py  # 放主事件循环 main函数及其关相函数
            menu.py  # 放菜单相关的函数
            student_info.py  # 放学生信息操作相关的函数

L = ['A'] + [str(x) for x in range(2, 11)] + list("JQK")
# print(L)
kinds = ['\u2660', '\u2663', '\u2665','\u2666']
# print(kinds)

poke = ['大王', '小王']
for k in kinds:
    for n in L:
        poke.append(k + n)

print("新买的牌:", poke)
poke2 = list(poke)  # 复制一份

import random
random.shuffle(poke2)  # 洗牌

input()
print("第1个人的17张牌是:", poke2[:17])
input()
print("第2个人的17张牌是:", poke2[17:34])
input()
print("第3个人的17张牌是:", poke2[34:51])
input()
print("底牌是:", poke2[51:])

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值