Python第五章模块与函数

上传人:M****1 文档编号:570829233 上传时间:2024-08-06 格式:PPT 页数:75 大小:1,004.50KB
返回 下载 相关 举报
Python第五章模块与函数_第1页
第1页 / 共75页
Python第五章模块与函数_第2页
第2页 / 共75页
Python第五章模块与函数_第3页
第3页 / 共75页
Python第五章模块与函数_第4页
第4页 / 共75页
Python第五章模块与函数_第5页
第5页 / 共75页
点击查看更多>>
资源描述

《Python第五章模块与函数》由会员分享,可在线阅读,更多相关《Python第五章模块与函数(75页珍藏版)》请在金锄头文库上搜索。

1、PythonPython第五章模块与函数第五章模块与函数内容提要内容提要概述概述函数函数模块模块综合举例综合举例2024/8/62一、概述一、概述Python的程序由包、模块和函数组成。的程序由包、模块和函数组成。函数是一段可重用的有名称的代码。函数是一段可重用的有名称的代码。通过输入的参数值,通过输入的参数值,返回需要的结果,并可存储在文件中供以后使用。几乎任返回需要的结果,并可存储在文件中供以后使用。几乎任何何Python代码都可放在函数中。代码都可放在函数中。Python为函数提供了为函数提供了强大支持。强大支持。模块是处理某一类问题的集合,模块由函数和类组成。模块是处理某一类问题的集合

2、,模块由函数和类组成。模模块和常规块和常规Python程序之间的唯一区别是用途不同:模块程序之间的唯一区别是用途不同:模块用于编写其他程序。因此,模块通常没有用于编写其他程序。因此,模块通常没有main函数。函数。包是一个完成特定任务的工具箱包是一个完成特定任务的工具箱,Python提供了许多有提供了许多有用的工具包,如字符串处理、图形用户接口、用的工具包,如字符串处理、图形用户接口、Web应用、应用、图像处理等。使用自带的工具包,可以提高程序开发效率、图像处理等。使用自带的工具包,可以提高程序开发效率、减少编程复杂度,达到代码重用的效果。减少编程复杂度,达到代码重用的效果。2024/8/63

3、Python的程序结构:的程序结构:2024/8/64说明:说明:Python自带的工具包和模块安装在其安装目录的自带的工具包和模块安装在其安装目录的Lib子目录中。子目录中。例如:例如:Lib目录中的目录中的xml文件夹。文件夹。xml文件夹就是一文件夹就是一个包,该包用于完成个包,该包用于完成XML的应用开发,的应用开发,xml包中包包中包含四个子包:含四个子包:dom、sax、etree和和parsers。文。文件件_init_.py是是xml包的注册文件,若无此文件,包的注册文件,若无此文件,Python将不能识别将不能识别xml包。包。注意:包必须至少含有一个注意:包必须至少含有一个

4、_init_.py文件。文件。_init_.py文件的内容可以为空,它用于标识当文件的内容可以为空,它用于标识当前文件夹是一个包。前文件夹是一个包。2024/8/65二、函数二、函数1、函数的定义及调用、函数的定义及调用格式:格式:def函数名函数名(形参表形参表):函数体语句序列函数体语句序列return表达式表达式#可选项,即有的函数可以没有返回值。可选项,即有的函数可以没有返回值。函数调用:函数调用:函数名函数名(实参表实参表)说明:说明:函数必须先定义,后使用;函数必须先定义,后使用;函数名与变量名的命名规则相同,只能包含字母、数字和下划线函数名与变量名的命名规则相同,只能包含字母、数

5、字和下划线_,且不能以数字打头。,且不能以数字打头。2024/8/66例例5-1:定义计算圆面积的函数:定义计算圆面积的函数执行结果:执行结果:2024/8/672、函数的参数、函数的参数在在C、C+中,参数的传递有值传递和引中,参数的传递有值传递和引用传递两种方式。用传递两种方式。Python中任何东西都是中任何东西都是对象,所以参数只支持引用传递的方式。对象,所以参数只支持引用传递的方式。Python通过名称绑定的机制,把实际参数通过名称绑定的机制,把实际参数的值和形式参数的名称绑定在一起,即把的值和形式参数的名称绑定在一起,即把形式参数传递到函数所在的局部命名空间形式参数传递到函数所在的

