1、什么是模块?
在Python中,一个py文件就是一个模块,文件名为xxx.py模块名则是xxx,导入模块可以引用模块中已经写好的功能。除了自定义模块外,我们还可以导入使用内置模块或第三方模块提供的现成功能,这种“拿来主义”极大地提高了程序员的开发效率。--体现了python开发的便捷与强大。
2、怎么使用模块?
全部导入:import xxx、from xxx import *
指定导入:import module.xx as yy、from module import xx
导入顺序与书写规范:先导入python内置模块,然后是第三方模块,最后是自定义模块,且用空行区分开三种类型的模块导入
as:通常在被导入的名字过长时采用起别名的方式来精简代码,另外为被导入的名字起别名可以很好地避免与当前名字发生冲突,通过if结构还可以保持调用方式的一致性
*:模块的编写者可以在自己的文件中定义__all__变量用来控制*代表的意思
__all__:一个列表,元素为规定该模块可以被其他模块导入的变量名,函数名,类名。注意元素必须是字符串。此规定不影响指定导入方式。
搜索路径设置:当前模块执行sys.path.append(需要导入的模块的路径)或者将文件夹Mark Directory as成source root的方法
__name__:每个py文件都有一个__name__属性,if __name__ == "main",表示该文件是主程序文件,否则表示该文件只是个模块,作用是被导入使用其功能。
3、什么是包?
包就是一个含有__init__.py文件的文件夹,文件夹内可以组织子模块或子包。随着模块数目的增多,把所有模块不加区分地放到一起也是极不合理的,于是Python为我们提供了一种把模块组织到一起的方法,即创建一个包。
包是用来干嘛的呢?package和directory的区别就是多了一个__init__.py文件,包属于模块的一种,因而包以及包内的模块均是用来被导入使用的,而绝非被直接执行。
__init__.py:文件内容是import xxx和from 本包 import xxx等导入语句和__all__列表。xxx表示本包下的子包和子模块,不写导入语句则本包下xxx不能被导入使用,使用时会抛异常AttributeError。而编写__all__列表的目的则和模块是一样的,用来控制*代表的意思。
4、绝对导入和相对导入?
编写包内的__init__.py时,建议使用相对导入,如from . import xxx。. 表示当前文件(__init__.py)所在的文件夹,.. 表示当前包所在的文件夹。
5、什么是异常?
程序运行一旦出现错误Error,便会产生一个异常,若程序中没有处理它,就会抛出该异常,程序终止运行。
- 定义:运行时检测到的错误。
- 现象:当异常发生时,程序不会再向下执行,而转到异常类的调用语句。
- 常见异常类型:
- NameError:变量未定义。
- TypeError:不同类型数据进行运算。
- IndexError:超出索引范围。
- AttributeError:对象没有对应名称的属性。
- KeyError:没有对应名称的键。
- ValueError:值错误,如int('a12')
- ZeroDivisionError:除数不能为0
- Exception:异常基类。
6、异常处理?
try: 可能触发异常的语句 except 错误类型1 [as 变量1]: 处理语句1 except 错误类型2 [as 变量2]: 处理语句2 except Exception [as 变量3]: 不是以上错误类型的处理语句 else: 未发生异常执行的语句 finally: 无论是否发生异常都执行的语句
- 作用:将程序跳过异常,继续执行。
- 说明:
- as 子句是用于绑定错误对象的变量,可以省略
- except子句可以有一个或多个,用来捕获某种类型的错误。
- else子句最多只能有一个。
- finally子句最多只能有一个,如果没有except子句,必须存在。
7、如何调用异常类?
raise语句:raise 异常类
- 作用:抛出一个错误,让程序进入异常状态。
- 目的:在程序调用层数较深时,向主调函数传递错误信息要层层return 比较麻烦,所以人为抛出异常,可以直接传递错误信息。
8、自定义异常类
#定义: class 类名Error(Exception): def __init__(self,参数): super().__init__() self.数据 = 参数 #调用: try: … raise 自定义异常类名(参数) except 类名Error as 变量名: 变量名.数据 #作用:封装错误信息
举例:
class AgeError(Exception):
def __init__(self, message="", code="", id=0):
super(AgeError, self).__init__()
# 消息/错误代码/错误编号....
self.message = message
self.code = code
self.id = id
class Wife:
def __init__(self, age=0):
self.age = age
@property
def age(self):
return self.__age
@age.setter
def age(self, value):
if 20 <= value <= 30:
self.__age = value
else:
# 抛出/发送 错误信息(异常对象)
raise AgeError("我不要", "20 <= value <= 30", 404)
# 需要传递的信息:消息/错误代码/错误编号....
# 接收错误信息
try:
w01 = Wife(32)
print(w01.age)
except AgeError as e:
print(e.id) # 404
print(e.message) # 我不要
print(e.code) # 20 <= value <= 30