我希望我在这里遗漏了一些明显的东西,但我正在玩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;
答案 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) < 2
为False
,因此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