8

我正在学习 Udacity 的 Web 应用工程课程。我注意到讲师在他的验证方法中使用了语句中的and运算符。return而且我不明白如何返回 2 个参数。我认为,这可能类似于if声明。谁能解释它实际上是什么?

下面是验证方法:

USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
def valid_username(username):
    return username and USER_RE.match(username)

提前致谢。

4

3 回答 3

16

运算符评估它的and两个参数是否为真,但以一种有点令人惊讶的方式:首先它检查它的左参数。如果它是真的,那么它会返回正确的论点。如果左参数为假,则返回左参数。

所以代码中的最后一行:

return username and USER_RE.match(username)

是相同的:

if username:
    return USER_RE.match(username)
else:
    return username

username如果它们不为空,则类似的字符串是真实的。如果模式匹配,则 regexmatch函数返回一个真实的匹配对象None,如果不匹配,则返回一个虚假的值。

最终结果是,valid_username如果用户名不是空字符串,并且用户名与给定模式匹配,则将返回一个真值。

注意这里的“and”与返回两个值无关,它是计算一个值。

于 2012-07-22T23:29:46.627 回答
3

当您使用逻辑运算符时,它会根据规则继续,因此使用 and,它会评估第一个语句的真实性,如果它不真实,则返回一个非真实值(在第一种情况下,'') .

print repr("" and "THIS IS POST AND")
""

print "" or "THIS IS POST AND"
THIS IS POST AND

print None or "Something else"
Something else

当你不想在类似的东西None(例如长度特征)上调用不存在的方法时,这会派上用场:

r = None

s = [1,2,3,4]

print r and len(r)
None

print s and len(s)
4

在您发布的情况下,关键是如果用户名是真实的,您只想根据正则表达式检查用户名。

这里需要注意的是and, 和or两者都短路。所以如果你得到一些不真实的东西,这个函数甚至不会评估正则表达式。

于 2012-07-22T23:30:09.803 回答
-1

and只是一个二元运算符。return a and b在结构上与return a + bor相同return a * b,并且工作方式相同。对表达式求值,然后将其结果提供给 ,然后将return其返回给调用者。andreturn语句中使用并没有什么特别之处。

正如 Ned 的回答很好地解释的那样,a and b如果ab都为真,则结果为真,否则为假。如果左参数是假的,它也会短路,因为这足以确定整个a and b表达式的结果。

在这种情况下,空字符串与该正则表达式不匹配,因此该操作是多余的,纯粹作为逻辑考虑。我强烈怀疑它在这里被使用,因为username可能会被赋予 value None,这会导致正则表达式匹配抛出异常。使用username and USER_RE.match(username)而不是仅仅USER_RE.match(username)意味着任何错误的值(包括Noneusername导致函数返回错误的值,甚至不尝试正则表达式匹配。

But again, this has nothing to do with return, it's just how and works.

于 2012-07-23T02:26:15.783 回答