如果字符串语句:我错过了啥? [复制]

Posted

技术标签:

【中文标题】如果字符串语句:我错过了啥? [复制]【英文标题】:If string statement: What am I missing? [duplicate]如果字符串语句:我错过了什么? [复制] 【发布时间】:2015-12-29 08:17:05 【问题描述】:

我创建了一个如下所示的简单代码:

name = str(input ("What is your name?"))

gender = str(input ("What is your gender?"))

if gender == 'male' or 'Male':

    print ("Hello Mr %s" % (name))

elif gender == 'female' or 'Female':

    print ("Hello Mrs %s" % (name))

else:

    print ('Invalid gender. Please try again.')

但是,无论我输入什么性别(即使是像 test 这样的随机词),它总是会打印出 if 语句,这意味着它满足 gender == male 部分。就像我输入female 一样,if 语句仍然会打印出来。我在这里错过了什么?

【问题讨论】:

name = str(input ("What is your gender?")) 你从不指定性别? 对不起!那是一个错字,我已经把它改成了性别!但仍然有同样的问题。 如果答案已经解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。 【参考方案1】:

在步骤中

首先使用正确的变量名:

gender = input("What is your gender?")

二、or的使用是错误的:

>>> 'male' or 'Male'
'male'

用途:

if gender == 'male' or gender == 'Male':

替代使用:

if gender.lower() == 'male':

整个程序

name = input("What is your name?")
gender = input("What is your gender?")

if gender.lower() == 'male':
    print("Your are %s" % (gender))
elif gender.lower() == 'female':
    print("Your are %s" % (gender))
else:
    print('Invalid gender. Please try again.')

短版

name = input("What is your name?")
gender = input("What is your gender?")

if gender.lower() in ('male', 'female'):
    print("Your are %s" % (gender.lower()))
else:
    print('Invalid gender. Please try again.')

【讨论】:

@Lafexlos 谢谢。刚看到这个。添加到我的答案中。 天啊!解决了!谢谢!那么实际上该程序的主要问题是什么?是使用or吗? 另一个不错的选择(在这种情况下没用,但值得学习):if gender in ('male', 'Male'): @AndreaCorbellini 实际上在这里很有用。请参阅我的较短版本。 @MikeMüller 只是要注意 - 那些在 input 周围的 str 调用是多余的 - input 已经返回一个字符串【参考方案2】:

当比较多个字符串时,你需要做不同的事情:

if gender == 'male' or gender == 'Male':

或者,更简单地说:

if gender in ['male', 'Male']:

或者用一组:

if gender in 'male', 'Male':

只有两个项目的速度差异不大,但有很多 一个集合的项目会更快,因为它使用哈希表,而列表 使用线性搜索。

现在,至于您的代码发生了什么。如果你这样做:

if gender == 'male' or 'Male':

你是说:

if (gender == 'male') or ('Male'):

所以,不管gender是什么,如果第一个比较是False,它 将继续访问'Male'。那是一个非空字符串,所以它总是 True 和条件总是以 True 结尾。

【讨论】:

确实,集合允许平均 O(1) 查找,但您仍然必须在 O(n) 时间内构建 has 表。您将需要 很多 个项目才能看到差异,即使在这种情况下,您最好将集合存储为全局变量,这样函数就不需要每次都重新构建集合它被调用的时间 @AndreaCorbellini 我在考虑动态构建列表的用例,如我的回答here。

以上是关于如果字符串语句:我错过了啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 Flexbox 中居中不起作用。啥是高度、宽度、显示和位置要求?我错过了啥? [复制]

如果您在 OnColliderEnter2D() 中播放声音是不是有任何限制,或者我错过了啥?

SwiftUI:如果 @ObservedObject 是 UIViewController 的子类,则不会重新加载视图内容。这是一个错误还是我错过了啥?

不能在存储过程中添加两个数字。我错过了啥?

事件溯源和 CQRS,我错过了啥?

视图控制器方向没有按预期工作,我错过了啥?