您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

Python条件语句详解:if、else、switch都有了

时间:2020-11-23 11:25:27  来源:  作者:

导读:条件语句是指根据条件表达式的不同计算结果,使程序流转至不同的代码块。Python/ target=_blank class=infotextkey>Python中的条件语句有——if语句、if… else…语句。

作者:黄传禄 张克强 赵越

来源:华章科技

Python条件语句详解:if、else、switch都有了

 

01 if条件语句

if语句用于检测某个条件是否成立。如果成立,则执行if语句内的程序;否则,跳过if语句,执行后面的内容。if语句的格式如下。

if(表达式): 
    语句1 
else: 
    语句2

if语句的执行过程如下:如果表达式的布尔值为真,则执行语句1;否则,执行语句2。其中的else子句可以省略,表达式两侧的括号也可以省略。

在讲解if语句之前,先介绍一下Python中的控制台输入函数。在C语言中,使用scanf()和getchar()捕获用户输入,而JAVA语言的System.in包提供了控制台输入的方法。Python也提供了类似功能的函数——input(),用于捕获用户的原始输入并将其转为字符串。input()函数的声明如下。

input([prompt]) -> string

参数prompt是控制台中对于输入的提示文字,提示用户输入,返回值为字符串。如果输入的是数字,返回的还是字符串,那么使用前需要调用int()做一下字符串和数字类型的转换。下面这段代码说明了字符串和数字类型的转换。

x = input("x:")
x = int(x)
x = x + 1

如果不调用int()把字符串转换为数字,而直接计算表达式x = x + 1,将提示如下错误。

TypeError: Can't convert 'int' object to str implicitly

下面这段代码演示了if语句的执行流程。

1# 执行if语句内的程序
2a = input("a:")
3a = int(a)
4b = input("b:")
5b = int(b)
6if(a > b):
7    print (a, " > ", b)

【代码说明】

  • 第2行代码定义了变量a。
  • 第3行将用户输入的a转换为int类型。
  • 第4行代码定义了变量b。
  • 第5行将用户输入的b转换为int类型。
  • 第6行代码判断变量a、b的大小。
  • 对于第7行代码,假设a=2、b=1,输出结果:2>1。

如果不满足if语句内的条件,程序将跳过if语句,执行后面的内容。

1# 跳过if语句
2a = input("a:")
3a = int(a)
4b = input("b:")
5b = int(b)
6if(a > b):
7    print (a, " > ", b)
8print (a, " < ", b)

【代码说明】

  • 假设a=1、b=2,第6行代码中变量a的值小于变量b的值,因此,程序跳转执行第8行代码。
  • 第8行代码输出结果:1<2。

【例3-1】把上面的代码改写成if… else…结构。

【例3-1.py】

1# if… else…语句
2a = input("a:")
3a = int(a)
4b = input("b:")
5b = int(b)
6if(a > b):
7    print (a, " > ", b)
8else:
9    print (a, " < ", b)

【代码说明】

  • 假设a=1、b=2,第6行代码中变量a的值小于变量b的值。因此,程序跳转到else子句。
  • 第9行代码输出结果:1<2。

注意:else子句后需要加一个冒号,使Python解释器能识别出else子句对应的代码块。Java程序员可能会不习惯这种语法,往往会忽略else子句后的冒号。在Python 2中还可用raw_input()函数接收用户输入,其功能与Python 3的input()相同。而Python 2中的input()接收的值不转换为字符串类型,而是保留原始类型,它在Python 3中已经去除。

02 if…elif…else判断语句

if…elif…else语句是对if…else…语句的补充。当程序的条件分支很多时,可以使用这种语句。if…elif…else语句相当于C、Java中的if…elseif…else语句。该语句的格式如下。

if(表达式1): 语句1
elif(表达式2): 语句2
…
elif(表达式n): 语句n
else: 语句m

if…elif…else语句的执行过程:首先判断表达式1的值是否为真。如果为真,则执行语句1。否则,程序流转到elif子句,判断表达式2的值是否为真。如果表达式2的值为真,则执行语句2。否则,程序进入下面一个elif子句,以此类推。如果所有的表达式都不成立,则程序执行else子句的代码。其中的else子句可以省略,表达式两侧的括号也可以省略。

下面【例3-2】中的这段代码通过判断学生的分数,确定学生成绩的等级。

【例3-2.py】

 1# if elif else语句
 2score = float( input("score:"))  # 接收用户输入并将其转换为float类型,当输入为小数时,使用int转换会报错
 3if 90 <= score <= 100:
 4    print("A")
 5elif 80 <= score < 90:
 6    print("B")
 7elif 60 <= score < 80:
 8    print("C")
 9else:
