Python 支持短路吗?

2024-11-21 08:34:00
admin
原创
182
摘要:问题描述: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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用