Python精讲 | 条件赋值和and-or技巧

news2025/1/13 17:06:49

大家好,欢迎来到 Crossin的编程教室 !

在之前的 一段奇葩的1024代码 中,有这么一个写法:

6e13c2dbc709a0dc209affbe4425f21a.png

看上去是一个由 and 和 or 组成的逻辑表达式。但实际的效果却相当于一个 if-else 的条件判断:

if i % 5 == 4:
    D += '\n'
else:
    D += ''

c053562051d8bf295884a06e73d89ff7.png

为什么会有这样的效果?

这就要说到之前讲过的 逻辑运算中的短路求值:

条件 and 值1 or 值2

如果条件为False,它会触发and短路求值返回False,再进行or运算返回值2。

而如果条件为True,它会进行and运算返回值1,再触发or短路求值返回值1。

于是,就变相实现了一个单行的if-else结构。

其实在很多语言中,都有现成的类似语法,称作 条件赋值,常常是以 ?: 的三元运算符来实现。

条件 ? 值1 : 值2

如果问号前条件为真,则返回问号后的值,否则返回冒号的值。

ce941d9acff63c5a484ca1fd9a063163.png

Python中也有这种语法,同样以if-else作为关键字,但写法上略有不同:

值1 if 条件 else 值2

51c3180cf4ff6a7ce962e4cf40332c0e.png

在非常非常早期的Python版本中,并不支持这种单行的if-else语法,所以会有人用 and-or 这样的逻辑组合技巧来替代实现。

但是,这个技巧是有漏洞的。

比如我们把前面那个例子的条件反一下,并调换两个值的顺序。逻辑上应该是相同的。但执行结果却不对了:

D += i % 5 != 4 and '' or '\n'

f57162f2befcb7623a99f646f6d75154.png

这又是为什么呢?

再回到我们前面说的原理上:

条件 and 值1 or 值2

如果条件为True,它会进行and运算返回值1。但值1本身也可能是个空值,也就是逻辑上的False,那么就不会触发or的短路求值,这个条件赋值的逻辑也就不成立了。

当然,如果想补上这个漏洞也不是不行,只需要保证值1一定为非空非0值就可以。所以把它们都变成列表,再从列表中取值,就OK了。

D += (i % 5 != 4 and [''] or ['\n'])[0]

或者,我们也可以这么写

D += ('', '\n')[i % 5 == 4]

把两个值作为元组,把条件作为索引,也可以实现条件赋值

你能看出这么写是什么意思吗?

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

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

相关文章

【python+Excel】读取和存储测试数据完成接口自动化测试

http_request2.py用于发起http请求 #读取多条测试用例 #1、导入requests模块 import requests #从 class_12_19.do_excel1导入read_data函数 from do_excel2 import read_data from do_excel2 import write_data from do_excel2 import count_case #定义http请求函数COOKIENon…

我在Vscode学OpenCV 图像处理一(阈值处理、形态学操作【连通性,腐蚀和膨胀,开闭运算,礼帽和黑帽,内核】)

文章目录 一、阈值处理1.1 OpenCV 提供了函数 cv2.threshold()和函数 cv2.adaptiveThreshold(),用于实现阈值处理1.1.1. cv2.threshold():(1)在函数cv2.threshold()中,参数threshold_type用于指定阈值处理的方式。它有以下几种可选的阈值类型…

认识并初步使用shell脚本

目录 一、什么是Shell脚本 二、变量与运算 三、逻辑判断 四、循环 五、函数 六、中断与继续 一、什么是Shell脚本 在前面学习了Linux的基本指令,而shell脚本其实就是是这些命令的集合。 那么为什么需要shell脚本呢? 因为可以用来实现一些复杂的操…

git丢弃本地操作,强制使用线上最新代码

借鉴:弃用本地分支所有代码,获取远程分支最新代码_git获取远程最新分支_小中.的博客-CSDN博客 1.问题:git pull结果发现本地仓库比线上代码提前l两个commit。本地未进行任何操作。需要直接使用线上最新代码。ps:Author都是某同事。 2.操作: …

旅游网站的技术SEO:技巧与最佳实践

技术SEO在旅游网站中的作用 旅游网站都是关于用户体验和参与度的。但是,在开始处理这些参数之前,您需要努力使用户登陆您的网站。这意味着你需要让你的网站在搜索引擎结果页面(SERP)中排名。 一旦你在搜索引擎结果中获得曝光&am…

什么是PDM图纸管理系统?PDM图纸管理系统主要功能有哪些?

PDM (Product Data Management) 图纸管理系统 是用于管理企业内部图纸和相关文件的软件系统。它提供了一个集中存储、组织和跟踪图纸和文件的平台,以确保团队成员能够轻松访问、共享和更新所需的工程设计和制造数据。 彩虹PDM系统|PDM产品数据管理系统|BOM管理|工艺…

记录仿钉钉审批流(将MySQL换成Oracle)走过的坑

