购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第3章
流程控制语句

视频讲解:1小时55分钟)

本章概览

人们做任何事情都要遵循一定的原则。例如,到图书馆去借书,就需要有借书证,并且借书证不能过期,这两个条件缺一不可。程序设计也是如此,需要利用流程控制实现与用户的交流,并根据用户的需求决定程序“做什么”“怎么做”。

流程控制对于任何一门编程语言来说都是至关重要的,它提供了控制程序如何执行的方法。如果没有流程控制语句,整个程序将按照线性顺序来执行,而不能根据用户的需求决定程序执行的顺序。本章将对Python中的流程控制语句进行详细讲解。

知识框架

3.1 程序结构

视频讲解:资源包\Video\03\3.1 程序结构.mp4

计算机在解决某个具体问题时,主要有3种情形,分别是顺序执行所有的语句、选择执行部分语句和循环执行部分语句。程序设计中的3种基本结构为顺序结构、选择结构和循环结构。这3种结构的执行流程如图3.1所示。

图3.1 3种基本结构的执行流程

其中,第一幅图是顺序结构的流程图,编写完毕的语句按照编写顺序依次被执行;第二幅图是选择结构的流程图,它主要根据条件语句的结果选择执行不同的语句;第三幅图是循环结构的流程图,它是在一定条件下反复执行某段程序的流程结构,其中,被反复执行的语句称为循环体,决定循环是否终止的判断条件称为循环条件。

本章之前编写的多数实例采用的都是顺序结构。例如,定义一个字符串类型的变量,然后输出该变量,代码如下:

看过金庸的小说《射雕英雄传》的人可能会记得,黄蓉与瑛姑见面时,曾出过这样一道数学题:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?”

解决这道题,有以下两个要素:

☑ 需要满足的条件是一个数,除以三余二,除以五余三,除以七余二。这就涉及条件判断,需要通过选择语句实现。

☑ 依次尝试符合条件的数。这就需要循环执行,需要通过循环语句实现。

3.2 选择语句

在生活中,我们总是要做出许多选择,编写程序也是一样。下面给出几个常见的例子:

☑ 如果购买成功,用户余额减少,用户积分增多。

☑ 如果输入的用户名和密码正确,提示登录成功,进入网站,否则,提示登录失败。

☑ 如果用户使用微信登录,则使用微信扫一扫;如果使用QQ登录,则输入QQ号和密码;如果使用微博登录,则输入微博账号和密码;如果使用手机号登录,则输入手机号和密码。

以上例子中的判断就是程序中的选择语句,也称为条件语句,即按照条件选择执行不同的代码片段。Python中选择语句主要有3种形式,分别为if语句、if…else语句和if…elif…else多分支语句。

说明

在其他语言(如C、C++、Java等)中,选择语句还包括switch语句,也可以实现多重选择。但是在Python 3.12以前的版本中没有switch语句,所以实现多重选择的功能时,只能使用if…elif…else语句或者if语句的嵌套。

3.2.1 最简单的if语句

视频讲解:资源包\Video\03\3.2.1 最简单的if语句.mp4

在Python中使用if保留字来组成简单的选择语句,语法格式如下:

其中,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式(例如:a>b and a!=c),如果表达式的值为真,则执行“语句块”;如果表达式的值为假,就跳过“语句块”,继续执行后面的语句,这种形式的if语句相当于汉语里的关联词语“如果……就……”,其流程图如图3.2所示。

图3.2 最简单的if语句的执行流程

说明

在Python中,当表达式的值为非零的数或者非空的字符串时,if语句也认为是条件成立(即为真值)。具体都有哪些值才是假,可以参见2.5.3节。

下面通过一个具体的实例来解决黄蓉给瑛姑所出难题中的第一个要素:判断一个数,除以三余二,除以五余三,除以七余二。

实例01 判断输入的是不是黄蓉所说的数

实例位置:资源包\Code\SL\03\01

使用if语句判断用户输入的数字是不是黄蓉所说的除以三余二,除以五余三,除以七余二的数,代码如下:

运行程序,当输入23时,效果如图3.3所示;当输入17时,效果如图3.4所示。

图3.3 输入的是符合条件的数

图3.4 输入的是不符合条件的数

说明