6、局部命名空间中,形式参数和实际参数指向内存中同一中,形式参数和实际参数指向内存中同一个存储空间。个存储空间。2024/8/68(1)按引用传递参数)按引用传递参数向函数传递参数时,向函数传递参数时,Python采用按引用传采用按引用传递的方式。这意味着当传递参数时,函数递的方式。这意味着当传递参数时,函数将使用新变量名来引用原始值。将使用新变量名来引用原始值。例例5-2:求任意两个数的和。:求任意两个数的和。执行结果:执行结果:2024/8/69内存状态:内存状态:将将x和和y分别设置为分别设置为3和和4的内存状态:的内存状态:x3y4刚调用刚调用add(x,y)后的后的内存状态,内存状态,a

7、和和b分别分别指向指向x和和y指向的值。指向的值。x3aY4b2024/8/610(2)默认值)默认值函数的参数支持默认值。当某个参数没有传递实函数的参数支持默认值。当某个参数没有传递实际的值时,函数将使用默认参数计算。际的值时,函数将使用默认参数计算。带默认值的参数不能位于没有默认值的参数前面。带默认值的参数不能位于没有默认值的参数前面。例例5-3:默认值参数示例。:默认值参数示例。执行结果:执行结果:2024/8/611(3)关键字参数)关键字参数关键字参数有两大好处:关键字参数有两大好处:清晰地指出了参数值,有助于提高程序的可读清晰地指出了参数值,有助于提高程序的可读性;性;关键字参数的

8、顺序无关紧要。关键字参数的顺序无关紧要。调用使用关键字参数的函数时,以调用使用关键字参数的函数时,以param=value的方式传递参数的方式传递参数2024/8/612例例5-4:关键字参数示例:关键字参数示例执行结果:执行结果:2024/8/613课堂练习一:课堂练习一:课堂练习一2024/8/6143、函数的嵌套、函数的嵌套C、C+都支持函数的嵌套调用,都支持函数的嵌套调用,Python不仅不仅支持函数的嵌套调用,还支持函数的嵌套定义。支持函数的嵌套调用,还支持函数的嵌套定义。当然,尽量不要在函数内部定义函数,这种方式当然,尽量不要在函数内部定义函数,这种方式不便于程序维护,容易造成逻辑

9、上的混乱,且嵌不便于程序维护,容易造成逻辑上的混乱,且嵌套定义的函数层次越多,程序维护的代价就越大。套定义的函数层次越多,程序维护的代价就越大。例例5-5:分别使用函数的嵌套调用、函数的嵌套:分别使用函数的嵌套调用、函数的嵌套定义以及函数嵌套定义时直接引用外部函数的变定义以及函数嵌套定义时直接引用外部函数的变量等三种方式,计算表达式量等三种方式,计算表达式(x+y)*(m-n)的值。的值。2024/8/615嵌套调用函数:嵌套调用函数:执行结果:执行结果:嵌套调用函数示意图:嵌套调用函数示意图:2024/8/616嵌套定义函数:嵌套定义函数:嵌套定义函数示意图:嵌套定义函数示意图:执行结果:执

10、行结果:2024/8/617函数嵌套定义,内部函数直接引用外部函数函数嵌套定义,内部函数直接引用外部函数的变量:的变量:嵌套定义函数,直接引用外部函嵌套定义函数,直接引用外部函数的变量示意图:数的变量示意图:执行结果:执行结果:2024/8/618课堂练习二:课堂练习二:课堂练习二2024/8/6194、递归函数、递归函数(1)递归的概念)递归的概念递归函数可以在函数主体内直接或间接地调用自己,即递归函数可以在函数主体内直接或间接地调用自己,即函数的嵌套是函数本身。函数的嵌套是函数本身。递归是一种程序设计方法,使用递归可以减少重复的代递归是一种程序设计方法,使用递归可以减少重复的代码,使程序变

