当前位置: 首页 > 面试题库 >

该“和”语句实际上在返回结果中是做什么的?

林烨华
2023-03-14
问题内容

我试图更好地理解以下python代码以及作者为什么在返回中使用“ AND”语句。

def valid_password(self, password):
        PASS_RE = re.compile(r'^.{6,128}$')
        return password and PASS_RE.match(password)

进一步的代码…

if not self.valid_password(self.password):
    params['error_password'] = "Please enter a valid password."

我尝试检查返回给调用方的结果对象,但是我仍然不完全了解它是如何工作的。

似乎这将密码返回给调用者,并返回一个布尔值,表明密码是否有效,但是我不明白调用函数如何检查对象的布尔值?这是我错过的关于Python的基本知识吗?

在该示例旁边还有另一个类似用法的示例,但是它使用“或”语句,对我而言,这更加令人困惑:

def valid_email(self, email):
    EMAIL_RE  = re.compile(r'^[\S]+@[\S]+\.[\S]+$')
    return not email or EMAIL_RE.match(email)

任何关于这里到底发生什么的建议将不胜感激。该代码可以工作,并且可以执行您期望的操作,根据正则表达式验证输入并返回True或False,但是我真的很想了解这样编写的内容,而不仅仅是返回布尔值。


问题答案:

在Python中,andor都将返回其操作数之一。使用or,Python会检查第一个操作数,如果它是一个“真实的”值(稍后会提供更多有关真实性的信息),它将返回第一个值而不检查第二个值(这称为布尔快捷方式评估,这可能很重要)。如果第一个为“
falsey”,则Python返回第二个操作数,无论它是什么:

Python 2.7.3 (default, Jan  2 2013, 13:56:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 2 or 3
2
>>> 0 or 3
3

使用“ and”,会发生很多相同的事情:首先检查第一个操作数,如果它是“ false”,则Python永远不会检查第二个操作数。如果第一个操作数是“
truthy”,则Python返回第二个操作数,无论它是什么:

>>> 2 and 3
3
>>> 0 and 3
0
>>> 3 and 0
0
>>> 3 and []
[]
>>> 0 and []
0

现在让我们谈谈“真实性”和“虚假性”。Python使用以下规则在布尔上下文中评估事物:

  • 以下值为“ falsey”:False,None,0(零),[](空列表),()(空元组),{}(空dict),空集,“”(空)串)
  • 其他一切都是“真实的”

因此,类似的东西password and PASS_RE.match(password)正在利用Python的短路评估功能。如果password为None,则and运算符将仅返回None,并且从不评估下半部分。很好,因为PASS_RE.match(None)会引发异常。看这个:

>>> 3 or []
3
>>> [] or 3
3
>>> 0 or []
[]
>>> [] or 0
0
>>> 0 and []
0
>>> [] and 0
[]

看看短路是如何工作的?现在看这个:

>>> value = "hello"
>>> print (value.upper())
HELLO
>>> print (value and value.upper())
HELLO
>>> value = None
>>> print (value.upper())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'upper'
>>> print (value and value.upper())
None

看看短路功能如何and帮助我们避免回溯?这就是此函数中正在发生的事情。



 类似资料:
  • 问题内容: 我想知道我们如何获得函数返回的值-python return语句实际返回的内容。 考虑以下代码: 调用时,我们获得了价值。 绑定整数对象。 这是什么意思?return语句实际上在这里返回什么?该对象?还是变量名?还是绑定到对象?或者是其他东西? 我们如何获得return语句返回的值? 问题答案: x绑定整数对象5。 是的,是一个持有对整数对象5的引用的变量,该对象也持有对该整数对象的引

  • 我正试图把我的头缠在Apache Mesos上,需要澄清几个项目。 我对Mesos的理解是,它是一个安装在集群中的每个物理/VM服务器(“节点”)上的可执行文件,然后提供一个Java API(不知何故),将每个单独的节点视为计算资源(CPU/RAM/等)的集体池。因此,对于使用Java API编码的程序,他们只看到一组资源,而不必担心如何/在哪里部署代码。 因此,首先,我在这里的理解可能是根本错误

  • 我在看一个典型的for循环: 我对int I=1后的分号很满意:它是一个声明新变量的语句。如果i也是一个语句,为什么后面没有分号? 另一个例子。我打开Jshell并放置以下内容: 换句话说,命令可以工作,与是否有分号无关。我希望没有它就无法工作。 最后一个示例(改编自关于

  • 我已经回答了一个关于Python中的绝对导入的问题,我认为通过阅读Python2.5更改日志和附带的PEP我理解了这个问题。但是,在安装Python2.5并尝试创建一个从__future__import absolute_import中正确使用

  • 如果我们假设有如下所示的XML,那么match=“/”究竟返回什么?据我所知,它返回了一个虚构的顶级节点,它具有<代码> 测验xml

  • 我只是第一次涉足iOS开发,我必须做的第一件事就是实现一个自定义容器视图控制器——让我们称之为SideBarViewController——它交换了几种可能的视图控制器中的哪一种它显示的子视图控制器,几乎与标准的Tab Bar Controller一模一样。(它几乎是一个标签栏控制器,但有一个可隐藏的侧菜单,而不是标签栏。) 根据Apple文档中的说明,每当我向容器中添加子ViewControll