【记录】Python|Python支持if 1<a<2、if not a、if a is None这三种写法

今天让AI帮我写代码,突然发现写出来一句类似1<a<2,我顿感疑惑:不是只能用and连接吗?

一试发现真行,那我辛辛苦苦写了好几年的 (条件1) and (条件2) 算什么?算我勤快吗?😭

常常写Javascript的有共情一下的吗?😥

if a也是,原来不需要写if a==''啊……

if not a也是,竟然支持字符串、列表、字典等多种比较方式呢!

if a is None就更是反我的直觉了,它居然比a==None效率更高!(众所周知Javascript里面NaN !== NaN,并且NaN===NaN是False,这让我对Python的None也不敢乱用……)


文章目录

    • 链式比较
      • 具体说明:
      • 示例:
      • 为什么其他语言不支持?
      • 总结:
    • 真值测试
      • 主要区别:
      • 示例:
      • 结论:
    • a is None
      • 关键点:
      • 示例:
      • 常见用途:
      • 注意:

链式比较

在 Python 中,1 < a < 2 这种链式比较(chained comparison)从 Python 最早的版本 就支持了,这是 Python 语言设计的一个特性,而不是后来新增的语法。

具体说明:

  • Python 的链式比较会被解释为 (1 < a) and (a < 2),但它的计算方式更高效(a 只会被计算一次)。
  • 这个特性在 Python 1.0(1994年发布)就已经存在,并一直延续至今。

示例:

a = 1.5
print(1 < a < 2)  # True

等价于:

print(1 < a and a < 2)  # True

为什么其他语言不支持?

许多其他编程语言(如 C、Java、JavaScript)不支持这种写法,因为它们会把 1 < a < 2 解析为 (1 < a) < 2,而 (1 < a) 返回的是布尔值(TrueFalse),再与 2 比较会导致类型不匹配或逻辑错误。

总结:

Python 从一开始就支持 1 < a < 2 这种链式比较语法,这是 Python 语言的一个特色特性,使得代码更简洁易读。

真值测试

在 Python 中,not struct.dmaslen(struct.dmas) == 0 并不完全等效,尽管在某些情况下它们可能产生相同的结果。它们的区别取决于 struct.dmas 的具体实现和类型。

主要区别:

  1. not struct.dmas

    • 这是 Python 的“真值测试”(truthiness testing),会调用 __bool__()__len__() 方法(如果 __bool__ 未定义)。
    • 如果 struct.dmas 是空列表、空字典、空字符串、NoneFalse、数值 0 或空容器,not struct.dmas 会返回 True
    • 但如果 struct.dmas 是一个自定义对象,它的 __bool__()__len__() 方法可能返回非预期值。
  2. **len(struct.dmas) == 0****:

    • 这显式检查 struct.dmas 的长度是否为 0,要求对象必须实现 __len__() 方法。
    • 如果 struct.dmas 没有 __len__() 方法(如数值、None 或某些自定义对象),会抛出 TypeError

示例:

class CustomObject:def __len__(self):return 0obj = CustomObject()print(not obj)       # True(调用 __len__())
print(len(obj) == 0) # True

但如果 struct.dmasNone

struct.dmas = None
print(not struct.dmas)       # True(None 是假值)
print(len(struct.dmas) == 0) # TypeError: object of type 'NoneType' has no len()

结论:

  • 如果 struct.dmas 一定是序列/容器(如列表、字符串、字典等),两者通常等效。
  • 如果 struct.dmas 可能是其他类型(如 None、自定义对象等),两者可能不等效,甚至 len() 会报错。
  • 更推荐用 not struct.dmas,除非你明确需要检查长度且确保对象是序列。

a is None

在Python中,a is None 是一种检查变量 a 是否等于 None 的写法。这里的 is 是Python的身份运算符(identity operator),用于比较两个对象是否是同一个对象(即内存地址是否相同),而不仅仅是值相等。

关键点:

  1. None 是Python中的单例对象,所有 None 值在内存中都是同一个对象。
  2. is 比较的是对象的身份(内存地址),而 == 比较的是值。
  3. a is Nonea == None 更推荐,因为:
    • 更高效(直接比较内存地址)。
    • 更符合Python的惯例(PEP 8推荐用 isis not 比较 None)。