11、得简洁。码,使程序变得简洁。递归的过程分为两个阶段:递推和回归。递归的过程分为两个阶段:递推和回归。递归函数的原理:递归函数的原理:第一阶段,递归函数在内部调用自己。每一次函数调用又重第一阶段,递归函数在内部调用自己。每一次函数调用又重新开始执行此函数的代码,直到某一级递归程序结束。新开始执行此函数的代码,直到某一级递归程序结束。第二阶段,递归函数从后往前返回。递归函数从最后一级开第二阶段,递归函数从后往前返回。递归函数从最后一级开始返回,一直返回到第一次调用的函数体内。即递归函数逐始返回,一直返回到第一次调用的函数体内。即递归函数逐级调用完毕后,再按相反的顺序逐级返回。级调用完毕后,再按相反

12、的顺序逐级返回。2024/8/620(2)递归的实现)递归的实现一个问题能否用递归实现,看其是否具有一个问题能否用递归实现,看其是否具有下面的特点:下面的特点:需有完成任务的递推公式。需有完成任务的递推公式。结束递归的条件。结束递归的条件。编写递归函数时,程序中必须有相应的语编写递归函数时,程序中必须有相应的语句:句:一个递归调用语句。一个递归调用语句。测试结束语句。先测试,后递归调用。测试结束语句。先测试,后递归调用。2024/8/621例例5-6:用递归方法求:用递归方法求n!递归公式:递归公式:1n=1n!=n*(n-1)!n1例如,使用递归计算例如,使用递归计算5!的过程:!的过程:2

13、024/8/622源程序及执行结果:源程序及执行结果:执行结果:执行结果:2024/8/623例例5-7:编程求出:编程求出Fibonacci数列的第数列的第n项。项。 Fibonacci数列定义如下:数列定义如下:1当当n=1时时F(n)=1当当n=2时时F(n-1)+F(n-2)当)当n2时时假定求出第八项。假定求出第八项。分析:分析:Fibonacci数列的计算具备递归的条件。数列的计算具备递归的条件。首先有递推公式首先有递推公式F(n)=F(n-1)+F(n-2),),第二有结束递归的条件即第二有结束递归的条件即n=0或或n=1时不再递归。时不再递归。2024/8/624源程序及执行结

14、果:源程序及执行结果:执行结果:执行结果:2024/8/625(3)递归的评价与消除递归)递归的评价与消除递归递归程序虽然易读、易编,但需要占用额递归程序虽然易读、易编,但需要占用额外的内存空间,并且执行速度也受影响。外的内存空间,并且执行速度也受影响。是否利用递归编程要看实际问题,如果要是否利用递归编程要看实际问题,如果要节约内存就用循环语句实现。若对内存要节约内存就用循环语句实现。若对内存要求并不高,可以用递归编程。求并不高,可以用递归编程。如果不用递归程序很难实现,则只能选择如果不用递归程序很难实现,则只能选择递归算法。递归算法。2024/8/6265、lambda函数函数Lambda函

15、数用于创建一个匿名函数,函数名未函数用于创建一个匿名函数,函数名未和标识符进行绑定。和标识符进行绑定。使用使用lambda函数可以返回一些简单的运算结果。函数可以返回一些简单的运算结果。格式:格式:lambda变量变量1,变量变量2:表达式表达式功能:通常功能:通常lambda赋值给一个变量,变量即可赋值给一个变量,变量即可作为函数使用;也可以直接把作为函数使用;也可以直接把lambda直接作为直接作为函数使用。函数使用。2024/8/627例例5-8:用:用lambda函数改造例函数改造例5-5-3。执行结果:执行结果:2024/8/628例例5-9:使用:使用lambda定义求绝对值的匿名

16、定义求绝对值的匿名函数。函数。执行结果:执行结果:2024/8/6296、Generator函数函数Generator函数的作用是一次产生一个数据项,并函数的作用是一次产生一个数据项,并把数据项输出。把数据项输出。格式:格式:def函数名函数名(参数列表参数列表):yield表达式表达式说明:说明:Generator函数的定义与普通函数的区别只函数的定义与普通函数的区别只是在函数体内使用是在函数体内使用yield生成数据项。生成数据项。Generator函数可以被函数可以被for循环中遍历,且可以通过循环中遍历,且可以通过_next_()方法(方法(Python2是是next方法)获得方法)获

