使用“和”作为回报

Posted

技术标签:

【中文标题】使用“和”作为回报【英文标题】:Using "and" in return 【发布时间】:2012-07-21 05:35:29 【问题描述】:

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

验证方法如下:

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

提前致谢。

【问题讨论】:

return a and b 表示return (a and b)x = a and b; return x 正如下面的答案所示,这不会返回两个参数。但是,在 Python 中,返回一个包含两个项目的元组非常容易,这在其他上下文中可能很有用。 另一种写法:return USER_RE.match(username) if username else username 【参考方案1】:

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

所以代码中的最后一行:

return username and USER_RE.match(username)

等同于:

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

username 这样的字符串如果不为空则为真。如果模式匹配,正则表达式match 函数返回一个真实的匹配对象,如果不匹配,则返回一个虚假值None

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

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

【讨论】:

【参考方案2】:

当您使用逻辑运算符时,它会根据规则继续,因此使用 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

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

这里需要注意的是andor 都是短路的。所以如果你得到一些不真实的东西,这个函数甚至不会计算正则表达式。

【讨论】:

【参考方案3】:

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

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

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

但同样,这与return 无关,这只是and 的工作方式。

【讨论】:

以上是关于使用“和”作为回报的主要内容,如果未能解决你的问题,请参考以下文章

三元运算符作为回报 - FLUTTER

从右到左 - 在链后递增作为回报

惊!6倍回报率?这样使用Python大大提高比特币的回报率!

正确使用“收益回报”

前端之旅,做一点有回报的事情

如何在投资组合分析中以 5% 和最大回报自定义 VaR