10    print("D")

【代码说明】

  • 第2行代码定义了一个变量score,假设输入的值为70。这个变量表示学生的分数。接收用户输入并将其转换为float类型。
  • 第3行代码,分数大于等于90并且小于等于100,则等级评定为“A”。
  • 第5行代码,分数大于等于80并且小于90,则等级评定为“B”。
  • 第7行代码,分数大于等于60并且小于80,则等级评定为“C”。此时条件表达式成立,程序流转到第8行。输出结果为C。
  • 第9行代码,当前面的条件表达式都不成立时,程序流转到else子句。

03 if语句也可以嵌套

if语句的嵌套是指if语句中可以包含一个或多个if语句。嵌套的格式如下所示。

if(表达式1):
if(表达式2): 语句1
elif(表达式3): 语句2
…
else: 语句3
elif(表达式n):
…
else: 
…

下面【例3-3】中的这段代码是一个嵌套的条件语句。如果x的值大于0,则y的值等于1;如果x的值等于0,则y的值等于0;如果x的值小于0,则y的值等于-1。

【例3-3.py】

 1x = -1
 2y = 99
 3if(x >= 0):
 4    if(x > 0):#嵌套的if语句
 5        y = 1
 6    else:
 7        y = 0
 8else:
 9    y = -1
10print ("y =", y)

【代码说明】

  • 第2行代码定义了一个变量y。为了不和最终可能的输出结果1、0、-1重复,设置y的初始值为99。
  • 第3行代码判断变量x的值。如果x大于等于0,则执行下面嵌套的if语句。
  • 第4行代码,判读x的值是否大于0。如果大于0,则执行第5行代码;否则,执行第7行代码。
  • 第8行代码,如果变量x的值小于0,则执行第9行代码。
  • 第9行代码,由于变量x的值为-1,因此y的值等于-1。
  • 第10行代码的输出结果为-1。

嵌套语句可以组合出很多写法,但是要注意把所有的分支情况都考虑到。下面的这种写法是错误的。

1# 错误的嵌套语句
2x = -1
3y = 99
4if(x != 0):           # 如果x不等于0
5    if(x > 0):          #嵌套的if语句
6        y = 1
7else:
8    y = 0
9print ("y =", y)

【代码说明】

  • 第4行代码判断变量x的值是否等于0。如果不等于0,则执行if语句下面的代码块;否则执行else子句的代码。由于x的值等于-1,程序流转到第5行。
  • 第5行代码判断变量x的值是否大于0。如果大于0,则变量y的值设置为1。由于这里没有考虑到变量x小于0的情况,所以程序直接跳转到第9行。
  • 第9行代码,变量y的值并没有被改变,程序的分支结构没有考虑到x小于0的情况,所以最终输出的不是期望中的结果。输出结果为99。

注意:编写条件语句时,应该尽可能避免使用嵌套语句。嵌套语句不便于阅读,而且可能会忽略一些可能性。

04 switch语句的替代方案

switch语句用于编写多分支结构的程序,类似于if…elif…else语句。C语言中switch语句的结构如下所示。

switch(表达式) {
    case 常量表达式1: 语句1
    case 常量表达式2: 语句2
    …
    case 常量表达式n: 语句n
    default: 语句m
}

switch语句表示的分支结构比if…elif…else语句更清晰,代码可读性更高,但是Python并没有提供switch语句,而是可以通过字典实现switch语句的功能。

实现方法分为两步。首先,定义一个字典。字典是由键值对组成的集合。其次,调用字典的get()获取相应的表达式。

下面【例3-4】中的这段代码通过算术运算的符号,获取算术运算表达式。

【例3-4.py】

 1# 使用字典实现switch语句
 2from __future__ import division# 导入division模块
 3x = 1
 4y = 2
 5operator = "/"
 6result = {         # 定义字典
 7"+" : x + y,
 8"-" : x - y,
 9"*" : x * y,
10"/" : x / y 
11}
12print (result.get(operator))

【代码说明】

  • 第3、4行代码定义了两个操作数x、y。
  • 第5行代码定义了操作符变量operator,该变量用于存放算术运算符。
  • 第6行代码定义了一个字典result。该字典的key值由“+”“-”“*”“/”四则运算符组成。value值由对应的算术表达式组成。
  • 第12行代码调用get()方法,get()的参数就是变量operator的值。由于operator的值为“/”,因此将执行除法运算。输出结果为0.5。

另一种使用switch分支语句的方案是创建一个switch类,处理程序的流转。这种实现方法比较复杂,涉及面向对象、for循环、中断语句、遍历等知识,实现步骤分为4步。

  1. 创建一个switch类,该类继承自Python的祖先类object。调用构造函数__init__()初始化需要匹配的字符串,并定义两个成员变量value和fall。value用于存放需要匹配的字符串。fall用于记录是否匹配成功,初始值为False,表示匹配不成功。如果匹配成功,程序向后执行。
  2. 定义一个match()方法,该方法用于匹配case子句。这里需要考虑3种情况。首先是匹配成功的情况,其次是匹配失败的默认case子句,最后是case子句中没有使用break中断的情况。
  3. 重写__iter__()方法,定义了该方法后才能使switch类用于循环语句中。__iter__()调用match()方法进行匹配,通过yield关键字,使函数可以在循环中迭代。此外,调用异常StopIteration中断循环。Python中的循环都是通过异常StopIteration中断的。这样switch类就构造完成了。
  4. 编写调用代码,在for…in…循环中使用switch类。

下面【例3-5】中的这段代码实现了switch语句的功能。

【例3-5.py】

 1class switch(object):# 定义switch类
 2    def __init__(self, value):# 初始化需要匹配的值value
 3        self.value = value
 4        self.fall = False           # 如果匹配到的case语句中没有break,则fall为True
 5
 6    def __iter__(self):# 定义__iter__()方法
 7        yield self.match           # 调用match方法 返回一个生成器
 8        raise StopIteration# 用StopIteration 异常来判断for循环是否结束
 9
10    def match(self, *args):   # 模拟case子句的方法
11        if self.fall or not args:   # 如果fall为True,则继续执行下面的case子句
12                                 # 或case子句没有匹配项,则流转到默认分支
13            return True
14        elif self.value in args:    # 匹配成功
15            self.fall = True
16            return True
17        else: # 匹配失败
18            return False
19
20operator = "+"
21x = 1
22y = 2
23for case in switch(operator):  # switch只能用于for... in...循环中
24    if case('+'):
25        print (x + y)
26        break
27    if case('-'):
28        print (x - y)
29        break
30    if case('*'):
31        print (x * y)
32        break
33    if case('/'):
34        print (x / y)
35        break
36    if case():               # 默认分支
37        print ""

【代码说明】

  • 第1行到第18行代码定义了switch类,定义了__init__()、__iter__()、match()方法。
  • 第23行代码在for…in…循环中调用switch类,变量operator作为switch类的参数传递给构造函数。变量operator的值等于“+”,程序流转到第24行。
  • 第25行代码输出x + y的结果。输出结果为3。
  • 第26行代码使用break语句中断switch分支结构,程序流转到文件的末尾。

注意:switch语句会造成代码不易维护,使源文件臃肿。面向对象的设计中常常对switch语句进行重构,把switch语句分解为若干个类。当然,对于分支流程简单的switch,可以使用字典来实现。使用字典更容易管理switch,而switch类回到了C、Java的老路上,而且写法更复杂了,不值得推荐。

关于作者:黄传禄,高级讲师、管理软件开发工程师、数据库库系统工程师、信息系统管理工程师。有10多年的一线教学经验和高端培训经验,出版多部技术专著,获得多个软件著作权。

本文摘编自《零基础学Python》(第2版),经出版方授权发布。



Tags:Python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  Tags: Python  点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  Tags: Python  点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  Tags: Python  点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  Tags: Python  点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  Tags: Python  点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  Tags: Python  点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  Tags: Python  点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  Tags: Python  点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  Tags: Python  点击:(28)  评论:(0)  加入收藏
假设某日我开了一家空调公司,暂且就叫他天强空调安装设备公司吧,假装自己有公司,接了一单大生意,就是给甘肃省的各个高校安装空调(其实这边的气候基本用不到空调,就是假想一下),那么...【详细内容】
2022-07-01  Tags: Python  点击:(33)  评论:(0)  加入收藏
▌简易百科推荐
近几年 Web3 被炒得火热,但是大部分人可能还不清楚什么是 Web3,今天就让w3cschool编程狮小师妹带你了解下 Web3 是什么?与我们熟知的 Web1 和 Web2 又有什么区别呢?web3.0什么是...【详细内容】
2022-07-15  编程狮W3Cschool    Tags:Web3.0   点击:(2)  评论:(0)  加入收藏
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  IT智能化专栏    Tags:AidLearning   点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  菜鸟程序猿    Tags:Python   点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  测试架构师百里    Tags:python   点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  VT漫步    Tags:aiohttp   点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  VT漫步    Tags:Python Queue   点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  至尊小狸子    Tags:python   点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  CoCo的软件测试小栈    Tags:Python   点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  独钓寒江雪之IT    Tags:Python request   点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  写小说的程序员    Tags:python类   点击:(28)  评论:(0)  加入收藏
站内最新
站内热门
站内头条