17、得yield生成的生成的数据项。数据项。2024/8/630例例5-10:用三种方法求:用三种方法求斐波那契斐波那契(Fibonacci)数列的前数列的前N项项方法一:方法一:简单输出斐波那契數列前简单输出斐波那契數列前N项项执行结果:执行结果:2024/8/631说明:说明:结果没有问题,但直接在结果没有问题,但直接在fab函数中用函数中用print打印数字会导致该函数可复用性较打印数字会导致该函数可复用性较差,因为差,因为fab函数返回函数返回None,其他函数,其他函数无法获得该函数生成的数列。无法获得该函数生成的数列。要提高要提高fab函数的可复用性,最好不要直函数的可复用性,最好不要

18、直接打印出数列,而是返回一个接打印出数列,而是返回一个list(Python中的数据结构之一,是序列中的数据结构之一,是序列之一,由一组元素组成,值可改变之一,由一组元素组成,值可改变。后续后续详细介绍)详细介绍)2024/8/632方法二:定义一个函数,返回一个列表,列方法二:定义一个函数,返回一个列表,列表中包含了表中包含了斐波那契數列前斐波那契數列前N项项执行结果:执行结果:2024/8/633方法三:使用方法三:使用yield执行结果:执行结果:2024/8/634说明:说明:方法三与方法一相比,方法三与方法一相比,仅仅把仅仅把printb改为了改为了yieldb,就,就在保持简洁性的

19、同时获得了在保持简洁性的同时获得了iterable的效果。的效果。也可以手动调用也可以手动调用fab(5)的的_next_()方法方法,这样可以这样可以更清楚地看到更清楚地看到fab的执行流程的执行流程。当函数执行结束时,当函数执行结束时,generator自动抛出自动抛出StopIteration异常,表示异常,表示迭代完成。在迭代完成。在for循环里,无循环里,无需处理需处理StopIteration异常,异常,循环会正常结束。循环会正常结束。2024/8/635课堂练习三:课堂练习三:1、编写一个函数、编写一个函数iterPower(base,exp),用迭代的方式求,用迭代的方式求ba

20、seexp2、编写一个函数编写一个函数recurPower(base,exp),用递归的方式求,用递归的方式求baseexp2024/8/636三、模块三、模块模块实际上是将一组函数放在一起共享公模块实际上是将一组函数放在一起共享公共的主题共的主题将这些函数存储于一个将这些函数存储于一个.py文件中;文件中;使用使用import命令导入。命令导入。2024/8/6371、模块的创建及导入、模块的创建及导入创建模块,即创建一个创建模块,即创建一个.py文件,在其中包文件,在其中包含用于完成任务的变量、类和函数,不包含用于完成任务的变量、类和函数,不包括括main函数。函数。模块使用之前要导入该模

21、块,导入方法之模块使用之前要导入该模块,导入方法之前已做过介绍。前已做过介绍。例例5-11:创建模块,用于在屏幕上打印各:创建模块,用于在屏幕上打印各种形状。种形状。2024/8/638定义的模块定义的模块shapes及使用模块的源程序:及使用模块的源程序:2024/8/639执行结果:执行结果:2024/8/640例例5-12:创建一个求圆面积、圆周长、圆表:创建一个求圆面积、圆周长、圆表面积和圆体积的模块面积和圆体积的模块确认将此代码保存为名确认将此代码保存为名称为称为circle.py的文件的文件2024/8/641调用方式一:调用方式一:2024/8/642调用方式二:调用方式二:20

22、24/8/6432、模块的属性、模块的属性模块有一些内置属性,用于完成特定的任务。模块有一些内置属性,用于完成特定的任务。例例5-11中的中的dir(shapes),就输出了模块,就输出了模块shapes的属性。的属性。如:如:_doc_:模块中用于描述的文档字符串:模块中用于描述的文档字符串_name_:模块名:模块名_file_:模块保存的路径:模块保存的路径2024/8/6443、模块的内置函数、模块的内置函数Python提供了一个内联模块提供了一个内联模块buildin。该。该模块定义了一些常用函数,利用这些函数模块定义了一些常用函数,利用这些函数可以实现数据类型的转换、数据的计算、可

23、以实现数据类型的转换、数据的计算、序列的处理等功能。序列的处理等功能。2024/8/645(1)filter()声明:声明:Classfilter(object)filter(functionorNone,iterable)-filterobject功能:功能:filter()可以对某个序列做过滤处理,可以对某个序列做过滤处理,根据自定义函数返回的结果是否为真来过根据自定义函数返回的结果是否为真来过滤,并一次性返回处理结果。返回结果是滤,并一次性返回处理结果。返回结果是filter对象。对象。2024/8/646例例5-13:filter()函数应用函数应用执行结果:执行结果:2024/8/6