需求:实现审批流程 在Gitee上发现了一个功能还OK的项目,于是就clone下来了(如下图) 原项目用MySQL很好启动,B站上作者还录制了视频,可以去学习 这里主要记录将MySQL换成Oracle出现的问题 首先&#xff0c…

详解API开发【电商平台API封装商品详情SKU数据接口开发】

1、电商API开发 RESTful API的设计 RESTful API是一种通过HTTP协议发送和接收数据的API设计风格。它基于一些简单的原则,如使用HTTP动词来操作资源、使用URI来标识资源、使用HTTP状态码来表示操作结果等等。在本文中,我们将探讨如何设计一个符合RESTfu…

Embassy 库下载代码示例

解决方案: swift import Embassy let downloader Downloader() // 使用代理主机和端口 downloader.useProxy(proxyHost: ") // 下载 URL 的内容 let content downloader.download(from: "") // 输出下载的内容 print(content) 这个程序首先…

STM32 Nucleo-64 boards 外设资源引脚对应关系图

STM32 Nucleo-64 boards 外设资源引脚对应关系图 1. STM32 NUCLEO-F103RB1.1 串口对应关系图1.2 I2C对应关系图【参考博文】1. STM32 NUCLEO-F103RB 1.1 串口对应关系图 1.2 I2C对应关系图 注意:STM32 NUCLEO-F103RB

清早送朋友的阳光早安问候语祝福,愿你好运同行

1、早上好!送上清晨第一缕阳光,伴随着燕舞蝶飞的风声,给您最温馨的问候。让心情放飞,让梦想翱翔,让生命绽放。祝您每天都充满能量,前程似锦! ​ 2、平凡就是幸福,简单就是快乐&…

塑料注塑件自动化光学测量蓝光自动化三维检测解决方案-CASAIM-IS(2ND)

一、背景介绍 在塑料制品的生产过程中,注塑件的质量对于产品的整体质量和性能至关重要。然而,通过使用三坐标、卡尺、千分尺等量具,对工件进行单点或人工检测其加工精度,对复杂形位公差检测目前比较难取得数据,无法快…

基于Java SSM框架实现高校二手交易平台系统项目【项目源码+论文说明】

基于java的SSM框架实现高校二手交易平台系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个高校二手交易平台,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将…

基于three.js生成动态波浪背景效果

文章目录 前言一、安装three二、新建waves.js文件三、引入waves.js文件比查看效果如有启发,可点赞收藏哟~ 前言 基于three.js生成动态波浪背景效果 一、安装three npm i three -S二、新建waves.js文件 注意geometry.setAttribute和geometry.addAttribute和在不同…

一,vue3 解构 获取值 双向绑定 二。数据监听 双向绑定 三。冒泡排序

一&#xff0c;vue3 解构 获取值 双向绑定 <template><nav><!-- 按钮 --><!-- 绑定事件的弹框 v-on --><button click"submit">弹出</button><br><!-- 、双向绑定 --><input v-model"num" place…

Java(十)(网络编程,UDP,TCP)

目录 网络编程 两种软件架构 网络通信的三要素 IP IPv4的地址分类 特殊IP 端口号 协议 用UDP协议发送数据 用UDP接收数据 TCP接收和发送数据 TCP通信--支持与多个客户端同时通信 网络编程 可以让设备中的程序与网络上其他设备的程序进行数据交互(实现网络通信) 两…

TA-Lib学习研究笔记(二)——Overlap Studies下

TA-Lib学习研究笔记&#xff08;二&#xff09;——Overlap Studies下 &#xff08;11&#xff09;SAR - Parabolic SAR 抛物线指标 函数名&#xff1a;SAR 名称&#xff1a; 抛物线指标 简介&#xff1a;抛物线转向也称停损点转向&#xff0c;是利用抛物线方式&#xff0c;随…

【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能

文章目录 ⭐⭐⭐Spring核心源码分析自定义Spring框架⭐⭐⭐一、Spring使用回顾二、Spring核心功能结构1、Spring核心功能2、bean概述 三、Spring IOC相关接口分析1、BeanFactory解析2、BeanDefinition解析3、BeanDefinitionReader解析4、BeanDefinitionRegistry解析5、创建容器…

【Linux】tar 命令使用

tar 命令 tar&#xff08;英文全拼&#xff1a;tape archive &#xff09;命令用于备份文件。tar 是用来建立&#xff0c;还原备份文件的工具程序&#xff0c;它可以加入&#xff0c;解开备份文件内的文件。 著者 由约翰吉尔摩和杰伊芬拉森撰写。 语法 tar [选项] [压缩后文…

【Lustre相关】功能实践-03-文件级冗余(FLR)

一、前言 DDN-03.11-File Level Redundancy (FLR) Category:FLR 1、功能介绍 在文件级冗余&#xff08;File Level Redundancy&#xff0c;FLR&#xff09;特性出现之前&#xff0c;Lustre文件系统数据冗余完全依赖于后端存储设备&#xff08;如RAID6&#xff09;。 Lustre在L…