使用if语句时,如果只有一条语句,那么语句块可以直接写到冒号“:”的右侧,例如下面的代码:

但是,为了程序代码的可读性,建议不要这么做。

常见错误

(1)if语句后面未加冒号,例如下面的代码:

运行后,将产生如图3.5所示语法错误。

图3.5 语法错误

解决的方法是在第2行代码的结尾处添加英文半角的冒号。正确的代码如下:

(2)使用if语句时,如果符合条件,则需要执行多个语句,例如,程序的真正意图是当bmi的值小于18.5时,才输出bmi的值和提示信息“您的体重过轻~@_@~”,那么正确的代码如下:

在上面的代码中,如果第二个输出语句没有缩进,代码如下:

在执行程序时,无论bmi的值是否小于18.5,都会输出“您的体重过轻~@_@~”。这显然与程序的本意是不符的,但程序并不会报告异常,因此这种bug很难发现。

3.2.2 if…else语句

视频讲解:资源包\Video\03\3.2.2 if…else语句.mp4

如果遇到只能二选一的条件,例如,某大学毕业生到知名企业实习期满后留用,现在需要选择Python开发的方向,示意图如图3.6所示。

图3.6 选择Python开发的方向

Python中提供了if…else语句解决类似问题,其语法格式如下:

使用if…else语句时,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式,如果满足条件,则执行if后面的语句块,否则,执行else后面的语句块,这种形式的选择语句相当于汉语里的关联词语“如果……否则……”,其流程图如图3.7所示。

图3.7 if…else语句流程图

技巧: if…else语句可以使用条件表达式进行简化,如下面的代码:

可以简写成:

上段代码主要实现求绝对值的功能,如果a>0,就把a的值赋值给变量b,否则将-a赋值给变量b。使用条件表达式的好处是可以使代码简洁,并且有一个返回值。

下面增加实例01的功能:如果输入的数不符合条件,则给出相应的提示。

实例02 验证瑛姑给出的答案是否正确

实例位置:资源包\Code\SL\03\02

使用if…else语句判断输入的数字是不是黄蓉所说的除以三余二,除以五余三,除以七余二的数,并给予相应的提示,代码如下:

运行程序,当输入23时,效果如图3.8所示;当输入21时,效果如图3.9所示。

图3.8 输入的是符合条件的数

图3.9 输入的是不符合条件的数

注意

在使用else语句时,else一定不可以单独使用,它必须和保留字if一起使用,例如,下面的代码是错误的:

程序中使用if…else语句时,如果出现if语句多于else语句的情况,那么该else语句将会根据缩进确定属于哪个if语句。如下面的代码:

上面的语句将不输出任何提示信息,这是因为else语句属于第3行的if语句,所以当a小于0时,else语句将不执行。而如果将上面的代码修改为以下内容:

将输出提示信息“a小于0”。此时,else语句和第2行的if语句配套使用。

3.2.3 if…elif…else语句

视频讲解:资源包\Video\03\3.2.3 if…elif…else语句.mp4

大家平时在网上购物时,通常都有多种付款方式供选择,如图3.10所示。

图3.10 购物时的付款页面

图3.10中提供了5种付款方式,这时用户就需要从多个选项中选择一个。在开发程序时,如果遇到多选一的情况,则可以使用if…elif…else语句,该语句是一个多分支选择语句,通常表现为“如果满足某种条件,就会进行某种处理,否则,如果满足另一种条件,则执行另一种处理……”。if…elif…else语句的语法格式如下:

使用if…elif…else语句时,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式,如果表达式的值为真,执行其下的语句;而如果表达式的值为假,则跳过该语句,进行下一个elif的判断,只有在所有表达式都为假的情况下,才会执行else中的语句。if…elif…else语句的流程如图3.11所示。

图3.11 if…elif…else语句的流程图

注意

if和elif都需要判断表达式的真假,而else则不需要判断;另外,elif和else都必须与if一起使用,不能单独使用。

实例03 输出玫瑰花语

实例位置:资源包\Code\SL\03\03

使用if…elif…else多分支语句实现根据用户输入的玫瑰花的朵数输出其代表的含义,代码如下:

说明

第4行代码中的int()函数将用户的输入强制转换成整型。

