《Python程序设计基础》-课件 李丽 项目八 Python 模块和包;项目九 Python 文件操作;项目十 综合性任务实践_第1页
《Python程序设计基础》-课件 李丽 项目八 Python 模块和包;项目九 Python 文件操作;项目十 综合性任务实践_第2页
《Python程序设计基础》-课件 李丽 项目八 Python 模块和包;项目九 Python 文件操作;项目十 综合性任务实践_第3页
《Python程序设计基础》-课件 李丽 项目八 Python 模块和包;项目九 Python 文件操作;项目十 综合性任务实践_第4页
《Python程序设计基础》-课件 李丽 项目八 Python 模块和包;项目九 Python 文件操作;项目十 综合性任务实践_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务1模块的导入和使用01任务2包的导入和使用02327任务1

模块的导入和使用3281. 了解模块的概念。2. 了解模块化编程的概念。3. 了解模块化程序设计的优越性。4. 熟悉模块的设计与实现方法。5. 掌握模块的导入、使用和重新加载方法。6. 掌握模块中成员的导入方法。7. 能进行模块及其元素的导入并调用模块。任务目标329一、模块的概念在前面的项目中已经使用了很多模块(如string、time等),通过向程序中导入这些模块,可以使用很多“现成”的函数实现需要的功能。模块就是Python程序。换句话说,任何Python程序都可以作为模块。经过前面的学习,我们已经能够将Python代码写到一个文件中,但随着程序功能越来越复杂,程序体积会不断变大,为了便于维护,通常会将其分为多个文件(模块),这样不仅可以提高代码的可维护性,还可以提高代码的可重用性。相关知识330代码的可重用性体现在,当编写好一个模块后,只要编程过程中需要用到该模块中的某个功能(由变量、函数、类实现),无须做重复性的编写工作,直接在程序中导入该模块即可使用该功能。前面讲了封装,并且介绍了很多具有封装特性的结构,如诸多容器(列表、元组、字符串、字典等),它们都是对数据的封装;函数是对Python代码的封装;类是对方法和属性的封装,也可以说是对函数和数据的封装。模块可以理解为对代码更高级的封装,即把能够实现某一特定功能的代码编写在同一个Python文件中,并将其作为一个独立的模块,这样既可以方便其他程序或脚本导入并使用,又能有效避免函数名和变量名发生冲突。331二、模块化编程1. 模块化程序设计在进行程序设计时,将系统按照功能划分为若干部分,每个部分完成特定功能,通过在不同部分间建立联系实现互相协作,完成系统功能的方式称为模块化程序设计,这些提供计算功能的程序块称为模块(或函数模块),导入并使用这些模块的程序称为客户端程序。使用模块可以将计算任务分解为大小合理的子任务,并实现代码的重用。3322. 模块的API在模块化程序设计中,客户端使用模块所提供的函数时,无须深入了解函数的内部实现细节。模块与客户端之间的协定称为API(applicationprogramminginterface,应用程序接口)。API清楚地描述了模块中提供的函数的功能和使用方法。模块化程序设计的基本原则是,首先设计好API,即定义模块所提供的函数或类的功能描述。然后,在此基础上编写具体的程序代码实现模块中的函数或类。最后,客户端可以通过导入模块,并使用其中的函数或类,实现所需的功能,而无须关心其内部的具体实现细节。333通过内置函数help可以查看Python模块的API。其语法格式如下。import模块名help(模块名)在查看模块的API之前,需要使用import语句导入模块,也可以使用Python在线帮助查看模块的API。3343. 模块的实现“实现”是指实现用于重用的函数或类的代码,模块的实现就是若干实现函数或类的代码的集合,保存在扩展名为“.py”的文件中。模块的实现必须遵循API,可以采用不同算法实现API,这为模块的改进和版本升级提供了无缝对接,只需要使用遵循API的新的实现,所有客户端程序无须修改即可正常运行。模块通常是使用Python编写的程序(“.py”文件)。Python内置模块使用C编写并已链接到Python解释器中,还可以使用C或C++拓展编写模块(编译为共享库或DLL文件)。3354. 模块的客户端客户端在使用模块时,需要遵循模块所提供的API调用接口,以导入和调用模块中已实现的函数功能。API的存在使得任何客户端都可以直接使用模块,而无须深入检查模块内部的代码实现。336三、模块化程序设计的优越性模块化程序设计是现代程序设计的基本理念之一,具有如下优越性。(1)可以编写大规模的系统程序:通过把复杂的任务分解为多个子任务,团队合作开发,以完成大规模的系统程序。(2)控制程序的复杂度:分解后的子任务的实现模块代码规模一般被控制在数百行之内,从而可以控制程序的复杂度,各代码调试可以限制在少量的代码范围内。(3)实现代码重用:一旦实现了通用模块(如math、random等),任何客户端都可以通过导入模块直接重用代码,而无须重复实现。(4)增强程序的可维护性:模块化程序设计可以增强程序的可维护性。337四、模块的设计与实现1. 模块设计的一般原则(1)先设计API,再实现模块。(2)控制模块的规模,只为客户端提供需要的函数。实现包含大量函数的模块会导致模块的复杂度高。(3)在模块中编写测试代码,并消除全局代码。(4)使用私有函数实现不被外部客户端调用的模块函数。(5)通过文档提供模块帮助信息。3382. API设计API通常由可用函数的签名的精确规范和描述函数作用的非正式自然语言两部分组成。API一般使用表格的形式描述模块中的变量、函数和类。在编写一个新模块时,建议先设计API,然后实现模块。3393. 创建模块Python模块对应于包含Python代码的源文件(其扩展名为“.py”)。在模块中除了可以定义变量、函数和类,还可以包含一般的语句,即主块语句。当运行该模块或导入该模块时,主块语句将依次执行。一般而言,独立运行的源码中主要包含主块语句,以实现响应的功能。作为库的模块,主要包含可供调用的变量、函数和类,还可以包含用于测试的主块代码。注意:主块代码只在模块第一次被导入时执行,重复导入时不会多次导入、多次执行。3404. 模块的私有函数在实现模块时,有时候需要在模块中定义仅在模块中使用的辅助函数。辅助函数不提供给客户端直接调用,故称之为私有函数。按惯例,应使用以下画线开始的函数名作为私有函数名。私有函数在客户端不能直接调用,故API中不包括私有函数。Python没有强制不允许调用私有函数的机制,但应避免直接调用私有函数。3415. 模块的测试代码每一个模块都有一个名称,通过特殊变量__name__可以获取模块的名称。特别地,当一个模块被用户单独运行时,其__name__的值为'__main__',故可以把模块源码文件的测试代码写在相应的测试判断中,以保证只有单独运行模块时才会运行测试代码。3426. 编写模块文档字符串在程序源码中,可以在特定的地方添加描述性文字,以说明包、模块、函数、类、类方法的相关信息。在函数的第一个逻辑行的字符串称为函数的文档字符串。函数的文档字符串用于提供有关函数的帮助信息。文档字符串一般遵循下列惯例:文档字符串是一个多行字符串;首行以大写字母开始,以句号结尾;第二行是空行;从第三行开始是详细的描述。343用户可以使用以下三种方法抽取函数的文档字符串帮助信息。(1)使用内置函数help。(2)使用函数的特殊属性:函数名.__doc__。(3)使用第三方自动化工具抽取文档字符串信息,以形成帮助文档。3447. 按字节编译的“.pyc”文件在导入模块时,Python解释器为提高程序的启动速度,会在与模块文件同一目录的__pycache__子目录下生成“.pyc”文件。“.pyc”文件是经过编译后的字节码,这样下次导入时如果模块源码“.py”文件没有修改(通过比较两者的时间戳),则直接导入“.pyc”文件,从而提高编程效率。按字节编译的“.pyc”文件在导入时由Python解释器自动完成,无须手动编译。345五、导入模块和使用模块1. 通过import语句导入模块使用import语句可以导入模块。其基本形式如下。import模块名