24、47(2)reduce()声明:声明:reduce(func,squence,initail)-value功能:对序列中的元素进行连续操作。例如:可功能:对序列中的元素进行连续操作。例如:可对某个序列中的元素进行累加、累乘和阶乘等操对某个序列中的元素进行累加、累乘和阶乘等操作。作。说明:在说明:在Python2中,中,reduce存在于全局空存在于全局空间中,可直接调用。而在间中,可直接调用。而在Python3中将其移到中将其移到了了functools模块中,所以使用之前要先引入。模块中,所以使用之前要先引入。2024/8/648例例5-14:reduce()函数应用函数应用执行结果:执行结果

25、:2024/8/649(3)map()声明:声明:Classmap(object)map(func,*iterables)-mapobject功能:对多个序列的每个元素都执行相同功能:对多个序列的每个元素都执行相同的操作,并返回一个的操作,并返回一个map对象。对象。2024/8/650例例5-15:map()函数应用。求列表中数字函数应用。求列表中数字的幂运算。的幂运算。执行结果:执行结果:2024/8/651常用内置模块函数(一):常用内置模块函数(一):函函数数描描述述abs(x)返回返回x的绝对值的绝对值bool(x)将一个值或表达式转换为将一个值或表达式转换为bool类型。如果表达式

26、类型。如果表达式x为真返回为真返回True,否则返回,否则返回Falsedelatrr(obj.name)等价于等价于delobj.nameeval(s,globals,locals)计算表达式的值计算表达式的值float(x)将数字或字符串转换为将数字或字符串转换为float类型类型hash(object)返回一个对象的返回一个对象的hash值值help(object)返回内置函数的帮助说明返回内置函数的帮助说明id(x)返回一个对象的标识返回一个对象的标识input(prompt)接收控制台的输入,并将输入的值转换为数字接收控制台的输入,并将输入的值转换为数字int(x)将数字或字符串转换

27、为整型将数字或字符串转换为整型2024/8/652常用内置模块函数(二):常用内置模块函数(二):函函数数描描述述len(obj)对象包含的元素个数对象包含的元素个数range(start,end,step)生成一个列表并返回生成一个列表并返回reduce(func,sequence,initial)对序列的值进行累计计算对序列的值进行累计计算round(x,n=0)四舍五入函数四舍五入函数set(iterable)返回一个返回一个set集合集合sorted(iterable,cmp,key,reverse)返回一个排序后的列表返回一个排序后的列表sum(iterable,start=0)返回

28、一个序列的和返回一个序列的和type(obj)返回一个对象的类型返回一个对象的类型zip(iter1,iter2)将将n个序列作为列表的元素返个序列作为列表的元素返回回2024/8/6534、自定义包、自定义包除了系统自带的包之外,还可以自定义包。除了系统自带的包之外,还可以自定义包。之前已经介绍过,包至少含有一个之前已经介绍过,包至少含有一个_init_.py文件。文件。_init_.py文件的内文件的内容可以为空,它用于标识当前文件夹是一个包。容可以为空,它用于标识当前文件夹是一个包。包的作用是为了程序的重用,把实现一些特定包的作用是为了程序的重用,把实现一些特定功能的代码组合到一个包中,

29、调用包提供的功功能的代码组合到一个包中,调用包提供的功能从而实现重用。能从而实现重用。2024/8/654例:一个包与模块的树形关系例:一个包与模块的树形关系定义一个包定义一个包parent。在。在parent包中创建两个子包包中创建两个子包pack和和pack2。Pack包中定义了一个模块包中定义了一个模块myModule,pack2包中定义了一个模包中定义了一个模块块myModule2。最后在包最后在包parent中定义一个模块中定义一个模块main,调用包,调用包pack和和pack2。2024/8/655包包pack的初始化程序及的初始化程序及myModule模块:模块:2024/8/