运行程序,输入一个数值,并按下<Enter>键,即可显示相应的提示信息,效果如图3.12所示。

图3.12 if…elif…else多分支语句的使用

多学两招

使用if选择语句时,尽量遵循以下原则:

(1)当使用布尔类型的变量作为判断条件时,假设布尔型变量为flag,较为规范的格式如下:

不符合规范的格式如下:

(2)使用“if 1==a:”这样的书写格式可以防止错写成“if a=1:”这种形式,从而避免逻辑上的错误。

3.2.4 if语句的嵌套

视频讲解:资源包\Video\03\3.2.4 if语句的嵌套.mp4

前面介绍了3种形式的if选择语句,这3种形式的选择语句之间都可以互相嵌套。

在最简单的if语句中嵌套if…else语句,形式如下:

在if…else语句中嵌套if…else语句,形式如下:

说明

if选择语句可以有多种嵌套方式,开发程序时,可以根据自身需要选择合适的嵌套方式,但一定要严格控制好不同级别代码块的缩进量。

场景模拟 国家质量监督检验检疫局发布的《车辆驾驶人员血液、呼气酒精含量阈值与检验》中规定:车辆驾驶人员血液中的酒精含量小于20mg/100ml不构成饮酒驾驶行为;酒精含量大于或等于20mg/100m、小于80mg/100ml为饮酒驾车;酒精含量大于或等于80mg/100ml为醉酒驾车。现编写一段Python代码判断是否酒后驾车。

实例04 判断是否为酒后驾车

实例位置:资源包\Code\SL\03\04

通过使用嵌套的if语句实现根据输入的酒精含量值判断是否为酒后驾车的功能,代码如下:

在上面的代码中,应用了if语句的嵌套,其具体的执行流程如图3.13所示。

图3.13 判断是否酒后驾车的执行流程

运行程序,当输入每100毫升酒精含量为10毫克时,将显示不构成饮酒行为,效果如图3.14所示;当输入酒精含量为90毫克时,将显示已经达到醉酒驾驶标准,效果如图3.15所示。

图3.14 不构成饮酒行为

图3.15 已经达到醉酒驾车标准

3.3 条件表达式

视频讲解:资源包\Video\03\3.3 条件表达式.mp4

在程序开发时,经常会根据表达式的结果,有条件地进行赋值。例如,要返回两个数中较大的数,可以使用下面的if语句:

针对上面的代码,可以使用条件表达式进行简化,代码如下:

使用条件表达式时,先计算中间的条件(a>b),如果结果为True,返回if语句左边的值,否则返回else右边的值。例如上面表达式中r的值为10。

说明

Python中提供的条件表达式,可以根据表达式的结果进行有条件的赋值。

3.4 循环语句

日常生活中很多问题都无法一次解决,如盖楼,所有高楼都是一层一层垒起来的。还有一些事情必须周而复始地运转才能保证其存在的意义,如公交车、地铁等交通工具必须每天往返于始发站和终点站之间。类似这样反复做同一件事的情况,称为循环。循环主要有两种类型:

☑ 重复一定次数的循环,称为计次循环,如for循环。

☑ 一直重复,直到条件不满足时才结束的循环,称为条件循环。只要条件为真,这种循环会一直持续下去,如while循环。

说明

在其他语言(例如,C、C++、Java等)中,条件循环还包括do…while循环。但是,在Python中没有do…while循环。

3.4.1 while循环

视频讲解:资源包\Video\03\3.4.1 while循环.mp4

while循环是通过一个条件来控制是否要继续反复执行循环体的语句。

语法如下:

说明

循环体是指一组被重复执行的语句。

当条件表达式的返回值为真时,则执行循环体中的语句,执行完毕后,重新判断条件表达式的返回值,直到表达式返回的结果为假时,退出循环。while循环语句的执行流程如图3.16所示。

图3.16 while循环语句的执行流程图

我们用现实生活中的例子来理解while循环的执行流程。在体育课上,体育老师要求同学们沿着环形操场跑圈,要求当听到老师吹的哨子声时就停下来。同学们每跑一圈,都可能会请求老师吹哨子。如果老师吹哨子,则停下来,即循环结束,否则继续跑步,即执行循环。

下面通过一个具体的实例来解决3.1节给出的应用场景中的第二个要素:依次尝试符合条件的数,此时,需要用到第一个要素确定是否符合条件。