#导入模块import模块1,模块2,…,模块n

#导入多个模块import模块名as模块别名

#导入模块并使用别名其中,模块名是要导入的模块的名称。注意:模块名区分大小写。3462. 通过内置函数__import__导入模块使用内置函数__import__可以动态导入模块。其基本形式如下。_m=__import__(name)

#将模块name导入_m内置函数__import__有较大的灵活性,如要导入的模块name可以是计算的结果字符串,但一般不直接使用。事实上,import语句在内部调用该函数。3. 使用模块一般在Python源程序的开始位置导入其他模块。在导入模块后,可以使用全限定名称访问模块中定义的成员,即模块名.函数名/变量名347六、导入模块中的成员Python使用from...import语句直接导入模块中的成员。其基本形式如下。from模块名import成员名

#导入模块中的具体成员成员名

#直接调用如果希望同时导入一个模块中的多个成员,可以采用以下形式。from模块名import成员名1,成员名2,…,成员名n如果希望同时导入一个模块中的所有成员,则可以采用以下形式。from模块名import*348注意:虽然from...import语句可以简化代码,但应避免使用,因为这样可能导致名称冲突(如导入多个模块时,多个模块中可能存在同一个名称的函数),且导致程序的可读性差(如导入多个模块时,无法准确确定某个名称的函数具体属于哪一个模块)。349七、重新加载模块importlib模块中的reload函数用于重新加载之前导入过的模块,一般用于交互式执行Python代码不退出解释器的情况,重新加载已更改的Python模块。需要注意的是,重新加载内存中不存在的模块(未导入过)会导致运行错误。350任务2

