拜师教育第一阶段day8-9_python基础

第八章  模块

1.将实现类似功能的函数和类统一放到一个.py文件内,这个文件称之为'模块'(module)。再将实现类似功能的模块放到一起叫做'包'(package)。每个模块对应python中的一个.py文件,每个包对应Python中的一个项目(文件夹)。要了解的是python程序由模块构成,模块由语句构成,即语句是Python程序中的基本单元。python中的模块分为标准库模块(基本功能模块)和用户自定义模块。

2.模块化编程的好处:将一个 Python程序分解成多个模块,方便团队协作分工,便于后期的重复应用,增加可维护性。

3.模块化编程的流程:(1)设计API,进行功能描述(不涉及代码,说明代码的功能,预期创建哪些类,类的具体功能是什么,下有什么函数,函数作用(文档字符串的形式))。(2)编码实现API中描述的功能。 (3)在模块中编写测试代码,并消除全局代码。 (4)使用私有函数实现不被外部客户端调用的模块函数。

在使用模块时先导入(import语句),在通过help()查看API。通过__doc__可以获得模块或者模块中函数(格式:模块名.__doc__与模块名.函数名.__doc__)的文档字符串的内容。

每个模块都有自己的名字,可以通过模块名.__name__获得其名字。注意:当一个模块被作为程序入口时(主程序、交互式提示符下),它的__name__的值为“__main__”。(一定要注意name和main前后都有__)我们可以根据这个特 点,将模块源代码文件中的测试代码进行独立的处理。

4.模块的导入:语法:

import 语句的基本语法格式如下: import 模块名 #导入一个模块   import 模块1,模块2… #导入多个模块     import 模块名 as 模块别名 #导入模块并使用新名字(等价于将模块math的地址赋值给m)。当我们通过 import 导入一个模块时,python解释器进行执行,最终会生成一个对象, 这个对象就代表了被加载的模块。一个模块不论导入多少次,只生成一个模块对象,也就是说模块中的代码只执行一次。要想实现重新加载,可以在导入importlib后,调用importlib.reload(直接写模块名不用加引号)语句。且模块也是对象,类型为module。import族语句是导入模块文件,如果想要使用模块中的内容(属性、类、函数等)则应使用from 模块名  import  内容1,内容2(内容间以逗号隔开)语句。尽量避免“from 模块名 import *”这种写法。* 它表示导入模块中所有的不是以下划线(_)开头的名字都导入到当前位置。但由于不知道导入什么名字,很有可能 会覆盖掉之前已经定义的名字。而且可读性极其的差 。

要动态导入可以使用importlib模块,但在使用前要导入importlib 模块,动态导入语句为a = importlib.import_module()。

5.“包”就是一个必须有__init__.py的文件夹(一个文件夹下包含__init__.py模块就是包,否则就是普通文件)。包下面可以包含“模块(module)”,也可以再包含“子包(subpackage)”(子包也要包含__init__.py模块文件)。在如下所示的包结构中:

需要导入module_AA.py。方式如下:(1)import a.aa.module_AA 在使用时,必须加完整名称来引用,比如:a.aa.module_AA.fun_AA() (2) from a.aa import module_AA 在使用时,直接可以使用模块名。 比如:module_AA.fun_AA() (3) from a.aa.module_AA import fun_AA 直接导入函数 在使用时,直接可以使用函数名。 比如:fun_AA()

导入包的本质其实是“导入了包下的__init__.py”文件。也就是说,”import pack1”意味着执行了包pack1下面的__init__.py 文件。所以批量导入时,我们可以在__init__.py 中批量导入我们需要的模块,而不再需要一个个导入。__init__.py的三个核心作用:(1)作为包的标识,不能删除。(2)用来实现模糊导入。(3)导入包实质是执行__init__.py 文件,可以在__init__.py 文件中做这个包的初始化、以及需要统一执行代码、批量导入。包的本质还是模块。

模糊导入:借助__init__.py中的__all__变量,该变量为一列表,如上例 a 包下的 __init__.py 中,可定义 __all__ = ["module_A","module_A2"] 这意味着, from sound.effects(对应的包,即变量列表中的模块的源包) import * 会从对应的包中导入以上两个子模块。

如果是子包内的引用,可以按相对位置引入子模块。以 aa包下的module_AA中导入a 包下内容为例:
from .. import module_A     #..表示上级目录 .表示同级目录
from . import module_A2    #.表示同级目录

6.模块搜索路径(当我们导入某个模块文件时, Python 解释器去哪里找这个文件):内置模块→当前目录(当前模块所位于的包名下有无搜索模块)→程序的主目录(项目的主目录)→pythonpath目录(如果已经设置了 pythonpath环境变量)→标准链接库目录第三方库目录(site-packages 目录)→ .pth文件的内容(如果存在的话)→sys.path.append('d:/')临时添加的目录(这个是临时有效,其他都是永久有效,找到这里都没有就报错)