实例05 助力瑛姑①:while循环版解题法

实例位置:资源包\Code\SL\03\05

使用while循环语句实现从1开始依次尝试符合条件的数,直到找到符合条件的数时,才退出循环。具体的实现方法是:首先定义一个用于计数的变量number和一个作为循环条件的变量none(默认值为真),然后编写while循环语句,在循环体中,将变量number的值加1,并且判断number的值是否符合条件,当符合条件时,将变量none设置为假,从而退出循环。具体代码如下:

运行程序,将显示如图3.17所示效果。从图3.17中可以看出第一个符合条件的数是23,这就是黄蓉想要的答案。

图3.17 助力瑛姑①:while循环版解题法

注意

在使用while循环语句时,一定不要忘记添加将循环条件改变为False的代码(例如实例05中的第08行代码一定不能少),否则,将产生死循环。

3.4.2 for循环

视频讲解:资源包\Video\03\3.4.2 for循环.mp4

for循环是一个依次重复执行的循环。通常适用于枚举或遍历序列,以及迭代对象中的元素。

语法如下:

其中,迭代变量用于保存读取出的值;对象为要遍历或迭代的对象,该对象可以是任何有序的序列对象,如字符串、列表和元组等;循环体为一组被重复执行的语句。

for循环语句的执行流程如图3.18所示。

图3.18 for循环语句的执行流程图

我们用现实生活中的例子来理解for循环的执行流程。在体育课上,体育老师要求同学们排队进行踢毽球测试,每个同学一次机会,毽球落地则换另一个同学,直到全部同学都测试完毕,即循环结束。

1.进行数值循环

在使用for循环时,最基本的应用就是进行数值循环。例如,想要实现从1到100的累加,可以通过下面的代码实现:

在上面的代码中,使用了range()函数,该函数是Python内置的函数,用于生成一系列连续的整数,多用于for循环语句中。其语法格式如下:

参数说明:

☑ start:用于指定计数的起始值,可以省略,如果省略则从0开始。

☑ end:用于指定计数的结束值(但不包括该值,如range(7),则得到的值为0~6,不包括7),不能省略。当range()函数中只有一个参数时,即表示指定计数的结束值。

☑ step:用于指定步长,即两个数之间的间隔,可以省略,如果省略则表示步长为1。例如,range(1,7)将得到1、2、3、4、5、6。

注意

在使用range()函数时,如果只有一个参数,那么表示指定的是end;如果有两个参数,则表示指定的是start和end;只有3个参数都存在时,最后一个参数才表示步长。

例如,使用下面的for循环语句,将输出10以内的所有奇数:

得到的结果如下:

多学两招

在Ptyhon 3.X中,使用print()函数时,不能直接加逗号,需要加上“,end='分隔符'”,在上面的代码中使用的分隔符为一个空格。

说明

在Python 3.X中删除了老式xrange()函数。

下面通过一个具体的实例来演示for循环语句进行数值循环的具体应用。

实例06 助力瑛姑②:for循环版解题法

实例位置:资源包\Code\SL\03\06

使用for循环语句实现从1循环到100(不包含100),并且记录符合黄蓉要求的数。具体的实现方法是:应用for循环语句从1迭代到99,在循环体中,判断迭代变量number是否符合“三三数之剩二,五五数之剩三,七七数之剩二”的要求,如果符合则应用print()函数输出,否则继续循环。具体代码如下:

运行程序,将显示如图3.17所示效果。

常见错误

for语句后面未加冒号。例如下面的代码:

运行后,将产生如图3.19所示语法错误。解决的方法是在第一行代码的结尾处添加一个冒号。

图3.19 for循环语句的常见错误

2.遍历字符串

使用for循环语句除了可以循环数值,还可以逐个遍历字符串,例如,下面的代码可

以将横向显示的字符串转换为纵向显示:

上面代码的运行结果如图3.20所示。

图3.20 将字符串转换为纵向显示

说明

for循环语句还可以用于迭代(遍历)列表、元组、集合和字典等,具体的方法将在第4章进行介绍。

3.4.3 循环嵌套

视频讲解:资源包\Video\03\3.4.3 循环嵌套.mp4

