级别:初学者
以下代码将打印'False'
def function(x):
if len(x) == 5: return True
else: return x[0] == x[-1]
print function('annb')
为什么行“else:return x [0] == x [-1]”print False? 我确实理解发生了什么,但我很难把它变成简单的英语......怎么能描述这种行为?
这是一种常用/经常使用的“技术”吗?
在尝试解决回文练习recursivley时,我首先遇到了这种特殊的语法。似乎使递归工作的唯一方法是使用这种速记方法:
def isPalindrome(s):
if len(s) <= 1: return True
else: return s[0] == s[-1] and isPalindrome(s[1:-1])
print isPalindrome('anna')
感谢 巴巴
答案 0 :(得分:6)
对不起,我不完全确定你的意思,但这里就是这样想的:
return (x[0] == x[-1])
如果您只考虑括号内的内容,您会发现,'语句'等同于布尔值,对吗?这就是你也可以这样做的原因:
if x[0] == x[-1]
所以基本上,这里返回的是一个布尔值,表示x [0]是否等于[-1]。
可以更明确地将此陈述扩展为以下内容:
if x[0] == x[-1]: # if this is true
return True # then return true
else:
return False
但正如您所看到的,条件和您想要返回的内容都是相同的值,所以只需像您所看到的那样简写:
return x[0] == x[-1]
很抱歉,如果我误解了你的问题。
编辑:如果你引用了否定索引(x[-1]
),在Python中,负指数基本上是“环绕”,那么x[0]
将成为第一个从“从左到右”的元素可以这么说,x[-1]
循环使得它是“从右到左”的第一个元素。
答案 1 :(得分:1)
我认为你感到困惑的是x[-1]
的行为。负数组索引相对于数组的末尾,因此在您的示例中,x[-1]
=='b'。这显然不等于x[0]
=='a',因此该函数返回False。
答案 2 :(得分:0)
总的来说,你的功能是: 如果x的长度等于5,则返回True 否则,如果字符串的最后一个字符等于第一个返回True, 否则返回False
这种条件否则条件... else返回False最好用或者语句表示,只有当所有条件都为False并且返回第一个非-False元素的值时才返回False。其他选择是任何与任何序列基本相同的功能。这里测试原始if语句的所有分支的那些替代:
def function(x):
if len(x) == 5: return True
else: return x[0] == x[-1]
def funcor(x):
return (len(x)==5) or (x[0] == x[-1])
def funcany(x):
return any((len(x)==5, x[0] == x[-1]))
def funcverbal(sequence):
## sequence[0] is the first element of zero based indexed sequence
## endswith is string specific function so sequence must be string
## if it's length is not 5
return len(sequence)==5 or sequence.endswith(sequence[0])
## function is normal data type in Python, so we can pass it in as variable
def test(func):
print('Testing %s function' % func)
for value in ('12345','annb','ansa','23424242',('1','2','1'), 123, '131'):
try:
print ("%r -> %r" % (value,func(value)))
except:
print ("Failed to call function with " + repr(value))
print(10 * '-'+'Finished testing '+str(func) + 10 * '-')
for thisfunction in (function, funcor, funcany, funcverbal):
test(thisfunction)
(功能在蓝色中作为保留字突出显示,但在本网站的高亮例程中是错误的)
在isPalindrome函数的情况下,长度条件不是任意的,但是有必要识别原始情况以停止递归,如果是'anna',则回文函数会:
看看'anna'的长度是否小于2(1或0),否则它们不是 比较'a'和'a',继续,因为它们是相同的 删除比较的第一个和最后一个字母,并使用'nn'
调用isPalindrome看看'nn'的长度是否小于2(1或0),否则它们不是 比较'n'和'n',继续,因为它们是相同的 删除比较的第一个和最后一个字母,并使用''
调用isPalindrome看看''的长度是否小于2(1或0),是的。当我们发现回文时返回True。
以下是回文测试的替代缩短函数,基于回文回归与回文相同的事实。
def isPalindrome(s):
return s==s[::-1]