示例:

a = None
b = None
c = []print(a is None)  # True,因为 a 就是 None
print(b is None)  # True,因为 b 也是 None
print(c is None)  # False,因为 c 是空列表,不是 None# 不推荐的写法(虽然结果可能相同):
print(a == None)  # True,但不建议这样写

常见用途:

  • 检查函数默认参数是否被传递:
    def foo(x=None):if x is None:x = []
    
  • 判断变量是否未初始化或作为空值占位符。

注意:

  • 对于除 None 之外的其他对象(如数字、字符串、列表等),通常用 == 比较值,而非 is。例如:
    x = 1000
    print(x is 1000)  # 可能为False(因Python小整数优化,结果不确定)
    print(x == 1000)  # True,总是用 == 比较值
    

总结:a is None 是Python中判断变量是否为 None 的标准写法。

本账号所有文章均为原创,欢迎转载,请注明文章出处:https://shandianchengzi.blog.csdn.net/article/details/148404731。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

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

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

相关文章

Matlab | MATLAB 中的插值详解

MATLAB 中的插值详解 插值是数值分析中的核心技术,用于在已知数据点之间估计未知点的值。MATLAB 提供了完整的插值函数库,涵盖一维到高维数据,支持多种插值方法。以下从基础到高级全面解析: 一、插值核心概念 1. 数学本质 给定数据点 ( x i , y i ) (x_i, y_i) (<

正则表达式检测文件类型是否为视频或图片

// 配置化文件类型检测&#xff08;集中管理支持的类型&#xff09; const FILE_TYPE_CONFIG {video: {extensions: [mp4, webm, ogg, quicktime], // 可扩展支持更多格式regex: /^video\/(mp4|webm|ogg|quicktime)$/i // 自动生成正则},image: {extensions: [jpeg, jpg, png,…

Redis最佳实践——热点数据缓存详解

Redis在电商热点数据缓存中的最佳实践 一、热点数据定义与识别 1. 热点数据特征 高频访问&#xff08;QPS > 1000&#xff09;数据规模适中&#xff08;单条 < 10KB&#xff09;数据变化频率低&#xff08;更新间隔 > 5分钟&#xff09;业务关键性高&#xff08;直接…

8088单板机C语言sprintf()格式化串口输出---Prj04

#include "tiny_stdarg.h" // 使用自定义可变参数实现#define ADR_273 0x0200 #define ADR_244 0x0400 #define LED_PORT 0x800 #define PC16550_THR 0x1f0 #define PC16550_LSR 0x1f5 / //基本的IO操作函数 / char str[]"Hello World! 20250531 Ve…

【面试】音视频面试

H.264 与 H.265 有什么区别&#xff1f; 1&#xff09;主要区别 H.265 也称为高效视频编码 (HEVC)&#xff0c;是 H.264 的升级和更高级的版本&#xff1b;H.265 的编码架构大致上 和 H.264 的架构相似&#xff0c;主要也包含&#xff1a;帧内预测&#xff08;intra predicti…

Windows系统下npm报错node-gyp configure got “gyp ERR“解决方法

感谢原博主&#xff0c;此文参考网址&#xff1a;https://zhuanlan.zhihu.com/p/398279220 确保已经安装node.js &#xff08;官方网址&#xff1a;https://nodejs.org/zh-cn/download&#xff09; 首先在命令窗口执行命令安装windows-build-tools&#xff1a; npm install -…

git stash命令用法

git stash 是 Git 中一个非常有用的命令&#xff0c;它可以临时保存当前工作区的修改&#xff0c;让你可以切换到其他分支或者处理其他任务&#xff0c;而不需要提交这些还未完成的修改。 一、基本用法 1. 保存当前修改&#xff08;包括暂存区和工作区的内容&#xff09; git…

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…

2025年目前最新版本Android Studio自定义xml预览的屏幕分辨率

一、前言 在实际开发项目当中&#xff0c;我们的设备的分辨率可能会比较特殊&#xff0c;AS并没有自带这种屏幕分辨率的设备&#xff0c;但是我们又想一边编写XML界面&#xff0c;一边实时看到较为真实的预览效果&#xff0c;该怎么办呢&#xff1f;在早期的AS版本中&#xff…

Edge Databases:赋能分布式计算环境

Edge 计算通过将数据处理推向数据源头彻底改变了传统计算范式。随着物联网设备、移动应用和分布式系统的大规模部署&#xff0c;面向边缘场景优化的数据库解决方案已成为关键技术需求。这类专用数据库能够在算力有限、内存受限且网络连接不稳定的终端设备上稳定运行&#xff0c…

Pluto论文阅读笔记

主要还是参考了这一篇论文笔记&#xff1a;https://zhuanlan.zhihu.com/p/18319150220 Pluto主要有三个创新点&#xff1a; 横向纵向用lane的query来做将轨迹投回栅格化地图&#xff0c;计算碰撞loss对数据进行正增强和负增强&#xff0c;让正增强的结果也无增强的结果相近&a…

【计算机网络】传输层UDP协议

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;计算机网络 &#x1f339;往期回顾&#x1f339;&#xff1a; 【计算机网络】应用层协议Http——构建Http服务服务器 &#x1f516;流水不争&#xff0c;争的是滔滔不…

「Java教案」顺序结构

课程目标 1&#xff0e;知识目标 能够正确使用Java顺序结构的基本语法&#xff0c;例如变量的声明、变量的赋值、表达式的计算、数据的输出。能够正确使用顺序结构的执行规则及其在程序中的作用&#xff0c;解决实际问题。 2&#xff0e;能力目标 能够独立完成顺序结构程序…

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…

GO语言----基础类型取别名

文章目录 取别名示例注意事项 Go语言中使用type关键字为基础类型取别名。 type是Go语言中用于定义新类型的关键字&#xff0c;它提供了强大的类型定义能力。 取别名示例 type MyInt int注意事项 这创建了一个新类型MyInt&#xff0c;它底层是int类型&#xff0c;但与int是不同…

服务端定时器的学习(一)

一、定时器 1、定时器是什么&#xff1f; 定时器不仅存在于硬件领域&#xff0c;在软件层面&#xff08;客户端、网页和服务端&#xff09;也普遍应用&#xff0c;核心功能都是高效管理大量延时任务。不同应用场景下&#xff0c;其实现方式和使用方法有所差异。 2、定时器解…

Mac版本Android Studio配置LeetCode插件

第一步&#xff1a;Android Studio里面找到Settings&#xff0c;找到Plugins&#xff0c;在Marketplace里面搜索LeetCode Editor。 第二步&#xff1a;安装对应插件&#xff0c;并在Tools->LeetCode Plugin页面输入帐号和密码。 理论上&#xff0c;应该就可以使用了。但是&a…

【ISP算法精粹】动手实战:用 Python 实现 Bayer 图像的黑电平校正

在数字成像领域&#xff0c;图像信号处理器&#xff08;ISP&#xff09;如同幕后英雄&#xff0c;默默将传感器捕获的原始数据转化为精美的图像。而黑电平校正&#xff0c;作为ISP预处理流程中的关键一环&#xff0c;直接影响着最终图像的质量。今天&#xff0c;我们就通过Pyth…

Oracle OCP与MySQL OCP认证如何选?

认证本质与定位差异 Oracle OCP Oracle OCP是Oracle公司推出的旗舰级数据库专家认证&#xff0c;专注于其核心的闭源商业数据库技术体系。核心领域包括RAC&#xff08;Real Application Clusters&#xff09;高可用集群、Data Guard容灾解决方案、Exadata数据库一体机集成以及…

MVVM、MVC的区别、什么是MVVM

一、什么是MVVM &#xff08;一&#xff09;定义 MVVM是Model - View - ViewModel的缩写&#xff0c;它是一种软件架构设计模式&#xff0c;主要用于构建用户界面。这种模式将应用程序分为三个主要部分&#xff1a; Model&#xff08;模型层&#xff09; 它是应用程序中负责…