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

发布于 2021-01-29 14:58:28

我试图更好地理解以下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,但是我真的很想了解这样编写的内容,而不仅仅是返回布尔值。

关注者
0
被浏览
90
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在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帮助我们避免回溯?这就是此函数中正在发生的事情。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看