包的导入和使用3511. 了解包的基本概念。2. 掌握包的创建、导入和使用方法。3. 能正确地从包中导入模块,实例化函数并输出对象地址。任务目标352一、Python的包Python模块是“.py”文件,而包是文件夹。通常,只要文件夹中包含一个特殊的文件“__init__.py”,Python解释器就将该文件夹作为包,其中的模块文件(“.py”文件)属于包中的模块。特殊文件“__init__.py”可以为空,也可以包含属于包的代码,当导入包或该包中的模块时执行“__init__.py”。包可以包含子包,没有层次限制。使用包可以有效避免名称空间冲突。相关知识353354二、创建包包和模块组成的层次组织结构对应文件夹和模块文件。创建包,首先需要在指定目录中创建对应包名的目录,然后在该目录下创建一个特殊文件“__init__.py”,最后在该目录下创建模块文件。355三、包的导入和使用在使用import语句导入包中的模块时需要指定对应的包名。其基本形式如下。import[包名1.[包名2…]].模块名#导入包中模块其中,包名是模块的上层组织包的名称。注意:包名和模块名区分大小写。在导入包中的模块后,可以使用全限定名称访问包中模块定义的成员。其基本形式如下。[包名1.[包名2…]].模块名.函数名#使用全限定名称调用模块中的成员用户也可以使用from...import语句直接导入包中模块的成员。其基本形式如下。from[包名1.[包名2…]].模块名import成员名同一个包/子包的模块,可以直接导入相同包/子包的模块,而不需要指定包名。这是因为同一个包/子包的模块位于同一个目录下。当直接导入包时(import包名),将执行包目录下的“__init__.py”(其中创建的名称有效),但不会导入包目录下的模块和子包(子目录)。356任务1认识文件01任务2使用文件操作函数完成文本的读写02任务3Python不同文件模块的使用03357任务4基于文件操作的异常处理04任务1认识文件3581. 了解文件路径的基本概念。2. 了解文件的两种路径。3. 了解文件操作基础。任务目标359一、文件路径在程序运行时,变量是临时存储数据的一种方式,一旦程序结束,这些数据将会丢失。如果希望在程序结束后数据仍然保留,就需要将数据保存到文件中。Python提供了内置的文件对象以及操作文件和目录的内置模块,通过这些技术,可以轻松地将数据存储到文件中。文件有两个重要属性:文件名和路径。文件名是为每个文件设置的名称,而路径则用来指明文件在计算机中的位置。相关知识360注意:路径中的“D:\”是指“根文件夹”,它包含了所有其他文件夹。在Windows系统中,根文件夹名为“D:\”,也称“D:”盘。在OSX和Linux系统中,根文件夹是“/”。本教材的示例使用的是Windows风格的根文件夹,如果在OSX或Linux系统中输入交互式环境的例子,应用“/”代替。另外,附加卷(如DVD驱动器或USB闪存驱动器)在不同的操作系统中的表示形式也不同。在Windows系统中,书写路径时使用反斜杠“\”作为文件夹之间的分隔符。361在交互式环境中输入如下代码。>>>importos>>>os.path.join('demo','exercise')'demo\\exercise'因为此程序是在Windows系统中运行的,所以os.path.join('demo','exercise')返回'demo\\exercise'(注意:反斜杠有两个,因为每个反斜杠需要由另一个反斜杠字符来转义)。如果在OSX或Linux系统中调用这个函数,该字符串就会是'demo/exercise'。如果需要创建带有文件名的文件存储路径,同样可以使用os.path.join函数。362二、绝对路径和相对路径绝对路径能够完整地表示出文件的真实位置,并且可以根据这个路径层级找到文件。在Windows系统中可以通过“Shift+鼠标右键”单击文件调出文件的绝对路径。调出文件绝对路径的方法如图所示,先按住Shift键,把光标移至需要获取绝对路径的文件图标处,单击鼠标右键,在弹出的菜单中选择“复制文件地址”命令,即可将其绝对路径复制到剪贴板处。363相对路径即相对于当前工作文件夹,目标文件夹的路径。以Windows系统为例,“.\”代表当前目录,“..\”代表上一层目录,“\”代表根目录。364调出文件绝对路径的方法三、文件操作基础(1)文件的基本操作:作用于文件本身,属于系统级操作。●创建文件:使用内置的open函数创建一个新文件,并返回一个文件对象。可以指定文件的名称、打开模式和编码等参数。●删除文件:使用os.remove函数删除指定的文件。●修改权限:使用os.chmod函数修改文件的权限。可以设置文件的所有者、组和其他用户的权限。●重命名文件:使用os.rename函数重命名指定的文件。●移动文件:使用shutil.move函数移动指定的文件到新的位置。365(2)文件的读写操作:最常用的文件操作,作用于文件的内容,属于应用级操作。●读取文件:使用文件对象的read()方法读取文件内容。可以一次读取全部内容,也可以按行读取。●写入文件:使用文件对象的write()方法写入内容。可以一次写入一行或一次写入多行。其中,对文件的系统级操作功能单一,比较容易实现,可以借助Python中的专用模块(os、sys等),并调用模块中的指定函数实现。366文件的应用级操作可以分为以下3步,每一步都需要借助对应的函数实现。●打开文件:使用open函数,该函数会返回一个文件对象。●对已打开的文件做读/写操作:读取文件内容可以使用read、readline以及readlines函数;向文件中写入内容可以使用write函数。●关闭文件:完成对文件的读/写操作之后,需要关闭文件,可以使用close函数。一个文件,必须在打开之后才能对其进行操作,并且在操作结束之后,还应将其关闭,操作顺序不能打乱。367任务2

