Python笔记——python函数详解(超详细)_python函数大全及详解
首先, 即便你完全是零基础也是可以学习的, 因为有很多成为编程高手的大佬, 在刚开始入门之前也都是先从头开始学习, 所以你如果真心想学就应该勇敢地去学, 毕竟在任何一种技能的学习过程中, 没开始学习之前每个人的起点都是零, 因此即使是现在才下定决心要去学习这种情况也不必感到害怕, 因为在任何一个时间点开始学习这件事从性质上来说都绝对不能算作是晚的。对于零起点的人群而言, 怎样去掌握这项技能呢? 作为一个已经经历了两三年学习过程的过来人。因为我当初也是从零起步, 并且在不断摸索中前行的。因此。我在这里给那些想要开始学习的新手们。分享一些我个人在学习过程中的心得体会。目录一.重新认识函数咱们先把那个函数定义的事情放在一边, 不谈, 因为把定义往章节的前面摆, 这很明显就是一种偷懒的表现, 也就是懒得把那事儿给掰开揉碎了讲清楚, 相信你之前在看别的教材的时候, 也是这样觉得的, 所以, 我觉得呢, 经过了第一章的阅读和训练以后, 你已经把函数的用法给弄明白了。print是一个函数, 它放入一个对象就能将结果打印出来, input是一个可以让用户输入信息的函数, len是一个可以测量对象长度的函数。int 是一个可以将字符串类型的数字转换成整数类型的函数通过观察规律, 其实不难发现, 这里所谓的使用函数, 就是把你要处理的对象放到一个名字后面的括号里就可以了。简单的来说, 函数就是这么使用的, 可以往里面塞东西, 就得到处理结果。这样的函数在当中还有这些, 比如函数链接, 有兴趣深入了解的话可以看一眼。二.开始创建函数我们要学会使用现成的函数, 同时更要学会自己去发明新的函数。因为系统自带的函数种类是有限的, 如果想要让程序来帮我们处理更多的事务, 就必须按照自己的需要来设计出相应的函数。其实创建新函数的方法并不复杂, 这个知识点的原理, 我们在很多年前的初中阶段就已经掌握过了。先试着去命令行, 或者说是终端里面, 进入到那个环境里面, 然后输入这样子的一个公式, 看着是不是有点眼熟呢? 第一个是数学上面的梯形的计算的一个公式, 而第二个是物理里面的摄氏度与华氏度之间的转换的那个公式吧。 也就是直接会返回结果给你了。那么, 现在大家把那段带有名为a的引号的文本读一遍好不好, 这个文本里面包含有两个参数, 第一个是arg1, 第二个是arg2, 那个带横线的引号是不是很顺口、很容易就念出来了? 其实如果用代码来写的话, 它比写成一整句英文还要简短一些。有一点是需要我们去注意的。def 是关键字, ()也是关键字, 系统就是依靠识别这些特定的关键字来明白用户的意图, 从而实现更为复杂的编程操作, 类似这样的关键字还有一些, 在后面的章节中我们会细致讲解。在闭合括号后面的地方, 冒号这个东西是必须存在的, 而且这一点需要特别留心, 就是你一定要用英文输入法来打出这个冒号和括号, 要是用了错误的输入法导致语法不对, 那就不行了, 如果你在集成开发环境里面输入了中文状态下的冒号和括号, 系统就会给你抛出这样的错误提示: 另外一点值得注意的是, 如果你在集成开发环境中发现冒号后面有个回车行为也就是换行操作的话, 那么系统会自动地帮你生成一个缩进效果。在函数中, 处于缩进后面的那些语句通常被称为是语句块, 使用缩进这种方式的目的是为了显示出各个语句之间以及在整体逻辑上的从属关系, 而这一个特点是非常显著的、也是最容易被注意到的特征之一定位之一, 然而许多刚开始学习编程的人往往会对缩进这一要求给予忽视的态度, 这就很可能会使得最终的代码没有办法被成功地执行和运行, 所以对于这一点是需要进行格外特别的关注和重视的。现在咱们来看一下前面提到的把摄氏度转换成华氏度的那个公式, 要按照上面介绍的那一种去定义函数的办法来实实在在地做一遍。把那种转换的操作专门定义为函数()的话, 往里面送进去的那个东西就肯定得是代表摄氏度()的数值了。咱们把这个表示摄氏度的量设置为参数C, 最后头儿上返回出来的那个结果就应当是华氏度()对应的数值的。咱就用下面给出的这种形式的函数把它给它表述出来, 赶紧输入那相应的代码吧:def fahrenheit_converter(C):fahrenheit C * 9/5 32return str(fahrenheit) ?F计算出来的结果的类型是属于整数的, 也就是说是int类型的, 这一点是不能够和字符“下”直接进行拼接合并的操作的, 正因为如此, 所以必须要先使用str()这个函数去把原本的计算结果转换成字符串的类型。以上代码都输入完毕, 那函数算是定义好了。现在开始用它, 我们管这种行为叫做叫“调用”(call), 你把它简单看成是你去请求别人来帮你做事情。这跟之前咱们学过的函数 len() 很像: “请你帮我测一下这个(对象)的长度, 然后再把结果给打印出来。”。lyric_length len(I Cry Out For Magic!)print(lyric_length)这个操作的过程, 就跟我们通常去用那个len()函数是一模一样的。具体来看下面给出的这一行代码, 它所要表达的实际含义是, 请你立刻去启动那个能够将温度从摄氏度切换到华氏度的转换工具, 把你提供的三十有五度这么具体的数值扔进去进行换算, 接着要把最后得到的换算数据妥善地安顿到叫作C2F的这个变量容器里去, 并且在完成这一步之后, 还要把最终得到的结果给直接显示在屏幕上面。通过这样一系列连贯的动作, 我们就顺利地把那个函数给调用起来了, 并且让结果也得以成功打印了出来。C2F fahrenheit_converter(35)print(C2F)对应的计算结果应当是95.0F, 你可以找一下摄氏度转换器进行验算, 以下是我在使用Mac电脑自带的计算器功能时所得出的具体数值。至此为止, 关于函数的定义以及基本使用方法, 你就会有一个基本的认识与了解。在比较长的一个时期内, 你所掌握的前面所述的这些内容, 基本上是完全足够应对大多数常规应用的场景的。但是, 为了能够使你在未来更深入地使用函数的时候不感到困惑和不顺畅, 避免产生任何的困扰和挣扎情绪。接下来我们将一起试着去解决一个相对更为复杂的实际问题。我们将刚才所提到的那个函数, 按照下面所示的方式进行一番修改操作呢。def fahrenheit_converter(C):fahrenheit C * 9/5 32print(str(fahrenheit) ?F)怎么样? 看起来是不是非常像? 没错, 我们仅仅是把最后一行进行了替换, 改成了 print 函数, 这是一处非常微小的改动, 而且似乎集成开发环境并没有对语法错误发出预警信号, 那么我们就一起来试着调用一下这个函数, 看看究竟会发生什么情况运行起来的结果是这样的:95.0?FNone这到底是什么情况。为什么会出现这种现象。其实, 会得出这样的结果, 是因为 print 是一个函数, 它并不是关键字。要是你的 print 不是函数的话, 那就说明你的版本一直还停留在2.x那个系列了, 那么就请赶紧去安装3.0以上的版本吧假如你能够非常细心一点的话, 就可以看出来了。就算在我的IDE里面, 虽然 print 和 retum 这两个词的颜色都是蓝色, 但它们之间还是存在着区分的, 其中一个是用正常字体显示的, 另一个则是用斜体显示的。关键字在函数里面起到了返回数值的作用, 而 print 顾名思义, 只是把我们看到的打印结果展示出来, 它是为人类设计的函数, 所以前面的 95.0F 实际上是调用函数之后产生的那个数值, 后面的 None 就是变量 C2F 此时被赋值到的数值, 也就是什么都没有, 之所以这样, 就是因为缺少了 关键字。这就好比你对着一个人喊了一声他的名字, 也就是调用了调用函数(call), 这个人只是“哎”地回应你一声而已, 这之所以会发生, 是因为在当前的情况里, 你根本就没有向他说明应该去执行什么操作或者完成什么事宜(空指令)。没有, 这也不用担心, 它并不表示没什么用, 在咱们中国这个环境里, 它是属于可选项的那种, 这意思就是你如果不去写它, 照样能顺利地把一个函数给定义下来并且使用它, 只不过这时候返回回来的值会变成‘None’这么个玩意儿而已在后面我们还有机会见到那些用法不太一样的函数, 到那个时候再看也不迟, 这里你只需要把函数的基本设定记住就足够了。在前面, 我们提到过定义一个函数是使用def这个单词的时候, 同时, 我们还能在各种教材的不同版本的翻译里面看到声明这个括号里面的这个词, 所以我们就比较容易推测出来了, 从表达的这种目的上来讲的话, 他们两个是一样的意思的, 而对于那些拥有其他编程语言基础的人来说, 这两个词就代表着两种完全不同的行为动作了。其实这完全没有必要去担心, 因为在相应的内容中, 这几个部分本来就是紧密相连、不可分割的整体。我们之所以在这里特意作出说明, 纯粹是为了给那些心中存有疑问的朋友提供一个解答。如果非要去刻意深究其中的细节和原因, 那也就没有什么特别的意义了。四.传递参数与参数类型在前面已经大大方方地讲过了怎么定义函数以及怎么使用函数, 在这一个部分里面呢, 我们就来聊一些细节很重要很重要的问题是参数的内容, 对于那些在开始的时候就已经设定好了必须有这个参数的函数来说我们只要把函数的名字写出来然后向着括号里传递参数去进行这个调用的操作就是调用, 实际上就是很简单的一件事情就是只要把所有的参数放到函数的括号里面的去就好了。fahrenheit_converter(35)fahrenheit_converter(15)fahrenheit_converter(0)fahrenheit_converter(- 3)事实上, 目前用于实现参数传递的方式, 在实际操作当中总共存在着两种具体的情况:位置参数 ( )关键词参数 ( )现在咱们就从那个好像被我们忘得差不多的梯形数学公式的地方入手, 第一步先还是去把一个函数给它创建起来。我们把函数的名称定为梯形面积, 然后设定参数为上底、下底、高, 每一个都使用英文输入法的逗号隔开。因为梯形的面积需要知道这三个值才能够求出来, 所以为了构造出这个梯形面积的函数, 上面的这三个参数是绝对不可缺少的要素。def trapezoid_area(base_up, base_down, height):return 1/2 * (base_up base_down) * height下面就是咱们开始调用函数这一段的实际内容了, 接着往下看就行。trapezoid_area(1,2,3)我们可以看到, 参数1、参数2和参数3分别是填在这个地方的。这种把具体的数值直接传进去的方法, 就是被叫做作位置参数的做法。然后是下面所提到的第二种, 也就是所谓的传入方式。trapezoid_area(base_up1, base_down2, height3)在调用函数的时候, 我们可以更直观地去做这一件事, 把每个参数名称后面赋予一个我们想要传入的值, 这种以名称作为一一对应的参数传入方式被称作是关键词参数。大家可以去回想一下自己去餐厅预约用餐的那个过程, 当你预约好了座位之后, 服务员最后找到你的那把椅子, 一般是会喊你留下名字的那个人的对, 这时候你本人, 其实就等于是一个参数了, 你是靠着那个姓名的方式被安排进你自己的预定座位里面的, 这种操作方法, 咱们把它叫做关键词参数的传递, 紧接着就是上菜的过程, 桌上的那些好吃的, 是靠着一个具体的号码顺序被送到你的那个桌面上的, 这个情况, 就和我们说的按照位置来传入参数是挺像的。也许你现在想不明白这种传入的方式到底有什么作用, 这没有关系, 因为在后面的学习过程中我们会结合其他知识再进行一次详细的讲解, 等到那么的时候你就能够以一种更高的层次来认识有关参数传入方式的这一情况了。为了避免发生混乱, 最恰当的做法应该是先去制造一些混乱。我们可以尝试着手处理一个更为复杂的问题, 并且依照下述的几种不同方式来对函数进行调用操作, 同时将得到的结果打印呈现出来:trapezoid_area(height3, base_down2, base_up1) # RIGHT!trapezoid_area(height3, base_down2, 1) # WRONG!trapezoid_area(base_up1, base_down2, 3) # RIGHT!trapezoid_area(1, 2, height3) # RIGHT!把第一行的那个函数的参数, 按照反过来排的队顺序传进去, 因为这个是叫做关键词参数的一个东西, 所以它并不会影响这个函数正常的去运作。在第二行里面, 那个函数是把参数反着传入的, 可是到了第三行的时候, 它就变成了按位置来传的值了。很遗憾的是, 这样的方式是错误的语法。原因很简单, 因为如果按照位置的规则去传参的话, 最后一个值应该对应的是参数的位置。但是在前面, 已经用名字传入了数值3, 这样一来就和后面的位置参数发生冲突了, 所以这种写法是不对的。函数的参数是按照正向的顺序进行传入的。其中, 前两个参数是采用关键词的方式进行指定的。最后一个参数则是以位置参数的形式传入的。基于这种传参方式来看, 该函数是可以实现正常运行的效果。在第四行那个函数的参数传递过程里, 我们是按照正序的顺序把这些参数一个个传进去的, 具体来说, 头两个参数是直接通过位置的方式来进行传入操作的, 而倒数最后一个参数呢, 则是借助关键词参数的这种方式来完成传入行为的, 经过这般设置以后, 这个函数是能够正常地运行起来的。请注意, 正确的运行结果应该是4.5, 也就是这个梯形的面积。当前, 我们所进行的这一操作是为一组变量实施数值赋予, 也就是完成赋值。base_up 1base_down 2height 3trapezoid_area(height, base_down, base_up)然后再去调用那个函数, 然而这次通过函数调用所获取到的返回值结果理应是需要呈现出为2.5的这个情况, 为什么会出现这样的结果呢。如果你遇到了像咱们现在这样的迷惑情况, 那么这肯定是因为参数的命名和变量的命名把你给搞糊涂了, 咱们接下来就把这两个方面的概念给区分得更加清楚一点。第一点嘛, 就是在进行函数定义这个动作的时候, 大家需要去把参数的那个别给起好名字, 而这么做的一个最主要的功能指向性特别明确, 那就是为了方便咱们在实际调用函数的那个时候, 能给使用者提供一个明确的指南, 让大家知道应当把什么样的一些东西传进去, 这些东西它大概是从什么地方过来的, 还有它们究竟是属于一种什么样的数据类别的, 总而言之来说就是给大家提供一个跟怎么使用这个函数有关的环境背景说明和一些信息上下文之类的东西。下面这一段具体的计算机代码, 说不定就可以作为一种辅助性的参照材料来帮助你去理解为什么在看待来自那个参数的名称方面你会觉得有一点点烦恼:def flashlight (battery1, battery2):return Light!我们规定了一个函数, 这个函数的名字叫做手电筒(), 它需要接收两个参数, 这两个参数的具体意思是电池。在这个时候, 如果你去商店里面去购买电池, 然后最终购买了回来的商品是两节品牌为南孚的电池, 这两节电池的电量规格都是600毫安时, 于是:nanfu1 600nanfu2 600flashlight(nanfu1, nanfu2)你搞清楚情况了吗? 南孚是电池的种类之一, 它就是能让手电筒发出亮光的物件。把南孚电池放进去这句话的意思, 就是我们在手电筒里面塞进了那个必要的电源。换个说法来讲, 这里有个东西它是变量, 它还是那个能够接受的函数的参数值。当这个参数传进去以后, 它就替代了原来存在的那个变量还有参数这个事实。与此同时, 传的方式还是采用位置参数进行传递的这个方法。这个和, 它仅仅只是一个形式上的占位符。它所表达出来的意思就是说, 函数所需要的参数, 应该是那些和电池有关的变量, 或者是对象。你在这个地方看到的魔法, 也就是我们接下来要详细提到的神奇的默认参数这个概念, 它实际上是处于一种可选用的状态之中的, 这意味着即便是你在调用这个函数的时候一上来根本就不去给它传递任何实质性的东西, 这个函数也是能够维持着一个正常运转的并且继续去运作下去的。你只需要以这种方式输入相关的代码内容即可。def trapezoid_area(base_up, base_down, height3):return 1/2 * (base_up base_down) * height给一个参数设定默认值是非常简单的事情, 我们只需要在定义参数的时候, 给参数进行赋值操作就可以了。这个情况, 也许跟传入参数的方式是有点类似的, 但是我们千万不要把它们搞混了。这可不是在传参的时候做的事情, 而是在定义的时候做的呀。这样一来, 我们只需要传入两个参数, 就可以让代码正常地运行下去了:。trapezoid_area(1, 2)你必然会提出疑问, 要是设定了默认值的话, 那所有梯形的高岂不是全都固定成3了嘛? 其实并非是这样, 之所以采用默认值这样的设计思路, 目的就是为了让大家在调用函数的时候可以尽可能简便一点, 少费点力气。这就好比我们大家在装软件的时候通常都有一个默认的保存路径, 但如果你是想要把它安装在别的地方的话, 你是可以挑出自定义修改这个选项的。之前在咱们看到的, print函数里面有个小把戏, 它其实也是这么玩的, print函数这个可选参数, 叫作sep, 它的这个意思, 是说每一个打印出来的结果, 是用什么把它给分开来着, 它的这个默认值, 是一个空格字符串, 空字符串的意思, 就是啥也没有, 但是咱们现在要是把它重新传进去一个’n, 嗯, 这个是换行的意思, 用一句话来说, 它就是说要拿那个换行符号, 把每一个打印出来的数头尾相连的时候, 给隔开。下面咱们就来调用一下我们自己的那个参数了:trapezoid_area(1, 2, height15)您只需要把那个希望获得的结果数值传进去就行了, 这个操作的流程就是这么简单的状况。默认值并不是让你掌握参数使用时必备的核心知识点, 然而它却能够帮助我们节省一部分时间, 这是一些比较小窍门, 在实际项目进行当中也特别经常看见这种情形。requests.get(url, headersheader)注:这个是在请求网站时可填可不填img.save(img_new, img_format, quality100)注意这是在给图片添加水印的操作, 默认情况下的水印质量参数会被设定为一百, 你需要自己去设计相关的函数。五.设计自己的函数到达这个环节之后, 大伙儿理应能够挺有底气地构思并编写出一个贴合自个项目需求的函数才对。接下来, 咱会把前面那一大堆知识头绪全部揉合在一处, 去搞一个简便好懂的敏感词汇筛查功能模块。不过, 在动手之前, 先得去碰一碰那个叫作open的新函数。这个函数使用上非常简单, 只需要传入两个参数就可以正常运转了, 分别是文件的完整路径和名称, 以及打开的方式。首先, 在桌面上创建一个文件, 这个文件没有特定的名称要求。对于使用 系统的用户来说, 可以在桌面的空白处点击鼠标右键, 然后在弹出的菜单中选择相应的选项来创建文件。而对于 Mac 操作系统的用户, 则需要先打开 Pages 软件创建文件, 接着点击导出功能, 并在格式选择中选中 txt 格式。完成了文件的创建之后, 我们就可以利用 open 函数把它打开:open(/Users/Hou/Desktop/text.txt)如果你是用户的话, 那么就应当去参照下面的样式, 把你的那个路径给写出来。open(C://Users/Hou/Desktop/)假如你按照代码的指示将其输入进去, 那么此时文件理应已经处于打开状态, 但是, 似乎我们并无法直观地察觉到此情形, 因此, 我们再了解一种新的方法, 也就是 write。在第一章中, 我们已经讲述过具体的使用方法。如果你对于函数与方法之间的逻辑关联存在疑惑, 可以简单理解为方法是函数的特定形态, 二者在使用原则层面保持高度契合, 唯一区别在于其部署的位置不同。基于此种认知, 接下来我们将直接沿用第三章所提供的操作范式, 来掌握write方法的运用技巧。file open(/Users/Hou/Desktop/text.txt,w)file.write(Hello World)写代码的部分完成以后, 我们需要执行一下程序, 然后去看看实际的运行效果怎么样, 在学会了使用 open 函数以及 write 函数的基本方法之后, 我们接下来就可以动手去设计具体的程序函数了, 这里的需求内容是这样的: 只需要传入 name 参数和 msg 参数这两个数据, 就能够控制让程序在电脑桌面上写入的文件名称是什么以及写入的内容具体是什么, 并且还要确保当发现桌面上不存在这个可以用来写入的文件的时候, 系统需要自动先创建一个这样的文件, 然后再把数据写入进去, 下面我们就开始去实现这个需求吧。def text_create(name, msg):desktop_path /Users/Hou/Desktop/full_path desktop_path name .txtfile open(full_path,w)file.write(msg)file.close()print(Done)text_create(hello,hello world) # 调用函数我们一行接一行地把这段代码的内容进行解释说明。在代码的第一行那里, 需要对函数的名称以及参数进行定义操作。第二行: 我们起初就知道, open函数需要接收一个完整的路径作为参数, 因此第一步是获取桌面的路径。在第三行这里, 我们到底给这个文件起一个什么样的名字呢, 其实道理很简单, 它其实就是将那些需要被传入进去的参数, 然后再接着把桌面的路径给拼接上去, 最后再在后面加上相应的后缀名, 这样的话就得到了一个完整而且具体的文件路径了。第四行, 打开文件, w参数代表着作为写入模式使用, 这具体的意思就是, 如果这个路径下面本身不存在这样的文件, 那么它就应该在该位置去创建一个有着对应名称的文本文件, 而如果它已经存在的话, 那就直接把原来的文本内容给覆盖掉。在第五行的位置, 执行写入操作的对象是传入的那个参数 msg, 这个参数的具体含义所指的就是内容本身, 将内容填入其中。对于位于第六行的那个位置, 执行关闭文本的那个动作。这样一来, 我们的敏感词过滤器的第一部分就算大功告成了。顺便说一下, 这个函数就是咱们在前头说过的, 那些部分代码即便不编写, 它照样能发挥作用的那个家伙。末尾那个 print 指令呢, 纯粹是为了给个信号, 说明上头那一大串操作已经全部执行完毕了, 说白了就是一个提示而已。下面开始去实现那个第二部分的任务, 它的名字叫敏感词过滤功能。当前的需求情况是这样的: 需要去定义一个函数类型的变量或者是函数式的对象, 这个操作的本质是传入一个具体的参数 word 到里面进行逻辑处理, 并且要能够实现相应的过滤效果, 关于那个所谓的敏感词设定为 lame 是它的一个默认值状态, 然后对应的替换词设定为空字符串也是它的默认情形, 此刻接着往下进行后续的动作操作。def text_filter(word,censored_word lame,changed_word Awesome):return word.replace(censored_word, changed_word)text_filter(Python is lame!) #调用函数这个函数就显得特别简单了, 在第一行这个地方, 我们就是顺着那个设定好的默认参数的规则, 按照它的方式来把这个名为万工米的函数给定义好了。因为目前这两个函数都已经全部完成了, 所以如果要想遵循风险比较低这一原则的话, 你就应该先试着去分别调用一下这两个函数以观察其最终的返回值情况。眼下, 我们试着去处理一个稍微复杂一点状况的, 这种状况是把两个函数给合并到一块儿去的。我们要创建一个名字叫做name的函数, 它的具体功能是能在桌面上建立一个文本文件, 这个文本文件是能够让人在里面输入文字的。不过这里有个条件, 要是输入的这些信息里面包含了那些比较敏感的词儿的话, 那么这些词就会被程序默认给过滤掉, 然后再把剩下的内容写入到这个文件里去。这个文本文件的名字参数我们给它设定为 name, 而那条需要写入的信息参数我们就叫它 msg。关于这点内容, 你可以先凭借自己的能力去尝试着写一写看一看, 等你自己写完以后, 再去对照着我们接下来提供的内容看一下。def censored_text_create(name, msg):clean_msg text_filter(msg)text_create(name,clean_msg)censored_text_create(Try,lame!lame!lame!) #调用函数我们把第一个函数拿来了用, 把传入的那个 msg 经过过滤之后存到了那个名为的变量里面, 接着再把传入的那个 name 参数也就是文件名以及那些已经过滤好的文本作为参数给传到函数里面去, 等到结果出来的时候我们会得到被过滤好的那一段文本。完成这项操作之后, 你就会得到一个文本过滤器了。在这一部分内容里, 我仅仅只是借用数学方面的一些手段, 把函数的运行机理给解释清楚了, 不过呢, 假如你实际上面临的情况是需要去处理一大堆与数学相关的问题的话, 那么此刻我这边是能够提供给你一个基础的参考性质的表格数据的, 至于具体应当如何运用这个表, 你只有通过多去进行一些尝试操作了, 才可以逐渐摸索出规律来的, 这一点上你一定要敢于动手去试一下的, 因为毕竟电脑设备本身是不会仅单单因为你输入的一行代码而突然发生什么爆炸这种糟糕情况的。假设现在有一个情况, 在这个情况里面a等于10, b等于20, 接下来运算的例子展示如下:。既然你都能够一路阅读到这里了, 不如在你离开之前留下一个三连支持一下好吗, 因为你们每一个人的积极支持全都是我坚持不懈的动力源泉。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →