在Python中交换字符串的第一个和最后一个字母

时间:2013-06-20 22:01:23

标签: python python-2.7 ternary-operator

我希望我在这里遗漏了一些明显的东西,但我正在玩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'

我期待...

所以我的问题确实存在;为什么检查''转到三元运算符的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;

2 个答案:

答案 0 :(得分:2)

这是operator precedence的问题。

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

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

对于str = ""len(str) < 2评估True,但str为空字符串,评估为False,因此and } expression是False,因此or二进制op的右操作数成为表达式的结果。

对于str = "abc"的情况,len(str) < 2False,因此and表达式短路为False,而表达式位于右侧or就是结果。

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

正如您所看到的,如果and条件下的结果等同于{{1},那么使用or / True将无法与其他语言的三元运算符类似地工作例如 False产生True and 0 or 1,而使用1产生0 if True else 1

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

0

答案 1 :(得分:0)

def front_times(str, n):
    return str[0:3] * n