1

我希望我在这里遗漏了一些明显的东西,但是我正在玩 Python CodingBat 网站,并遇到了问题front_back

对于传入的字符串,如果字符串长度大于 1,则将其第一个和最后一个字符交换后返回。

我想出了一个我认为就足够的单行解决方案,但 Coding.bat 拒绝接受它,并出现索引超出范围错误。

我在 IDLE(64 位 Windows 版本)中玩过,我把问题归结为:

len(str) < 2 and str or 'doh ' + str + ' /doh'

奇怪的问题是设置str = ''返回:

'doh  /doh'

它不应该因为 len('') 为 0,而是str='a'返回:

'a'

str='abc'返回:

'doh abc /doh'

我期望...

所以我的问题是真的;为什么检查 '' 的 len 是去三元运算符的 OR 条件,但是len('')在控制台运行返回 0,明显小于 2?

编辑:

但是,此解决方案实际上有效:

  def front_back(str):
    if len(str)  < 2:
        return str
    else:
        return str[-1] + str[1:-1] + str[0]

'mtadd'; 感谢您的回答,但这不合逻辑和/或这是一个 pythonic 三元运算符:

return (statement) and <statement was true> or <statement was false>

它与 C# 相同:

return statement
    ? trueValue
    : falseValue;
4

2 回答 2

2

它是运算符优先级的问题。

对于您的表达式,隐式排序如下

((len(str) < 2) and str) or ('doh ' + str + ' /doh')

在 的情况下str = ""len(str) < 2计算True,但是str,一个空字符串,计算为False,因此and表达式是False,所以or二元运算的右操作数成为表达式的结果。

对于 , 的情况str = "abc",len(str) < 2False, 所以and表达式短路为False, 右边的表达式or是结果。

对于 的情况str = "ab"len(str) < 2为真,因此and表达式将其右操作数传递给or二元运算符,并且由于bool("ab") == True, 的值str成为表达式的结果。

如您所见,如果您在条件情况下的结果等同于,例如 yield ,而使用yield ,则使用and/or将不会像其他语言的三元运算符那样工作。TrueFalseTrue and 0 or 110 if True else 10

我建议使用 python 的三元 if/else 表达式,例如:

str if len(str) < 2 else 'doh ' + str + ' /doh'
于 2013-06-20T23:12:59.327 回答
0
def front_times(str, n):
    return str[0:3] * n
于 2014-03-21T22:51:16.183 回答