【Python数据结构与判断1/7】复杂的多向选择

news2024/10/1 15:29:37

目录

导入

举个栗子

代码优化

elif

栗子

执行顺序

情况一

情况二

情况三

if-elif-else特性

三种判断语句小结

if

if-else

if-elif-else

嵌套语句

if嵌套

栗子

执行顺序

相互嵌套

Tips

Debug

总结


导入

        在前面,我们学习了单向选择的if语句和多项选择的if-else语句。但是,在生活中N选1的情况更为多见。

        在Python中,我们也可以添加更多的选择,来实现从“二选一”到“多选一”的进阶,一起来看看吧~

举个栗子

        如图所示,为了实现完整的判断,我们使用了三个 if,来保证所有的得分对比情况(大于、等于、小于)都会有对应的输出。

代码优化

        但是对于这种3个或以上的条件,无法使用一个if-else 结构来优化代码。这时可以使用Python判断语句中的第三个关键字 elif(else if的缩写)。

elif

        if 后的语句是当 if 判断条件成立时,执行的操作。
        elif 后的语句是当 if 判断不成立时,再判断一次,如果成立,执行的操作。
        else 后的语句是当以上所有判断条件都不成立时,执行的操作。

栗子

        本例第3、4行代码判断了如果变量 day 等于1,就输出"元气满满地工作"。第5、6行代码判断了如果变量 day 大于等于2并且小于等于5,就输出"继续搬砖吧"。第7、8行代码判断了如果之前的条件都不满足,就输出"世界这么大,出去走走吧"。

day = 3

if day == 1:
    print("元气满满地工作")
elif (day >= 2) and (day <= 5):
    print("继续搬砖吧")
else: 
    print("世界这么大,出去走走吧")

if判断

        if后面的布尔表达式,在这里不成立。那么if后面的代码块,也就是第4行代码,不会被执行。

elif

        是一个关键字,使else和if的缩写。如果之前的判断条件不成立,那么就重新做一次判断,执行elif后面的代码。

布尔表达式

        两次比较运算,如果变量 day 大于等于2,如果变量 day 小于等于5。本例中结果都为 True。一次逻辑运算 and(“与”运算)。本例中参与运算的分别是 True 和 True ,运算结果为 True 。括号,用来框定代码运算的顺序,表明先进行比较运算,再进行逻辑“与”运算。

冒号

        就像 if 和 else 一样,elif 语句的最后也需要一个冒号。在 elif 之后使用冒号,表示后续缩进的代码块在判断条件成立的时候会被执行。

缩进

        缩进生成 elif 内的代码块,这里我们还是空四格。

else

        一个关键字 else,如果前面的 if 和 elif 的判断条件都不成立,就执行 else 后面缩进的代码块。

执行顺序

情况一

        我们把 if-elif-else 判断的执行顺序,梳理成流程图后,再来整理一下程序运行流程。第一种情况,程序运行到 if 判断时,如果条件为真,执行 if 的代码块。

        完成后,运行 if-elif-else 后面的代码。

情况二

        第二种情况,程序运行到 if 判断时,如果条件为假,程序就直接跳开 if 判断的执行部分,再次运行到 elif 的判断,如果条件为真,执行 elif 的代码块。

        完成后,运行 if-elif-else 后面的代码。

情况三

        第三种情况,程序运行到 elif 判断时,如果条件为假,程序就直接跳开 elif 判断的执行部分,运行 else 的代码块。
        完成后,运行 if-elif-else 后面的代码。

if-elif-else特性

        if-elif-else 语句有3个特性。
1. 如果不满足 if 的条件,就判断是否满足 elif 的条件,满足就执行 elif 内的代码块,不满足就执行 else 内的代码块。
2. elif 需与 if 搭配使用,它无法独立出现。必须先有 if ,然后才能使用 elif ,否则程序就会报错。

3. if 、elif 与 else 成互斥关系。互斥关系指的是,程序不会同时执行 if 内、 elif 内和 else 内的代码块,只会执行其中一个。else 是把 if 和 elif 判断条件无法囊括的情况全部划分到自己这里。

三种判断语句小结

        现在,我们已经学习了三种判断语句:if 、if-else 和 if-elif-else 。通过 if 、else 、elif 的搭配使用,我们可以覆盖条件判断中的所有情况,让程序按照我们预定的逻辑来执行很多自动化的工作。

if

        if 语句属于单向判断。只要条件成立,就会运行 if 内的代码块;条件不成立,程序就会跳开 if 判断。

if-else

        if-else 语句属于双向判断。如果 if 的条件不成立,就执行 else 内的代码块。if 和 else 是两个互斥关系,程序只会执行其中的一个。

if-elif-else

        if-elif-else 语句属于多向判断(3个或以上的条件)。
        如果 if 的条件不成立,就执行 elif 再判断一次,如果 elif 的条件也不成立,就执行 else 内的代码块。
        if 、elif 、 else 是互斥关系,程序只会执行其中的一个
        并且,当判断的条件超过3个时,中间的多个条件都可以使用 elif ,无论中间有多少个 elif ,它和其他 if 、elif 都是互斥关系。

嵌套语句

        之前的博文中,处理的判断条件都是独立的,不存在条件之中还有条件的情况。但是正如生活的选择题往往没有那么简单一样,在Python中也常会遇到判断条件继续细分的情况。
        对于这种在条件成立的基础上又不断细分出其他条件的情况,称为嵌套。

        定义嵌套是指将一个东西“套在”另一个东西里,就像套娃一样。同样的,嵌套语句是指将一个语句装在另一个语句里。

if嵌套

        嵌套语句在很多地方都有应用,今天咱们主要学习 if 的嵌套。
if 嵌套
在基础条件满足的情况下,再在基础条件里面增加额外的判断条件,即条件里套条件

栗子

本例第1、2行代码分别将时间13和数量2赋值给了变量 time 和 num 。
第4、5行代码判断了如果变量 time 大于等于9并且小于等于23,就输出"在打折时间内"。
第7、8行代码在变量 time 大于等于9并且小于等于23成立的条件下,判断了如果变量 num 大于等于2,就输出"全场八折"。

time = 13
num = 2

if (time >= 9) and (time <= 23):
    print("在打折时间内")

    if num >= 2:
        print("全场八折")

外层条件

        第一层判断条件 if 。
        首先判断了如果变量 time 大于等于9并且小于等于23,就输出"在打折时间内"。

内层条件

        第二层判断条件 if 。
        在第一层判断变量 time 大于等于9并且小于等于23成立的条件下,判断了如果变量 num 大于等于2,就输出"全场八折"。

缩进4格

        Python是以缩进的空格数来区分代码块的。
        如果外层条件和内层条件的代码块都采用同样的缩进,Python 就没办法区分内外层条件是如何嵌套的。
        在这里,外层条件 if 语句内的代码块缩进四个空格。

缩进8格

        在将内层条件 if 语句写进外层条件的执行分支时,内层条件 if语句内的代码块要在原有缩进的基础上,再增加相应的缩进。
        在这里,内层条件 if 语句内的代码块在外层条件内的代码块缩进的基础上再加四个空格,也就是八个空格。
        注意⚠️ :缩进在Python语法规则中扮演重要的角色,千万不能忽视哦~

执行顺序

        我们把 if 嵌套的执行顺序,梳理成流程图后,再来整理一下程序运行流程。
        如图所示,嵌套的原则是先确定外层条件再确定内层条件,只有当外层条件成立时,才有可能进入到内层条件当中继续执行。

        需要注意的是,在相互嵌套时,一定要严格遵守不同级别代码块的缩进规范。每嵌套一层都需要在原有缩进的基础上,再增加相应的缩进。

相互嵌套

        不仅是 if 嵌套 ,在Python中,if 、if-else 和 if -elif-else 之间也可以相互嵌套。嵌套原则与 if 嵌套类似。
        如图所示,这是一段能实现分组和判断成绩的代码。
        1个外层条件 if-else 语句判断变量 gender 的值,确定男女分组,2个内层条件 if-else 语句判断变量 score 的值,确定成绩情况。

Tips

        值得注意的是,虽然使用嵌套可以大大提高代码的逻辑性和层次感。但是,任何东西都不能过度使用。一般来说,超过3层以上的嵌套会使代码变得难以阅读,不符合Python简洁表达的理念。

Debug

        博文的尾声,我们一起来梳理下,和判断语句相关的常见报错:

1. 语法错误

(1)忘记 if 、elif 、else 后的冒号:冒号常常被遗漏,这是判断语句的固定格式,有冒号程序才知道下面是谁的代码块。

(2)嵌套时,没有通过缩进来分层。在每层嵌套条件中需要额外再加四个空格。

第1个else没有缩进,导致第2个 else 找不到对应的 if 。

2. 缩进错误

        if 、elif 、else 为互斥关系,其内部的代码块需要通过缩进形成。为了保持风格统一,每个缩进用四个空格

总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1505611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超越α!PixArt家族新秀PixArt-Σ: 由弱到强训练的文本生成4K图像DiT(华为诺亚)

文章链接&#xff1a; https://arxiv.org/pdf/2403.04692 开源地址&#xff1a;https://pixart-alpha.github.io/PixArt-sigma-project/ PixArt-Σ&#xff0c;这是一个能够直接生成4K分辨率图像的Diffusion Transformer&#xff08;DiT&#xff09;。PixArt-Σ相比其前身PixAr…

【unity实战】3D水系统,游泳,潜水,钓鱼功能实现

最终效果 文章目录 最终效果素材将项目升级为URP画一个水潭地形材质升级为URP创建水调节水第一人称人物移动控制游泳水面停留添加水下后处理水下呼吸钓鱼参考完结 素材 https://assetstore.unity.com/packages/vfx/shaders/urp-stylized-water-shader-proto-series-187485 将…

06 数据结构之树

引言&#xff1a; 数的代码实现&#xff0c; 先序遍历、中序、后序、层次遍历 /* binary_tree.h */ #ifndef _BINARY_TREE_H #define _BINARY_TREE_H#include <stdio.h> #include <stdlib.h> #include <string.h>#define DEBUG(msg) \printf("--%s--, %…

【工作】如何写好一份工作自评/总结 述职报告

文章目录 一、述职与工作汇报1、述职是什么&#xff1f;2、述职的目标&#xff08;表扬/体谅/资源&#xff09;3、述职的对象&#xff08;挑战/规划/方法&#xff09; 二、如何做好一份述职报告1、述职内容2、述职PPT制作3、述职试讲练习 三、附工作自评 一、述职与工作汇报 1…

18个惊艳的可视化大屏(第21辑):环境监测与污染治理

hello&#xff0c;我是贝格前端工场老司机&#xff0c;这是第21期了&#xff0c;本次分享环境监测与污染治理场景下&#xff0c;可视化大屏的意义和案例&#xff0c;喜欢文章的别忘点赞关注&#xff0c;文章底部也有其他行业的案例。 可视化大屏在环境监测污染治理中发挥着重要…

【C++】list模拟实现list迭代器失效问题

list模拟实现&list迭代器失效问题 一&#xff0c;list模拟实现1. list的主要框架接口模拟2. list构造&拷贝构造&析构3. list迭代器3.1 普通迭代器3.2 const迭代器 4. 增删查改 二&#xff0c;迭代器失效问题1. list的迭代器失效原因2. 解决办法 一&#xff0c;list…

【动态规划】【前缀和】【和式变换】100216. K 个不相交子数组的最大能量值

本文涉及知识点 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode 100216. K 个不相交子数组的最大能量值 给你一个长度为 n 下标从 0 开始的整数数组 nums 和一个 正奇数 整数 k 。 x 个子数组的能量值定义为 stren…

九州金榜|孩子厌学的因素及解决办法

孩子在学习的过程中&#xff0c;遇到厌学这种情况非常容易见到&#xff0c;这也是孩子在成长的过程中经常遇到的烦恼。面对孩子的厌学&#xff0c;作为家长这时候不要慌乱&#xff0c;要做到分析孩子产生厌学的原因&#xff0c;在去寻找解决孩子厌学的办法。下面九州金榜家庭教…

C++单例模式、工厂模式

一、单例模式 (一) 什么是单例模式 1. 是什么&#xff1f; 在系统的整个生命周期内&#xff0c;一个类只允许存在一个实例。 2. 为什么&#xff1f; 两个原因&#xff1a; 节省资源。方便控制&#xff0c;在操作公共资源的场景时&#xff0c;避免了多个对象引起的复杂操作…

【Python】成功解决ModuleNotFoundError: No module named ‘seaborn’

【Python】成功解决ModuleNotFoundError: No module named ‘seaborn’ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; …

win11家庭版docker和milvus

docker 1、官网下载docker文件Get Started | Docker&#xff0c;选择download for windows下载。 2、双击打开下载好的文件Docker Desktop Installer.exe&#xff0c;add shortcut to desktop选择√代表同意添加快捷键到桌面&#xff0c;如果不勾选就说明不创建快捷键&#x…

软件报错提示缺少D3DCompiler_47.dll文件怎么解决

许多用户在运行游戏或电脑软件时&#xff0c;遇到了一个提示“找不到d3dcompiler_47.dll”的错误消息。这个问题相当普遍&#xff0c;这个错误通常是由于系统中缺少关键的d3dcompiler_47.dll文件所导致的&#xff0c;而这个文件是很多应用程序运行的必要条件&#xff0c;特别是…

浮点数的前世今生

文章目录 浮点数问题浮点数赋值和打印不同0.1累加100次&#xff0c;得到的不是10 计算机如何存储整数计算机如何存储浮点数二进制小数表示法浮点数表示小数和浮点数的转换十进制小数转换成浮点数二进制float二进制转换成十进制小数 问题解决方法参考资料 浮点数问题 浮点数赋值…

《深度学习风暴:掀起智能革命的浪潮》

在当今信息时代,深度学习已经成为科技领域的一股强大力量,其应用领域涵盖了从医疗到金融再到智能交互等方方面面。随着技术的不断进步和应用的不断拓展,深度学习的发展势头愈发迅猛,掀起了一股智能革命的浪潮。本文将从基本原理、应用实例、挑战与未来发展方向、与机器学习…

makedowm文本居中、首行缩进、回车换行

文章目录 1. 居中2. 首行缩进3. 回车换行3.1 段落中<br />换行3.2 句子中 \Enter 换行3.3 句子中 空格Enter 换行 1. 居中 由于Markdown本身不支持字体居中&#xff0c;所以采取HTML语法。如下&#xff1a; <center>这一行需要居中</center>注意: <cent…

基于PBS向超算服务器队列提交任务的脚本模板与常用命令

本文介绍在Linux服务器中&#xff0c;通过PBS&#xff08;Portable Batch System&#xff09;作业管理系统脚本的方式&#xff0c;提交任务到服务器队列&#xff0c;并执行任务的方法。 最近&#xff0c;需要在学校公用的超算中执行代码任务&#xff1b;而和多数超算设备一样&a…

仿牛客项目Day3:开发社区登录模块

发送邮件 邮箱设置 springEmail properties spring.mail.hostsmtp.qq.com spring.mail.port465 spring.mail.username spring.mail.password spring.mail.protocolsmtps spring.mail.properties.mail.smtp.ssl.enabletrue MailClient Component public class MailClient {…

计算机网络——OSI网络层次模型

计算机网络——OSI网络层次模型 应用层表示层会话层传输层TCP和UDP协议复用分用 网络层数据链路层物理层OSI网络层次模型中的硬件设备MAC地址和IP地址MAC地址IP地址MAC地址和IP地址区别 OSI网络层次模型通信过程解释端到端点到点端到端和点到点的区别 我们之前简单介绍了一下网…

数组:初始化,访问某一个,遍历

文章目录 静态初始化数组数组的访问&#xff1a;遍历数组案例 动态初始化数组总结案例 静态初始化数组 定义数组的时候直接给数组赋值。 简化格式&#xff1a; int[] ages {12,52,96}; 完整格式&#xff1a; int[] ages new int[]{12,16,26};数组变量名中存储的是数组在内存…

LINUX ADC使用

监测 ADC ,使用CAT 查看&#xff1a; LINUX ADC基本使用 &adc {pinctrl-names "default";pinctrl-0 <&adc6>;pinctrl-1 <&adc7>;pinctrl-2 <&adc8>;pinctrl-3 <&adc9>;pinctrl-4 <&adc10>;pinctrl-5 …