30、656包包pack2的初始化程序及的初始化程序及myModule2模块:模块:2024/8/657包包parent中的中的main模块及执行结果:模块及执行结果:main模块执行结果:模块执行结果:2024/8/6584、第三方模块的导入、第三方模块的导入(1)单文件模块单文件模块直接把文件拷贝到直接把文件拷贝到$python_dir/Lib(2)多文件模块,带多文件模块,带setup.pypythonsetup.pyinstall2024/8/659例例5-16:导入第三方模块:导入第三方模块requestsrequests简介:简介:requests是是python的的一个一个HTTP客户

31、端库。支持客户端库。支持HTTP连接保连接保持和连接池,支持使用持和连接池,支持使用cookie保持会话,保持会话,支持文件上传,支持自动确定响应内容的支持文件上传,支持自动确定响应内容的编码,支持国际化的编码,支持国际化的URL和和POST数据数据自动编码。自动编码。2024/8/660步骤步骤1:去第三方库的网站(去第三方库的网站(https:/pypi.python.org)下载安装)下载安装包,解压在包,解压在python的安装目录。的安装目录。注意第三方库的文件夹的位置以及注意第三方库的文件夹的位置以及setup.py的位置。的位置。本例在本例在Python2.7下安装的。下安装的。

32、2024/8/6612024/8/662步骤步骤2:运行运行cmd,进入命令行。利用,进入命令行。利用cd命令进入命令进入第三方库文件夹的位置。第三方库文件夹的位置。2024/8/663步骤步骤3:2024/8/664安装完成安装完成2024/8/665步骤步骤4:最后进入命令行,最后进入命令行,import库名称,观察第库名称,观察第三方库是否安装成功。三方库是否安装成功。2024/8/666四、综合举例四、综合举例1、用函数完善计算、用函数完善计算编编写求根的函数写求根的函数调用函数:调用函数:第三个函数调用为无限循环,为第三个函数调用为无限循环,为什么什么?2024/8/667进一步完善

33、:将求负数的奇数次根的情况考进一步完善:将求负数的奇数次根的情况考虑在内:虑在内:调用函数:调用函数:第四个函数调用为无限循环,为第四个函数调用为无限循环,为什么什么?2024/8/668进一步完善:将分数的情况也考虑在内:进一步完善:将分数的情况也考虑在内:调用函数:调用函数:2024/8/669进一步完善:增加一个说明进一步完善:增加一个说明2024/8/6702、递归经典程序、递归经典程序汉诺(汉诺(Hanoi)塔问题)塔问题这是一个古典的数学问题,是一个只能用这是一个古典的数学问题,是一个只能用递归方法解决的问题。递归方法解决的问题。问题源于印度一个古老传说,古代有一个问题源于印度一个

34、古老传说,古代有一个梵塔,塔内有三个柱子梵塔,塔内有三个柱子A、B、C,开始时,开始时A柱上有柱上有64个盘子,盘子大小不等,大的个盘子,盘子大小不等,大的在下,小的在上。想将这在下,小的在上。想将这64个盘子从个盘子从A柱柱移到移到C柱,但每次只允许移动一个盘子,且柱,但每次只允许移动一个盘子,且在移动过程中都始终保持大盘在下,小盘在移动过程中都始终保持大盘在下,小盘在上。在移动过程中可以利用在上。在移动过程中可以利用B柱。柱。2024/8/671递归算法描述:递归算法描述:1、将、将A上上n-1个盘借个盘借助助C座先移到座先移到B座。座。2、将、将A座上剩下的一座上剩下的一个盘移到个盘移到

35、C座。座。3、将、将B上上n-1个盘借个盘借助于助于A座移到座移到C座。座。2024/8/672说明:说明:上述算法中的第上述算法中的第1步和第步和第3步,都是将步,都是将n-1个盘子个盘子从一个座移到另一个座,只是座的名称不同而已。从一个座移到另一个座,只是座的名称不同而已。为使之一般化,可将第为使之一般化,可将第1步和第步和第3步表示为:步表示为:将将“one”座上座上n-1个盘移到个盘移到“two”座(借助座(借助“three”座)。只是在第座)。只是在第1步和第步和第3步中,步中,one、two、three和和A、B、C的对应关系不同。的对应关系不同。对第对第1步:步:one-A、two-B、three-C对第对第3步:步:one-B、two-C、three-A2024/8/673程序及执行结果:程序及执行结果:执行结果:执行结果:2024/8/674结束!结束!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号