【问题标题】:python return within looppython在循环内返回
【发布时间】:2018-02-21 13:06:23
【问题描述】:

如果我定义:

def hasNoX_2(s):
    if type(s)!=str:
       return False
    for c in s:
        if c!='x' or c!='X':
           return True
    return False

然后输入hasNoX_2('Xenon'),返回True,我不知道为什么。第一个 If 语句没有返回任何内容,因为它仅在 s 不是字符串时返回 False。那么当 for 循环说“嘿,我没有看到 'x''X',所以我可以返回 True”时,它在“查看”什么?

【问题讨论】:

  • 因为您的逻辑测试是否至少有一个字母不是 x。只需手动运行您的代码,您就会明白为什么。
  • 它在第一次迭代时返回,因为对您的 if 语句的评估是 True 或 False,这显然是 True
  • 我已经修复了缩进
  • 如果字符串中的任何字符不是'x'或'X',代码返回True
  • 实际上,它总是会返回 True - 即使对于字符串 'xxxxx' 也是如此。它将返回 False 的唯一字符串是空字符串 ""

标签: python loops for-loop return


【解决方案1】:

让我们只关注 if 语句

if c!='x' or c!='X':

这是一个带有两个项的布尔表达式

  • c != 'x'
  • c != 'X'

当您使用 or 运算符时,如果任一术语的计算结果为 True,则整个表达式的计算结果为 True。如果表达式的计算结果为 True,则执行 if 语句的主体(在本例中为 return True)。

这是or 表达式(A 或 B)的标准真值表

 A or B     | A = False | A = True |
 ----------------------------------
| B = False | False     | True     |
| B = True  | True      | True     |

如您所见,结果是False 只有如果两个词都是假的

让我们看看您的表达式如何针对每种类型的输入进行计算

c                   | c != 'x' | c != 'X' | or expression |
----------------------------------------------------------
'x'                 | False    | True     | True          |
'X'                 | True     | False    | True          |
any other character | True     | True     | True          |

简而言之,您的表达式将始终评估为 True - 并且始终采用 if 分支。

因此,该函数在检查提供的字符串中的第一个字符时将return True

这个函数可以返回 False 的唯一方法是

  • 如果提供了 str 以外的其他内容
  • 如果提供了空字符串 - 因为从未进入过 for 循环。

【讨论】:

  • 感谢您抽出宝贵时间来做这件事!这很有帮助。
【解决方案2】:

如果输入字符串中的所有字符不等于 'x' 或 'X',我想你会尝试实现 True。

如果是这样,您可以简单地使用以下代码:

def hasNoX_2(s):

    if isinstance(s, str):
        return 'x' not in s.lower()

    return False

print(hasNoX_2('Xenon'))
print(hasNoX_2('eenon'))

【讨论】:

  • 如果您正确解释了 OP 的意图,这是有效的。然而,他们实际上是在问为什么他们的代码总是返回 True。看我的回答
【解决方案3】:

您在 for 循环中遍历字符串中的每个字符。所以它正在查看每个角色。当那些 if 语句为真时,您的循环几乎正在寻找。

但是使用或者如果其中一个为真,则整个条件条件评估为真,所以使用 and 来确保两个语句都为真

【讨论】:

  • 查看我的答案 - if 语句对所有字符都为真。
  • 对,我现在看到那个人很可能必须使用并获得这两种情况
  • 可能.. 但函数名没有帮助。如果“字符串中没有 X”或“字符串中存在 X 以外的其他内容”,该函数是否返回 True?这就是为什么我只是试图专注于解释他们所看到的结果。
猜你喜欢
  • 2015-02-24
  • 1970-01-01
  • 2015-12-30
  • 2017-02-27
  • 1970-01-01
  • 2018-05-27
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多