python基础-day14

本文深入探讨Python装饰器的使用方法,包括闭包、文档字符串及模块化编程的优势。讲解了不同类型的模块,如内建、标准库、第三方和自定义模块,以及它们的导入方式。此外,还介绍了模块的加载过程、预置属性和隐藏属性,以及如何通过模块化编程解决函数名和变量名冲突。
day13回顾:
    装饰器:
    def 装饰器函数名
        创建闭包
        return 闭包
        @装饰器函数名
            
        def 被装饰函数(形参列表)
            pass
        被装饰函数(实参列表)

函数的文档字符串:
    def 函数名(...):
        "文档字符串"
    >>>help(函数名)
    __doc__属性
    函数名.__doc__='文档字符串'

模块:
    模块内通常有数据,函数,类
    四类模块:
        内建模块
        标准库模块
        第三方模块
        自定义模块
模块的导入语句:
    import 语句
    from import 语句
    from import *

dir() 函数

三个模块:
    math
    time
    sys
                                                                                     
-----------------------------------------------------------------
day14

自定义模块
    要求:
        模块名后缀必须为.py结尾
        模块文件名必须是合法的标识符
        避免名称和内建模块名冲突
    导入方式:
        import 自定义模块名
        from 自定义模块名 import 属性
        from 自定义模块名 import *
    示例见:
        mymod.py


import 语句 搜索模块的路径顺序
    1.搜索内建模块
    2.搜索程序运行时的路径(当前工作目录)
    3.搜索sys.path提供的路径
        可以在sys.path里添加自定义的路径
        如:
            import sys
            sys.path.append("/home/tarena")
            import mymod
            #可以导入/home/tarena/mymod.py这个模块

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

模块的加载过程:
    在导入模块时,模块的所有语句会执行
    如果一个模块已经导入,则再次导入时不会重新执行模块内的语句
模块的重新加载
    import mymod
    import imp
    imp.reload(mymod) #重新加载mymod模块


模块被导入和执行的过程:
    1.搜索相关的路径找模块文件.py
    2.判断是否有此模块对应的.pyc文件,如果pyc文件比.py文件新则直接加载.pyc文件,否则用.py
        文件重新生成.pyc文件并加载

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

模块的预置属性
    __doc__属性
        绑定模块的文档字符串
        模块的文档字符串是模块内的第一个没有赋值的
        
    __file__属性
        __file__用来绑定模块所对应的文件路径名
        示例:
        mymod.__file__
    
    __name__属性
        作用:
            1.记录模块名
            2.用来判断是否为主模块

        说明:  
            1.当此模块为主模块运行时,__name__绑定'__main__'
            2.当此模块不是主模块运行,而是被其他模块导入时,此模块名为模块文件.py前面的模块名
                如:mymod.py 的模块名为mymod
            注:
                主模块是指最先被python解释执行器执行的模块

模块里的__all__列表
        __all__列表是一个用来存储可导入属性的字符串列表
        作用:
            限制用from xxx import * 语句导入时导入部分属性,而不是全部属性
        示例见:
            mymod2.py
                #此示例示意模块内的__all__列表的定义方式和作用
                #限制别人用from import * 语句导入时,只能导入f3,var1
                __all__=['f3','var1']
                def f1():
                    pass
                def f3():
                    pass
                def f3():
                f2()
                var1='aaaa'
                var2='bbbb'

模块的隐藏属性:
    模块中以'_'开头的属性,在from xxx import * 导入时将不被导入,通常称这些属性为隐藏属性
    示例见mymod3.py
        #只能导入f和name1
        def f():
            pass
        def _f():
            pass
        def __f():
            pass
        name1='aaa'
        _name1='bbb'

随机模块 random
    作用:
        用于模拟或生成随机输出的模块
    文档参见:
        python_base_docs_html/随机模块
        random.html

练习:
    猜数字游戏:
        随机生成一个0~100之间的整数,用变量x绑定让用户输入一个数y,输出猜数字的结果
        1)如果y等于生成的数x,则提示‘恭喜你猜对了’
        2)如果y大于x,提示‘猜大了’
        3)如果y小于x,则提示'猜小了'
    直到猜对为止,显示用户猜数字的次数后退出程序
        import random,sys
        i=0
        x=random.randrange(0,10000)
        while True:
            y=int(input('输入0~100之间的数字:'))
            i+=1
            print('你总共猜了:',i,'次')
            if y==x:
                print('恭喜你猜对了!')
                sys.exit()
            elif y>x:
                print('你猜大了')
            else:
                print('你猜小了')

包(模块包)package       ------------tree 文件名-----#<显示当前文件结构>
    包是将模块以文件夹的组织形式进行分组管理的方法
    作用:
        将一系列模块进行分类管理,有利于防止名字冲突
        可以在需要时加载一个或部分模块而不是全部模块
    示例:
        mypack/
            __init__.py
            menu.py
            games/
                __init__.py
                contra.py
                supermario.py
                tanks.py
            office/
                __init__.py
                excel.py
                word.py

包的导入:
    同模块的导入规则基本相同
    语法:
        import 包名 [as 包别名]
        import 包名.模块名 [as 模块新名]
        import 包名.子包名.模块名[as 模块新名]
        ...
        from 包名 import 模块名 [as 模块新名]
        from 包名.子包名 import 模块名 [as 模块新名]
        from 包名.子包名.模块名 import 属性名 [as 属性新名]
        ...
        from 包名 import *
        from 包名.模块名 import *

__init__.py文件
    此文件是常规包内必须存在的文件,此文件会在包被导入时自动调用
    作用:
        编写此包的内容
        在内部填写包的文档字符串
        在__init__.py内可以加载此包所

包内的all列表:
    作用:
        用来记录此包中有哪些子包或模块在from
        import  *语句导入时需要被导入
    说明:
        __all__列表只对from xxx import *语句中起作用
        示例见:
        mypack/games/__init__.py

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

    语法:
        from 相对路径包或模块 import 属性或模块名
        from 相对路径包或模块 import *
    相对路径:
        . 代表当前目录
        .. 代表上一级目录
        ...代表上两级目录
        ...以此类推
        注:相对导入时不能超出包的外部
        示例见:
            mypack/games/contra.py
注意避免循环导入:
    见:
    mypack2/
        __init__.py
        a.py
        b.py

包的加载路径
    1.当前工作路径
    2.sys.path 提供的路径
        模块的加载路径设置方法:
            sys.path('新路径')

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





























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值