python 根据用户以前的答案制作调查问卷

wpcxdonn  于 2023-01-29  发布在  Python
关注(0)|答案(3)|浏览(135)

我最近开始编写一个Python程序,我想在整个答案过程中"指导"用户,我认为最好的表达方式是举一个例子:
假设我有一个调查问卷,其中有两个问题,但只有用户回答了前面的问题,才能问这些问题:

  • Q1:您是否年满18岁?
  • 回答1:是(* 重定向到问题2 *)
  • A1:否(* 重定向到说明用户不能参与问卷调查的文本)

我还想用它做更多的事情。我的完整计划是:
有一个初始问题,询问用户想要使用三个功能中的哪一个。

  • 第一个功能:检查用户是否可以申请(年龄、状态等)
  • 第二个功能:列出应用的步骤
  • 第三项职能:提供一个问答列表。

到目前为止,我编写的代码只是第一个函数,有许多错误(我以前从未编写过代码)。

  • 你如何格式化这个代码,使它适合我想做的整个方案?
  • 我怎样才能让它在用户出错(不是输入y或n)时不会崩溃,而是循环回到问题?

我的代码到目前为止:

print ("Answer all yes or no questions with Y or N")
while True:
  idade = input("Are you over 18? Y/N")
  if idade.lower() not in ('y', 'n'):
    print("Answer only with Y or N")
  else:
    if idade == "Y" or idade == "y":
      crime = input("Have you ever been arrested or convicted before?")
    if idade == "N" or idade == "n":
      print("Sorry, you can't apply. ")
  if crime.lower() not in ('y', 'n'):
      print("Answer only with Y or N")
  else:
     if crime == "Y" or crime == "y":
      print("Sorry, you can't apply. ") 
     if crime == "N" or crime == "n":
      visto = input("Do you have visa TYPE_A'? ")
  if visto.lower() not in ('y', 'n'):
    print("Answer only with Y or N")
  else:
        if visto == "Y" or visto == "y":
          print("THAT'S AS FAR AS I'VE GONE")
        if visto == "N" or visto == "n":
          print("THAT'S AS FAR AS I'VE GONE")
          break
1u4esq0p

1u4esq0p1#

我想这可能有点过头了,但我认为这是一个很好的使用字典来创建一个系统的相互联系的问题。这个解决方案的好处是,如果你需要重复一个问题或类似的,你不必键入同样的东西两次。它也很容易扩展,看起来很干净。
字典questions使用问题的名称作为它的键。第一个问题总是"START",但是如果你愿意,你可以改变它。每个问题都是它自己的字典,允许你打印文本、提示、潜在的操作,并且还可以决定当选择某个答案时会发生什么。

  • "text"用于你想告诉用户一些不是问题的东西,并且首先执行。你可以使用"text""prompt",尽管这可能不是必需的。
  • "prompt"就是问题所在。
  • "y""n"是您要转到的问题的名称(如果选择了该答案)。
  • "action"用来告诉程序在提问时是否需要做一些事情,我实现的唯一操作是结束调查问卷。

要运行该程序,请调用exec_questions(questions),其中questions是您的字典。

questions = {
    'START':
        {
            'prompt':'Are you 18 or over?',
            'y':'q2',
            'n':'fail'
        },
    'q2':
        {
            'prompt':'Have you ever been arrested or convicted?',
            'y':'fail',
            'n':'q3'
        },
    'q3':
        {
            'prompt':'Do you have a visa TYPE_A?',
            'y':'q4',
            'n':'fail'
        },
    'q4':
        {
            'text':'THAT\'S AS FAR AS I\'VE GONE',
            'action':'end'
        },
    'fail':
        {
            'text':'Sorry, you can\'t apply',
            'action':'end'
        }
}

def exec_questions(questions):
    print("Please answer all questions using y/n")

    this_question = questions['START']
    while True:
        if 'text' in this_question.keys():
            print(this_question['text'])

        if 'action' in this_question.keys():
            if this_question['action'] == 'end':
                return

        if 'prompt' in this_question.keys():
            while True:
                res = input(this_question['prompt']+"\n > ").lower()
                if not res.lower() in ('y','n'):
                    print("Please type y/n")
                    continue
                break

            this_question = questions[this_question[res]]

exec_questions(questions)
mzillmmw

mzillmmw2#

def valid_input(message):
  inp = input(message)
  while inp.lower() not in ('y','n'):
    inp = input('Please input "y" or "n" only. ' + message)
  return inp.lower() == 'y' # So the return value is simply True or False

print ("Answer all yes or no questions with Y or N.")
while True:
  idade = valid_input("Are you over 18? Y/N: ")
  if not idade:
    print('Sorry, you can\'t apply.')
    break
  crime = valid_input("Have you ever been arrested or convicted before? Y/N: ")
  if crime:
      print("Sorry, you can't apply. ") 
      break
  else:
    visto = valid_input("Do you have visa TYPE_A'? ")
    if visto:
      print("THAT'S AS FAR AS I'VE GONE")
      break
    else:
      print('You don\'t have that visa type.')
      break

要“记住”以前的值,只需重用变量名即可。

question = valid_input('Question: ')
another_question = valid_input('Another: ')
if question:
    # Do stuff
    if another_question:
        # Do other stuff
i1icjdpr

i1icjdpr3#

如果我是你,我会办个宴会。

def q(question):
    answer = input(question).lower()
    if 'y' is answer:
        return True
    elif 'n' is answer:
        return False
    else
        print('invalid input')
        return q(question)

此函数可由您的代码在任何点调用,并将返回true或false。如果用户输入“y”,则返回true;如果输入“n”,则返回false。如果两者都没有输入,则再次调用此函数。然后可按如下方式调用此函数:

if q('Are you 18? (N/Y)'):
    if q("Have you ever been arrested or convicted before?"):
        #and so on
if q()#input question in here if the user isn't over 18

然后你可以像上面那样“嵌套”你的问题。

相关问题