【问题标题】:What does the last return statement in the code below mean exactly?下面代码中的最后一个 return 语句究竟是什么意思?
【发布时间】:2016-12-10 22:36:10
【问题描述】:

我对 python 很陌生。我在网上找到了有关此函数主体的一些帮助(我删除了示例以缩短它)但是我对“返回真”语句相对于整个代码主体的含义感到困惑。我理解第一个 if 语句,但不理解“return True”语句,因为它没有 elif 或 else 。我还注意到 return True 语句在 if 语句下没有缩进。这有什么解释吗?谢谢!

def is_valid_sequence(dna):
   """ (str) -> bool

   Return True if and only if the DNA sequence is valid
   (that is, it contains no characters other than 'A', 'T', 'C' and 'G').
   """
   valid_dna = 'ACGT'
   for nucleotide in dna:
       if nucleotide not in valid_dna:
           return False
   return True

【问题讨论】:

  • 为什么需要else?当for 循环结束而if 没有匹配时,到达最后一行。如果if 测试确实匹配nucleotide 值之一,则到达return False 并且函数结束。
  • 欢迎来到 Stack Overflow。查看此代码如何工作的一种方法是添加打印语句以帮助您遵循流程。你也可以下载PyCharm Community Edition并使用它的调试器。
  • 或者试试pythontutor.com
  • 这样想,“函数应该总是return True,除非被另一个return语句截获”。在这种情况下,如果return False 的条件通过,函数将在此时退出。现在,即使您没有任何 return True 语句,默认情况下该函数也会静默 return None。自己测试一下。尝试在没有最后一行的情况下运行此函数并看到它是type()

标签: python python-3.x


【解决方案1】:

只有当for 循环结束而if 没有匹配时,才会到达最后一行。此时您知道所有nucleotide 测试都是有效的DNA 字符。

如果if 测试确实匹配nucleotide 值之一,则到达return False 并且函数结束。

因此代码会测试dna 中的每个nucleotide,直到找到无效的nucleotide 值(因此if nucleotide not in valid_dna 为真并且return False 被执行),或者全部值已经过测试,for 循环结束,return True 被执行。

另一方面,如果您在 if 测试中使用了 else 块,那么只有 first nucleotide 值被测试并且您过早返回 True,无需测试dna 序列的其余部分。

您可以使用AGFTAGCT 这两个示例单步执行代码。第一个不是有效的 DNA,第二个是

对于AGFT,代码执行以下操作:

  • nucleotide = 'A',if 核苷酸不在 valid_dnais *False* so theif` 测试不匹配,循环再次从顶部继续。
  • nucleotide = 'G',if 核苷酸不在 valid_dnais *False* so theif` 测试不匹配,循环再次从顶部继续。
  • nucleotide = 'F',if 核苷酸不在 valid_dnais *True* so theiftest **does** match andreturn Falseis reached. The function ends, returningFalse`。

对于AGCT,事件顺序为:

  • nucleotide = 'A',if 核苷酸不在 valid_dnais *False* so theif` 测试不匹配,循环再次从顶部继续。
  • nucleotide = 'G',if 核苷酸不在 valid_dnais *False* so theif` 测试不匹配,循环再次从顶部继续。
  • nucleotide = 'C',if 核苷酸不在 valid_dnais *False* so theif` 测试不匹配,循环再次从顶部继续。
  • nucleotide = 'T',if 核苷酸不在 valid_dnais *False* so theif` 测试不匹配,循环再次从顶部继续。
  • 没有要测试的核苷酸了。循环结束。
  • 到达return True 行。函数结束,返回True

【讨论】:

    【解决方案2】:

    这意味着如果循环中的每个项目都没有返回false,那么最后你将返回true。

    【讨论】:

      【解决方案3】:

      如果 for 循环中的任何 if 语句为真,则函数将 返回 False,这意味着离开函数并返回 False

      如果 for 循环中的 if 语句都不为真,则 for 循环将遍历 dna 中的所有 核苷酸,然后转到它返回的下一条语句是的

      【讨论】:

        【解决方案4】:

        如果字符串dna中有一个无效字符,则该函数将返回False。 如果你循环了整个dna,并且没有发现任何不好的地方,那么这个函数最后返回True

        【讨论】:

          猜你喜欢
          • 2018-01-23
          • 1970-01-01
          • 2011-03-12
          • 2014-10-29
          • 2016-01-27
          • 2014-12-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多