使用文件操作函数完成文本的读写3681. 掌握常用文件操作函数的使用。2. 能运用文件操作函数进行读写等操作。任务目标369一、open函数在Python中,经常需要创建或打开指定的文件,并创建文件对象,这些操作可以通过内置的open函数实现。该函数的常用语法格式如下。file=open(file_name[,mode='r'[,buffering=-1[,encoding=None]]])在此格式中,用“[]”括起来的部分为可选参数,既可以使用,又可以省略。其中,各个参数的含义如下。●file:要创建的文件对象。相关知识370●file_name:要创建或打开文件的名称,若为字符串类型,需要用引号(单引号或双引号都可以)括起来。注意:如果要打开的文件和当前执行的代码文件位于同一目录,则直接写文件名即可;否则,此参数需要指定打开文件所在的完整路径。●mode:可选参数,用于指定文件打开模式。●buffering:可选参数,用于指定对文件做读写操作时,是否使用缓冲区。●encoding:手动设定打开文件时所使用的编码格式,不同平台的encoding参数值不同,以Windows系统为例,其默认为CP936(GBK)编码。371372二、read函数read函数用于逐个字节或字符读取文件中的内容。对于借助open函数,并以可读模式(包括r、r+、rb、rb+)打开的文件,可以调用read函数逐个字节(或逐个字符)读取文件中的内容。如果文件是以文本模式(非二进制模式)打开的,则read函数会逐个字符进行读取;反之,read函数会逐个字节进行读取。373read函数的基本语法格式如下。file.read([size])其中,file表示打开的文件对象;size作为一个可选参数,用于指定一次最多可读取的字符(字节)个数,如果省略,则默认一次性读取所有内容。374三、readline函数readline函数用于读取文件中的一行,包含最后的换行符“\n”。readline函数的基本语法格式如下。file.readline([size])其中,file表示打开的文件对象;size表示可选参数,用于指定读取每一行时,一次最多读取的字符(字节)数。和read函数一样,readline函数成功读取文件数据的前提是,使用open函数指定打开文件的模式必须为可读模式(包括r、rb、r+、rb+4种)。375四、readlines函数readlines函数用于读取文件中的所有行,它和调用不指定size参数的read函数类似,只不过该函数返回的是一个字符串列表,其中每个元素为文件中的一行内容。和readline函数一样,readlines函数在读取每一行时,会连同行尾的换行符一起读取。readlines函数的基本语法格式如下。file.readlines()其中,file表示打开的文件对象。与read、readline函数一样,readlines函数要求打开文件的模式必须为可读模式。376五、write函数Python中的文件对象提供了write函数,可以向文件中写入指定的内容。write函数的语法格式如下。file.write(string)其中,file表示打开的文件对象;string表示要写入文件的字符串(或字节串,仅适合写入二进制文件)。注意:在使用write函数向文件写入数据时,需保证使用open函数指定打开文件的模式必须为r+、w、w+、a或a+,否则执行write函数会报io.UnsupportedOperation错误。377六、writelines函数Python的文件对象中不仅提供了write函数,还提供了writelines函数,可以实现将字符串列表写入文件。注意:写入函数只有write和writelines函数,而没有名为writeline的函数。writelines函数的语法格式如下。file.writelines(list)其中,list表示字符串列表(如["小蓝","小红"])。378七、close函数对于使用open函数打开的文件,在完成相应的操作之后,需要用close函数将其手动关闭,否则程序的运行可能出现问题。close函数是专门用来关闭已打开文件的,其语法格式如下。file.close()其中,file表示打开的文件对象。任务3