在windows 系统中建立.pth 文件,由于没有文件名不能直接建立。需要输入:
“.pth.”才能正常建立.pth文件。

第九章  异常

1.对于运行中可能会出现问题的代码可以将其放在try 监视代码 except 结构中监视,一旦发生错误就跳入到异常处理except处。而对于一定出现的问题,需要考虑从程序的逻辑上入手解决。

2.异常处理,就是指程序在出现问题时依然可以正确的执行剩余的程序,而不会因为异常而终止程序执行。注意异常类也是对象。异常处理过程:(1)抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给解释器。(2)捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常。异常发生时需要按照从上到下的顺序追溯(Trackback)错误发生的过程,最终定位引起错误的那一行代码。

3.try···一个except 结构:try 块包含着可能引发异常的代码,except 块则用来捕捉和处理发生的异常。执行的时候,如果 try 块中没有引发异常,则跳过 ecept 块继续执行后续代码;执行的时候,如果 try块中发生了异常,则跳过 try 块中的后续代码,直接跳到相应的 except 块中处理异常;异常处理完后,继续执行后续代码。
try:
     被监控的可能引发异常的语句块

except BaseException(所有异常的根类)[as e(产生的异常对象)]:

      异常处理语句块

4.try···多个except结构:一般建议尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并且针对性的写出异常处理代码,格式如下:

try:
     被监控的、可能引发异常的语句块
except Exception1:

     处理 Exception1 的语句块

except Exception2:

     处理 Exception2 的语句块
······
except BaseException:

      处理可能遗漏的异常的语句块

5.try···except···else结构:如果 try 块中没有抛出异常,则执行 else 块。如果 try 块中抛出异常,则执行 except 块,不执行 else 块。

try···except···finally结构:finally 块无论是否发生异常都会被执行;通常用来释放 try 块中申请的资源。(打开文件并读取时,open第三个参数补上encoding='utf-8')

一般不把 return 放到异常处理结构中,而是放到方法最后。

6.八大常见的异常:SyntaxError:语法错误;NameError:尝试访问一个没有申明的变量;ZeroDivisionError:除数为 0 错误(零除错误);ValueError:数值错误(int('q'));TypeError:类型错误(123+'abc');AttributeError:访问对象的不存在的属性;IndexError:索引越界异常;KeyError:字典的关键字不存在。

7.with 上下文管理:with context_expr[as var]: 语句块
with 上下文管理可以自动管理资源,在 with 代码块执行完毕后自动还原进入该代码之前的现场或上下文。不论何种原因跳出 with 块,不论是否有异常,总能保证资源正常释放。极大的简化释放资源的工作(但不意味着可以取代try···except···finally结构),在文件操作、网络通信相关的场合非常常用。

8.使用 traceback 将异常信息写入日志文件。

# c o d i n g = u t f - 8 
import traceback
try: 
    print("step1") 
    num = 1/0 
except: 
    with open("d:/a.log","a") as f: 
        traceback.print_exc(file=f)  #将异常写入日志(核心)

9.自定义异常类:自定义异常类一般都是运行时异常,通常继承 Exception 或其子类即可。命名一般以 Error、Exception 为后缀。自定义异常由 raise 语句主动抛出。

10.pycharm开发环境的调试核心为断点的设置。程序执行到断点时,暂时挂起,停止执行。

11.补(实操作业):新建一个程序mypro_1,在其下创建一个a包,要求a包下包含子包aa,aa中包含模块module_A,a包中包含模块module_B,现需要将moduleA中所有内容导入到module_B模块中。module_A中包含自定义异常类AgeError,即当在循环输入年龄时,若为1-100岁时正常输出年龄,当不在输入范围或者输入异常时抛出相应的异常提醒,并在输入年龄为100时退出程序,打印“长命百岁!”最后将以上内容存储在电脑d:/test20.txt中,并在程序执行时读取输出作为程序说明,程序结束则关闭改文件的打开状态。

在module_A模块中:

class AgeError(Exception):
    def __init__(self,age_error):
        Exception.__init__(self)
        self.age_error=age_error
    def __str__(self):
        return self.age_error+'不在1-100范围内'

在module_B模块中:

from a.aa.module_A import AgeError
while True:
        x=input('请输入一个年龄数字:')
        try:
            if 1<=float(x)<=100:
                    print('您输入的年龄为:',x)
                    if float(x)==100:
                        print('长命百岁!程序已退出!')
                        break
            else:
                raise AgeError(x)
        except ValueError as e:
            print('您输入的年龄不是数字类型!')
with open('d:/test20.txt','r',encoding='utf-8') as f:
    print(f.read())

测试结果:

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值