【问题标题】:Ask user to input a correct response in Python? [duplicate]要求用户在 Python 中输入正确的响应? [复制]
【发布时间】:2015-03-28 01:00:41
【问题描述】:

我是一名新手程序员,正在尝试编写一个程序,在该程序中我要求用户提供特定的输入,例如奥巴马、克林顿或布什,并在他们给出正确答案时祝贺他们,或者在他们给出错误答案时通知他们。

我很确定我犯了一个非常简单和愚蠢的错误,所以如果有人能帮助我,我将不胜感激。

def main ():

    pres = input ('Please enter the surname of a recent President of the United States: ')
    if pres == 'Bush' or 'Obama' or 'Clinton':
        print('Great job! You know your stuff!')
    else:
        print('Sorry, that was incorrect.')

main()

谢谢!

【问题讨论】:

  • 恕我直言,不是重复的。

标签: python python-3.x


【解决方案1】:

你有:

if pres == 'Bush' or 'Obama' or 'Clinton':

虽然这对人类来说是有意义的,但 Python 认为您的意思是:

if (pres == 'Bush') or ('Obama') or ('Clinton'):

'Obama''Clinton' 是非空字符串,因此它们始终为真,因此整个表达式始终为真,输入的内容没有任何区别。

您需要明确说明您的意思:

if pres == 'Bush' or pres == 'Obama' or pres == 'Clinton':

但这是一口,所以你也可以这样做,这将检查pres是否在正确答案集中:

if pres in {'Bush', 'Obama', 'Clinton'}:

【讨论】:

  • tuple 更改为 set 将更加理想。
  • 我怀疑只有三个项目会产生很大的不同(甚至可能更慢!)但公平点:)
  • 进行了一次快速的 timeit 测试,tuple 在这种尺寸下完全更快,但我仍然认为该系列更具意识形态意义。
  • 我选择这个集合只是因为“正确答案的集合”比“正确答案的元组”读起来更好
  • 完全有道理,但也有很大的疏忽,如果匹配不是第一个条目,tuple 将不再更快,并且在 6 个条目时,tuple 平均慢约 2 倍
【解决方案2】:

检查成员资格的最佳选择是使用具有O(1)set,因此您可以使用以下语句代替您的if 语句:

if pres in {'Bush','Obama','Clinton'}

来自 python 维基:

sets 模块提供了用于构造和 操纵独特元素的无序集合。常见用途 包括成员资格测试,从序列中删除重复项, 并计算交集等集合的标准数学运算, 并集、差分和对称差分。

【讨论】:

  • 不过,为单个查找构建集合的成本使得这不如检查列表或元组中的成员资格。
  • O(1) ≈ O(n) 当 n == 3 ;)
  • @AdamSmith 你说的成本是什么意思?
  • @Eevee 我将此添加为一般说明! ;)
  • @AdamSmith 我同意有几个成员的集合是真的,但是对于有很多成员的集合或者如你所说的 MULTIPLE TIMES 使用set 更有效!无论如何感谢您的关注和提醒!
【解决方案3】:

你应该这样做:

if pres == 'Bush' or pres == 'Obama' or pres == 'Clinton':

【讨论】:

    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2016-07-25
    • 2015-06-30
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多