在Python中,允许在一个循环体中嵌入另一个循环,这称为循环嵌套。例如,在电影院找座位号,需要知道第几排第几列才能准确找到自己的座位号,假如寻找如图3.21所示第二排第三列座位,首先寻找第二排,然后在第二排再寻找第三列,这个寻找座位的过程就类似循环嵌套。

图3.21 寻找座位的过程就类似循环嵌套

在Python中,for循环和while循环都可以进行循环嵌套。

例如,在while循环中套用while循环的格式如下:

在for循环中套用for循环的格式如下:

在while循环中套用for循环的格式如下:

在for循环中套用while循环的格式如下:

除了上面介绍的4种嵌套格式,还可以实现更多层的嵌套,因为与上面的嵌套方法类似,这里就不再一一列出了。

实例07 打印九九乘法表

实例位置:资源包\Code\SL\03\07

使用嵌套的for循环打印九九乘法表,代码如下:

代码注解

本实例的代码使用了双层for循环(循环流程如图3.22所示),第一个循环可以看成是对乘法表行数的控制,同时也是每一个乘法公式的第二个因数;第二个循环控制乘法表的列数,列数的最大值应该等于行数,因此第二个循环的条件应该是建立在第一个循环的基础上的。

图3.22 实例07的循环流程

程序运行结果如图3.23所示。

图3.23 使用循环嵌套打印九九乘法表

3.5 跳转语句

当循环条件一直满足时,程序将会一直执行下去,就像一辆迷路的车,在某个地方不停地转圈。如果希望在中间离开循环,也就是for循环结束重复之前,或者while循环找到结束条件之前,有两种方法来做到:

☑ 使用continue语句直接跳到循环的下一次迭代。

☑ 使用break完全终止循环。

3.5.1 break语句

视频讲解:资源包\Video\03\3.5.1 break语句.mp4

break语句可以终止当前的循环,包括while和for在内的所有控制语句。以独自一人沿着操场跑步为例,原计划跑10圈。可是在跑到第2圈的时候,遇到自己的女神或者男神,于是果断停下来,终止跑步,这就相当于使用了break语句提前终止了循环。break语句的语法比较简单,只需要在相应的while或for语句中加入即可。

说明

break语句一般会结合if语句进行搭配使用,表示在某种条件下跳出循环。如果使用嵌套循环,break语句将跳出最内层的循环。

在while语句中使用break语句的形式如下:

其中,条件表达式2用于判断何时调用break语句跳出循环。在while语句中使用break语句的流程如图3.24所示。

在for语句中使用break语句的形式如下:

其中,条件表达式用于判断何时调用break语句跳出循环。在for语句中使用break语句的流程如图3.25所示。

图3.24 在while语句中使用break语句的流程图

图3.25 在for语句中使用break语句的流程图

在实例06中,使用for循环语句解决了黄蓉难倒瑛姑的数学题。但是,在该实例中,尽管在循环到23时已经找到了符合要求的数,但依然要一直循环到99。下面对实例06进行改进,实现当找到第一个符合条件的数后就跳出循环,这样可以提高程序的执行效率。

实例08 助力瑛姑③:for循环改进版解题法

实例位置:资源包\Code\SL\03\08

在实例06的最后一行代码下方再添加一个break语句,即可以实现找到符合要求的数后直接退出for循环。修改后的代码如下:

运行程序,将显示如图3.17所示效果。如果想要看出实例08和实例06的区别,可以在上面第02和03行代码之间添加“print(number)”语句输出number的值。添加break语句后的执行效果如图3.26所示,未添加break语句时的执行效果如图3.27所示。

图3.26 添加break语句时的效果

图3.27 未添加break语句时的效果

3.5.2 continue语句

视频讲解:资源包\Video\03\3.5.2 continue语句.mp4

continue语句的作用没有break语句强大,它只能终止本次循环而提前进入到下一次循环中。仍然以独自一人沿着操场跑步为例,原计划跑步10圈。当跑到第2圈一半的时候,遇到自己的女神或者男神也在跑步,于是果断停下来,跑回起点等待,制造一次完美邂逅,然后从第3圈开始继续。

continue语句的语法比较简单,只需要在相应的while或for语句中加入即可。

说明

