总体而言,您的功能是:
如果 x 的长度等于 5 ,则返回 True
否则,如果字符串的最后一个字符等于第一个字符,则返回 True,
否则返回假
这种条件 else 条件...else return False 最好用 or 语句表示,只有当所有条件都为 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。
这是基于回文反转与回文相同的事实的回文测试的替代shorte函数。
def isPalindrome(s):
return s==s[::-1]