Python不同文件模块的使用3791. 掌握Python不同文件模块的用法。2. 熟悉Python不同文件模块的常用函数。3. 能使用模块完成文件打开、处理及关闭等操作。任务目标380一、pickle模块pickle模块用于实现Python对象的持久化存储。Python中有一个序列化过程叫作pickle,它能实现任意对象与文本之间的相互转换,也能实现任意对象与二进制对象之间的相互转换。也就是说,pickle模块可以实现Python对象的存储及恢复。pickle模块是Python的一个标准模块,安装Python的同时就已经安装了pickle库,因此它不需要再单独安装,使用import将其导入程序,就可以直接使用。相关知识381pickle模块提供了以下4个函数可供使用。1. dumps函数dumps函数用于将Python中的对象序列化成二进制对象并返回,其语法格式如下。dumps(obj,protocol=None,*,fix_imports=True)各参数的含义如下。●obj:要转换的Python对象。●protocol:pickle的转码协议,取值为0、1、2、3、4,其中0、1、2对应Python早期的版本,3和4对应Python3.x版本及之后的版本。在未指定的情况下,其值默认为3。3822. loads函数loads函数用于读取给定的二进制对象数据,并将其转换为Python对象,其语法格式如下。loads(data,*,fix_imports=True,encoding='ASCII',errors='strict')其中,data表示要转换的二进制对象。3833. dump函数dump函数用于将Python中的对象序列化成二进制对象,并写入文件,其语法格式如下。dump(obj,file,protocol=None,*,fix_imports=True)各参数的含义如下。●obj:要序列化的Python对象。●file:转换到指定的二进制文件中,要求该文件必须是以“wb”打开模式进行操作。●protocol:和dumps函数中protocol参数的含义完全相同,即序列化时使用的协议版本。如果未指定,则使用默认协议版本。3844. load函数load函数用于读取指定的序列化数据文件,并返回对象,其语法格式如下。load(file,*,fix_imports=True,encoding='ASCII',errors='strict')其中,file表示要转换的二进制对象文件(必须以“rb”打开模式操作文件)。以上这4个函数可以分成两类,其中dumps函数和loads函数实现基于内存的Python对象与二进制对象互转;dump函数和load函数实现基于文件的Python对象与二进制对象互转。385386二、fileinput模块fileinput模块用于逐行读取多个文件的数据。前面学习了使用open函数和read函数或readline函数、readlines函数组合来读取单个文件的数据,但在某些场景中,可能需要读取多个文件的数据,在这种情况下再使用这些组合,显然就不合适了。对此,Python提供了fileinput模块,通过该模块中的input函数,能同时打开指定的多个文件,还能逐个读取这些文件中的内容。387fileinput模块中input函数的语法格式如下。fileinput.input(files="filename1,filename2,…",inplace=False,backup='',bufsize=0,mode='r',openhook=None)此函数会返回一个fileinput对象,它可以理解为将多个指定文件合并之后的文件对象。各参数的含义如下。●files:多个文件的路径列表。●inplace:指定是否将标准输出的结果写回文件,此参数默认值为False。388●backup:指定备份文件的扩展名。●bufsize:指定缓冲区的大小,默认为0。●mode:打开文件的模式,默认为r(只读模式)。●openhook:控制文件的打开方式,如编码格式等。注意:和open函数不同,input函数不能指定打开文件的编码格式,这意味着使用该函数读取的所有文件,除非以二进制方式进行读取,否则该文件的编码格式必须和当前操作系统默认的编码格式相同,不然Python解释器可能提示UnicodeDecodeError错误。和open函数返回单个的文件对象不同,fileinput对象无须调用类似read、readline、readlines这样的函数,直接通过for循环即可按次序读取多个文件中的数据。389fileinput模块中提供了很多函数,通过调用这些函数,可以更快地实现想要的功能。fileinput模块中提供的函数390三、linecache模块除了可以借助fileinput模块实现读取文件,Python还提供了linecache模块。linecache模块用于随机读取文件指定行。linecache模块常用来读取Python源文件中的代码,它使用UTF-8编码格式读取文件内容。因此,使用该模块读取的文件,其编码格式也必须为UTF-8,否则要么读取出来的数据是乱码,要么直接读取失败(Python解释器会报SyntaxError异常)。391linecache模块中常用的函数见下表。linecache模块中常用的函数392四、os.path模块os.path模块不仅提供了一些操作路径字符串的方法,还提供了一些指定文件属性的方法,os.path模块常用的函数见下表。linecache模块中常用的函数393linecache模块中常用的函数394linecache模块中常用的函数任务4

基于文件操作的异常处理3951. 了解异常的概念。2. 熟悉异常的处理方法和异常的传递。3. 掌握try...finally语句的使用方法。4. 能正确进行基于文件操作的异常处理。任务目标396一、异常的概念异常就是一个事件,在程序执行过程中遇到特殊情况时发生,帮助定位错误,了解程序实际运行状况。一般情况下,在Python无法按正常流程处理时就会发生一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时可以选择捕获并处理,若异常超出可处理的范围且没有被捕获,程序将会终止,防止造成更大的损失。相关知识397398二、异常处理1. 使用except不带任何异常类型捕捉异常可以使用try...except语句。try...except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。如果发生的异常是可以处理的,只需在try语句中捕获它。其语法格式如下。try:执行的代码except:执行的语句,如果在try部分引发了'name'异常else:如果没有任何异常执行的语句3992. 使用except带单一异常类型其语法格式如下。try:执行的代码except名称:执行的语句,如果在try部分引发了'name'异常else:如果没有任何

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论