continue语句一般会与if语句搭配使用,表示在某种条件下,跳过当前循环的剩余语句,然后继续进行下一轮循环。如果使用嵌套循环,continue语句将只跳过最内层循环中的剩余语句。

在while语句中使用continue语句的形式如下:

其中,条件表达式2用于判断何时调用continue语句跳出循环。在while语句中使用continue语句的流程如图3.28所示。

在for语句中使用continue语句的形式如下:

其中,条件表达式用于判断何时调用continue语句跳出循环。在for语句中使用continue语句的流程如图3.29所示。

图3.28 在while语句中使用continue语句的流程图

图3.29 在for语句中使用continue语句的流程图

场景模拟 几个好朋友一起玩逢七拍腿游戏,即从1开始依次数数,当数到尾数是7的数或7的倍数时,则不报出该数,而是拍一下腿。现在编写程序,从1数到99,假设每个人都没有出错,计算一共要拍多少次腿。

实例09 逢七拍腿游戏

实例位置:资源包\Code\SL\03\09

通过在for循环中使用continue语句实现计算拍腿次数,即计算从1到100(不包括100),一共有多少个尾数为7或7的倍数这样的数,代码如下:

说明

第3行代码实现的是:当所判断的数字是7的倍数时,会执行第4行的continue语句,跳过后面的减1操作,直接进入下一次循环;同理,第7行代码用于判断是否以数字7结尾,如果是,直接进入下一次循环。

程序运行结果如图3.30所示。

图3.30 逢七拍腿游戏的运行结果

3.6 pass空语句

视频讲解:资源包\Video\03\3.6 pass空语句.mp4

在Python中还有一个pass语句,表示空语句。它不做任何事情,一般起到占位作用。例如,在应用for循环输出1~10之间(不包括10)的偶数时,在不是偶数时,应用pass语句占个位置,方便以后对不是偶数的数进行处理。代码如下:

程序运行结果如下:

3.7 实战

实战一:模拟支付宝蚂蚁森林的能量产生过程

支付宝的蚂蚁森林中通过日常的走路、生活缴费、线下支付、网络购票、共享单车等低碳、环保行为可以积攒能量,当能量达到一定数量后,可以种一棵真正的树。那么本实战将模拟支付宝蚂蚁森林的能量产生过程。效果如图3.31所示。

图3.31 模拟支付宝蚂蚁森林的能量产生过程

实战二:猜数字游戏

编写一个猜数字的小游戏,随机生成一个1到10之间(包括1和10)的数字作为基准数,玩家每次通过键盘输入一个数字,如果输入的数字和基准数相同,则成功过关,否则重新输入。如果玩家输入-1,则表示退出游戏。效果如图3.32所示。

图3.32 猜数字游戏

实战三:模拟“跳一跳”小游戏的加分块

“跳一跳”小游戏中提供了一些加分块,当跳到这些加分块上时,会有额外的加分。本实战将模拟“跳一跳”小游戏,实现输入不同的加分块,显示应加的分数,效果如图3.33所示。

实战四:模拟10086查询功能

编写Python程序,模拟10086自助查询系统的功能:

输入1,显示您当前的余额;

输入2,显示您当前剩余的流量,单位为G;

输入3,您当前的剩余通话时长,单位为分钟;

输入0,退出自助查询系统。

效果如图3.34所示。

图3.33 “跳一跳”小游戏的加分块

图3.34 模拟10086查询功能

3.8 小结

本章详细介绍了选择语句、循环语句、break语句、continue跳转语句及pass空语句的概念及用法。在程序中,语句是程序完成一次操作的基本单位,而流程控制语句是用于控制语句的执行顺序的。在讲解流程控制语句时,通过实例演示了每种语句的用法。在学习本章内容时,读者要重点掌握if语句、while语句和for语句的用法,这几种语句在程序开发中会经常用到。希望通过对本章的学习,读者能够熟练掌握Python中流程控制语句的使用,并能够应用到实际开发中。

本章e学码:关键知识点拓展阅读

bmi

range()函数

switch语句

迭代

死循环 VcLiduW/xLK5zhT4fa8W+1oHMxIC85v+e+PF7cK7YmmsK+BhJEGIJIirJihalh3v

点击中间区域
呼出菜单
上一章
目录
下一章
×