【问题标题】:about the return expression关于返回表达式
【发布时间】:2011-04-04 13:26:11
【问题描述】:

级别:初学者

以下代码将打印'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]”行打印为 False? 我明白发生了什么,但我很难把它用简单的英语表达出来……如何描述这种行为?

这是一种常用/经常使用的“技术”吗?

我在尝试递归解决回文练习时第一次遇到这种特殊语法。似乎使递归起作用的唯一方法是使用这种速记方法:

def isPalindrome(s):
 if len(s) <= 1: return True
 else: return s[0] == s[-1] and isPalindrome(s[1:-1])

print isPalindrome('anna')

谢谢 爸爸

【问题讨论】:

    标签: python return semantics


    【解决方案1】:

    对不起,我不完全确定你的意思,但这里可以这样想:

    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] 将是“左”的第一个元素-to-right' 可以这么说,x[-1] 循环,使其成为 'right-to-left' 中的第一个元素。

    【讨论】:

    • 嗨,Blaenk,您的回答现在让我明白了。作为初学者,我必须理解速记,所以感谢您的帮助!
    【解决方案2】:

    我认为您感到困惑的是x[-1] 的行为。负数组索引是相对于数组末尾的,因此在您的示例中,x[-1] == 'b'。显然不等于x[0] == 'a',所以函数返回False。

    【讨论】:

      【解决方案3】:

      总体而言,您的功能是: 如果 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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-06
        相关资源
        最近更新 更多