相关文章推荐
暴走的茴香  ·  TypeScript中联合类型赋值null/ ...·  2 月前    · 
聪明的手术刀  ·  视图与变量详解·  1 月前    · 
逆袭的电梯  ·  Python变量引用浅析_python引用变量的值·  4 周前    · 
跑龙套的玉米  ·  c# datagridview 行删除_百度知道·  1 年前    · 
幸福的领带  ·  使用restTemplate报错:no ...·  1 年前    · 
酒量大的米饭  ·  通过Rest向Camunda添加日期变量 ...·  2 年前    · 
俊逸的铅笔  ·  JSON 映射 - Azure ...·  2 年前    · 
Code  ›  Python精讲 | 条件赋值和and-or技巧开发者社区
python 赋值
https://cloud.tencent.com/developer/article/2364324
细心的绿豆
9 月前
Crossin先生

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

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
Crossin先生
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > Python精讲 | 条件赋值和and-or技巧

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

作者头像
Crossin先生
发布 于 2023-11-27 17:14:50
275 0
发布 于 2023-11-27 17:14:50
举报
文章被收录于专栏: Crossin的编程教室

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

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

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

代码语言: javascript
复制
if i % 5 == 4:
    D += '\n'
else:
    D += ''

为什么会有这样的效果?

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

代码语言: javascript
复制
条件 and 值1 or 值2

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

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

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

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

代码语言: javascript
复制
条件 ? 值1 : 值2

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

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

代码语言: javascript
复制
值1 if 条件 else 值2

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

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

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

代码语言: javascript
复制
D += i % 5 != 4 and '' or '\n'

这又是为什么呢?

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

代码语言: javascript
复制
条件 and 值1 or 值2

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

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

代码语言: javascript
复制
D += (i % 5 != 4 and [''] or ['\n'])[0]

或者,我们也可以这么写

代码语言: javascript
复制
D += ('', '\n')[i % 5 == 4]

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

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

本文参与 腾讯云自媒体同步曝光计划 ,分享自微信公众号。
原始发表:2023-11-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除
python
技巧
漏洞
语法
原理

本文分享自 Crossin的编程教室 微信公众号, 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!

python
技巧
漏洞
语法
原理
评论
登录 后参与评论
0 条评论
热度
最新
登录 后参与评论
推荐阅读
LV.
文章
0
获赞
0
领券
  • 社区

    • 技术文章
    • 技术问答
    • 技术沙龙
    • 技术视频
    • 学习中心
    • 技术百科
    • 技术专区
  • 活动

    • 自媒体同步曝光计划
    • 邀请作者入驻
    • 自荐上首页
    • 技术竞赛
  • 资源

    • 技术周刊
    • 社区标签
    • 开发者手册
    • 开发者实验室
  • 关于

    • 社区规范
    • 免责声明
    • 联系我们
    • 友情链接

腾讯云开发者

扫码关注腾讯云开发者

扫码关注腾讯云开发者

领取腾讯云代金券

热门产品

  • 域名注册
  • 云服务器
  • 区块链服务
  • 消息队列
  • 网络加速
  • 云数据库
  • 域名解析
  • 云存储
  • 视频直播

热门推荐

  • 人脸识别
  • 腾讯会议
  • 企业云
  • CDN加速
  • 视频通话
  • 图像分析
  • MySQL 数据库
  • SSL 证书
  • 语音识别

更多推荐

  • 数据安全
  • 负载均衡
  • 短信
  • 文字识别
  • 云点播
  • 商标注册
  • 小程序开发
  • 网站监控
  • 数据迁移

Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有

深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569

腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287

问题归档 专栏文章 快讯文章归档 关键词归档 开发者手册归档 开发者手册 Section 归档

Copyright © 2013 - 2024 Tencent Cloud.

All Rights Reserved. 腾讯云 版权所有

登录 后参与评论
 
推荐文章
暴走的茴香  ·  TypeScript中联合类型赋值null/undefined_type 'boolean' is not assignable to type 'location
2 月前
聪明的手术刀  ·  视图与变量详解
1 月前
逆袭的电梯  ·  Python变量引用浅析_python引用变量的值
4 周前
跑龙套的玉米  ·  c# datagridview 行删除_百度知道
1 年前
幸福的领带  ·  使用restTemplate报错:no suitable HttpMessageConverter found for response type [class java.lang.Object..._mb645b608370ff5的技术博客_51CTO博客
1 年前
酒量大的米饭  ·  通过Rest向Camunda添加日期变量 - 问答 - 腾讯云开发者社区-腾讯云
2 年前
俊逸的铅笔  ·  JSON 映射 - Azure 数据资源管理器 | Microsoft Learn
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号