当前位置: 首页 > backend >正文

【记录】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.xdnf.cn/news/10945.html

相关文章:

  • JavaScript 对象展开语法
  • java29
  • 信息过载时,如何筛选重要信息
  • 把两个标签内容显示在同一行
  • BSRR对比BRR对比ODR
  • MySQL - Windows 中 MySQL 禁用开机自启,并在需要时手动启动
  • Vue3 中使用 i18n
  • 【MATLAB去噪算法】基于CEEMD联合小波阈值去噪算法(第三期)
  • 离散数学_数理逻辑(二):命题逻辑的推理
  • CET6 仔细阅读 24年6月第三套-C2 可变性这一块
  • 代码随想录算法训练营第60期第五十六天打卡
  • 系统思考:短期利益与长期系统影响
  • 线程池RejectedExecutionException异常
  • ssh登录wsl2
  • C++ 17中的通用类型any
  • 从“Bucharest”谈起:词语翻译的音译与意译之路
  • Qt 事件传递的完整流程
  • 运维三剑客——awk
  • My Retro App项目开发指南
  • 对 `llamafactory-cli api -h` 输出的详细解读
  • MySQL备份与恢复实战指南
  • 社群营销的一些门道
  • 项目任务,修改svip用户的存储空间。
  • 网络攻防技术八:身份认证与口令攻击
  • 力扣刷题Day 69:搜索二维矩阵(74)
  • Python趣学篇:Pygame重现经典打砖块游戏
  • Axure形状类组件图标库(共8套)
  • 苹果ios系统ipa文件签名的圈外签名是什么稳定性怎么样
  • 力扣4.寻找两个正序数组的中位数
  • isp调试 blend模式指什么