Python 支持短路吗?

2024-11-21 08:34:00
admin
原创
6
摘要:问题描述:Python 是否支持布尔表达式中的短路?解决方案 1:是的,and和or运算符都短路——请参阅文档。解决方案 2:运算符中的短路行为and:or让我们首先定义一个有用的函数来确定某件事是否执行。一个简单的函数,它接受一个参数,打印一条消息并返回输入,不做任何改变。>>> def ...

问题描述:

Python 是否支持布尔表达式中的短路?


解决方案 1:

是的,andor运算符都短路——请参阅文档。

解决方案 2:

运算符中的短路行为andor

让我们首先定义一个有用的函数来确定某件事是否执行。一个简单的函数,它接受一个参数,打印一条消息并返回输入,不做任何改变。

>>> def fun(i):
...     print "executed"
...     return i
... 

可以在以下示例中观察 Python 的,运算符的短路行为:and`or`

>>> fun(1)
executed
1
>>> 1 or fun(1)    # due to short-circuiting  "executed" not printed
1
>>> 1 and fun(1)   # fun(1) called and "executed" printed 
executed
1
>>> 0 and fun(1)   # due to short-circuiting  "executed" not printed 
0

注意:解释器认为以下值是错误的意思:

        False    None    0    ""    ()    []     {}

函数中的短路行为:any()all()

Python 的any()all()函数也支持短路。如文档中所示;它们按顺序评估序列中的每个元素,直到找到允许提前退出评估的结果。请考虑以下示例以了解两者。

该函数any()检查是否有任何元素为 True。一旦遇到 True,它就会停止执行并返回 True。

>>> any(fun(i) for i in [1, 2, 3, 4])   # bool(1) = True
executed
True
>>> any(fun(i) for i in [0, 2, 3, 4])   
executed                               # bool(0) = False
executed                               # bool(2) = True
True
>>> any(fun(i) for i in [0, 0, 3, 4])
executed
executed
executed
True

该函数all()检查所有元素是否为 True,一旦遇到 False 则停止执行:

>>> all(fun(i) for i in [0, 0, 3, 4])
executed
False
>>> all(fun(i) for i in [1, 0, 3, 4])
executed
executed
False

链式比较中的短路行为:

此外,在 Python 中

比较可以任意链接;例如,x < y <= z相当于x < y and y <= z,除了y只评估一次(但在两种情况下,当发现为假z时根本不会评估)。x < y

>>> 5 > 6 > fun(3)    # same as:  5 > 6 and 6 > fun(3)
False                 # 5 > 6 is False so fun() not called and "executed" NOT printed
>>> 5 < 6 > fun(3)    # 5 < 6 is True 
executed              # fun(3) called and "executed" printed
True
>>> 4 <= 6 > fun(7)   # 4 <= 6 is True  
executed              # fun(3) called and "executed" printed
False
>>> 5 < fun(6) < 3    # only prints "executed" once
executed
False
>>> 5 < fun(6) and fun(6) < 3 # prints "executed" twice, because the second part executes it again
executed
executed
False

编辑:

还有一点值得注意 Python 中的逻辑and运算or符返回操作数的,而不是布尔值(TrueFalse)。例如:

运算x and y结果if x is false, then x, else y

与其他语言不同&&,例如||C 语言中的运算符返回 0 或 1。

例子:

>>> 3 and 5    # Second operand evaluated and returned 
5                   
>>> 3  and ()
()
>>> () and 5   # Second operand NOT evaluated as first operand () is  false
()             # so first operand returned 

类似地,or运算符返回最左边的值,对于bool(value)== True,否则返回最右边的假值(根据短路行为),示例:

>>> 2 or 5    # left most operand bool(2) == True
2    
>>> 0 or 5    # bool(0) == False and bool(5) == True
5
>>> 0 or ()
()

那么,这有什么用呢?Magnus Lie Hetland 所著的《实用 Python》
一书中给出了一个例子:
假设用户应该输入自己的姓名,但可能选择不输入任何内容,在这种情况下,您需要使用默认值'<Unknown>'。您可以使用 if 语句,但也可以非常简洁地陈述:

In [171]: name = raw_input('Enter Name: ') or '<Unknown>'
Enter Name: 

In [172]: name
Out[172]: '<Unknown>'

换句话说,如果 from 的返回值为raw_inputtrue(不是空字符串),则将其分配给 name(不发生任何变化);否则,将默认'<Unknown>'分配给name

解决方案 3:

是的。请在 Python 解释器中尝试以下操作:

>>>False and 3/0
False
>>>True and 3/0
ZeroDivisionError: integer division or modulo by zero

或者

>>>True or 3/0
True
>>>False or 3/0
ZeroDivisionError: integer division or modulo by zero
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用