【问题标题】:Continually prompting user for input in Python在 Python 中不断提示用户输入
【发布时间】:2012-09-23 22:44:11
【问题描述】:

目标:* 编写一个 python 程序,重复提示输入一个正数,直到数字的总和大于 179。在您的解决方案中至少使用三个模块/函数。 * 输入的最大数字不能超过 42。 * 当数字之和超过 179 时,打印数字之和,输入的最大数字和输入的最小数字。

我只需要一些指导,特别是“input_numbers”模块。必须有比为每个数字创建一个变量更简单的方法来做到这一点。代码不完整。我什至还没有开始学习其他两个模块。提前致谢。

def input_numbers():
    while True:
        num1 = raw_input("Enter a positive integer no greater than 42 ")
        if num1 <= 0:
            print "That is not a positive integer.  Try again "
        elif num1 > 42:
            print "The number cannot exceed 42.  Try again "

        num2 = raw_input("Enter another positive integer ")
            if num2 <= 0:
                print "That is not a positive integer.  Try again "
        elif num2 > 42:
            print "The number cannot exceed 42.  Try again " 

        num3 = raw_input("Enter another positive integer ")
        if num3 <= 0:
            print "That is not a positive integer.  Try again "
        elif num3 > 42:
            print "The number cannot exceed 42.  Try again "

        num4 = raw_input("Enter another positive integer ")
        if num4 <= 0:
            print "That is not a positive integer.  Try again "
        elif num4 > 42:
            print "The number cannot exceed 42.  Try again "

        num5 = raw_input("Enter another positive integer ")
        if num5 <= 0:
            print "That is not a positive integer.  Try again "
        elif num5 > 42:
            print "The number cannot exceed 42.  Try again "
        elif sum(num1, num2, num3, num4, num5) > 179:
            print_numbers()

add_numbers()

def add_numbers():
print_numbers()

def print_numbers():

input_numbers()

【问题讨论】:

  • 请注意,homework 标签正在被删除,因此不应再使用。

标签: python input


【解决方案1】:

您可以通过封装程序的每个步骤来消除所有三个功能要求。我们将让 main 控制循环,而不是将循环放在函数内部,我们将通过将数据传入和传出函数调用来控制流程。

让我们稍微修改一下您的 input_numbers() 函数。

def get_input_number():
    num = int(raw_input("Enter a positive integer no greater than 42 "))
    if num <= 0 or num > 42:
        print "Invalid input.  Try again "
        get_input_number()
    else: 
        return num

因此,不是让 input_numbers 控制循环以及输入处理和验证,而是让它按照其名称的含义执行:它要求输入,验证它,然后,如果它是好的,它返回值给调用者,但如果它不好,它会写一条消息,并再次调用自己给用户可以输入好的输入。

我们将设置的下一个功能直接来自您的需求列表。从用户输入的所有数字中,我们需要找到最大的一个。仅从语言来看,我们可以确定我们正在查看一组数字,因此,这是一个分解列表的好地方。假设我们将所有用户输入存储在一个列表中,然后我们可以将该列表传递给一个函数并对其执行操作,就像这样。

def get_greatest_number(input_list):
    highest = input_list[0]
    for i in input_list:
        if i > highest:
            highest = i
    return highest

我们将列表的第一个元素设置为变量highest,然后根据该初始值检查列表中的所有其他元素。如果我们找到更大的元素,然后我们将highest 变量重新分配给更大的元素。一旦我们对列表中的每个元素执行此操作,highest 内的数字现在将是最高的数字,因此,我们会将其返回到主程序。

同样,我们可以用同样的方法找到最小的。

def get_smallest_number(input_list):
    smallest = input_list[0]
    for i in input_list:
        if i < smallest:
            smallest = i
    return smallest

最后,我们进入主循环。在这里,我们声明一个空列表number_list 来存储所有数字。我们使用它的总和作为我们的循环条件。

if __name__ == '__main__':
    number_list = []
    while sum(number_list) < 179:
        number_list.append(get_input_number())

在循环体中,我们调用 get_input_number() 并将其结果附加到我们创建的列表中。一旦列表中的数字总和超过 179,while 循环将退出,我们最终可以向用户显示结果。

    print 
    print '-------------------------'
    print 'total of numbers entered: %d' % sum(number_list)
    print 'greatest number entered: %d' % get_greatest_number(number_list)
    print 'smallest number entered: %d' % get_smallest_number(number_list)

在这里,我们可以创建 get_greatest_number 和 get_smallest_number,并将数字列表作为参数提供给它们。他们将遍历列表,然后将适当的值返回给打印语句。

【讨论】:

    【解决方案2】:

    是的,当然有比为每个数字创建一个变量更好的方法。将它们存储在列表中。将它们存储在列表中还可以轻松找到它们的总和以及最高和最低值(为此有内置函数)。

    作为进一步的提示,您需要使用两个循环,一个在另一个循环中。外层循环让用户输入数字,直到它们的总和超过 179。内层循环让用户输入一个单个数字,直到它介于 1 和 42 之间。

    【讨论】:

      【解决方案3】:
      def get_int(prompt=''):
          while True:
              try:
                  return int(raw_input(prompt))
              except ValueError:
                  pass
      
      def get_values():
          values = []
          total  = 0
          while total <= 179:
              val = get_int('Enter a positive integer <= 42: ')
              if 0 <= val <= 42:
                  values.append(val)
                  total += val
          return values
      
      def print_info(values):
          print 'Sum is {}'.format(sum(values))
          print 'Largest value is {}'.format(max(values))
          print 'Smallest value is {}'.format(min(values))
      
      def main():
          values = get_values()
          print_info(values)
      
      if __name__=="__main__":
          main()
      

      【讨论】:

        【解决方案4】:

        您可以在循环中重复轮询数字,并将输入添加到列表中,例如

        def input_numbers():
            user_inputs = []  # a list of all user's inputs
            while True:
                num = raw_input("Enter a positive integer no greater than 42 ")
                try:
                    num = int(num)  # convert input string to integer
                    if num <= 0:
                        print "That is not a positive integer.  Try again "
                    elif num > 42:
                        print "The number cannot exceed 42.  Try again "
                    user_inputs.append(num)
                except ValueError:  # conversion to integer may fail (e.g. int('string') ?)
                    print 'Not a Number:', num
        
                if some_condition_regarding(user_inputs):
                    break  # eventually break out of infinite while loop
        

        【讨论】:

          【解决方案5】:

          这里有一些众所周知的技巧:

              def min_and_max(your_num_list)
                  min=your_num_list[0]
                  max=your_num_list[0]
                  for num in your_num_list:
                      if num < min:
                          min=num
                      if max > num
                          max=num
                  return min,max
          

          【讨论】:

          • 这可以重写为简单的return min(your_num_list), max(your_num_list)...min()和max()是内置的Python函数。
          【解决方案6】:

          在编写独立的 Python 程序时,最好使用 main 函数。它允许您轻松添加一些单元测试,使用来自其他模块的函数或类(如果您导入它们)等。

          正如其他人已经说过的,每次用户输入一个有效数字时,创建一个列表并向其附加一个新元素是一个好主意(直到数字总和超过 179)。如果用户输入了错误的值,那么就不要在列表中添加任何内容并跳到下一次迭代(因此用户将被要求再次输入一个数字)。

          所以基本上它可能看起来像这样:

          def validate_entered_number(num):
              """
              Checks if the number is positive and is less or equal to 42.
              Returns True if the number matches these conditions,
              otherwise it returns False.
              """
              if num < 0:
                  print "That is not a positive integer."
                  return False
          
              if num > 42:
                  print "The number cannot exceed 42."
                  return False
          
              return True
          
          def main():
              entered_numbers = []
          
              while True:
                  try:
                      num = int(raw_input("Enter a positive integer less or equal to 42: "))
                  except ValueError:
                      print "You should enter a number"
                      continue
                  if validate_entered_number(num):
                      entered_numbers.append(num)
                      if sum(entered_numbers) > 179:
                          print "The sum of the numbers is %s" % sum(entered_numbers)
                          print "The smallest number entered is %s" % min(entered_numbers)
                          print "The largest number entered is %s" % max(entered_numbers)
                          return
          
          if __name__ == "__main__":
              main()
          

          实际上,我可以想象这样一种情况,您只想将数字之和、最小数字和最大数字存储在三个变量中,并在每次迭代中更新这些变量(将当前数字添加到总和中并进行比较它到当前已知的最小和更大的数字,并在必要时更新相应的变量),但在这种情况下,您可能拥有的最长列表只有 180 个元素(如果所有数字都是 1 并且用户没有输入 0 或者您有修改程序以拒绝输入 0),这对于 Python 中的列表来说是非常少量的元素。但如果您必须处理大量数字,我建议您改用这样的解决方案。

          【讨论】:

            【解决方案7】:

            感谢所有回答的人。我编写了以下代码,除了最后一个模块外,它几乎可以完美运行。如果您在第一次运行后退出程序(按 0),它将退出,但如果您第二次运行它,按 0 不会使其退出。它只会回到程序的开头。我不知道为什么。

            注意:作业有各种要求,我必须将这些要求合并到我的代码中。因此,不必要的模块、全局变量和 cmets。

            maxNum = 42  # declares global variable maxNum
            target = 179  # declares global variable target
            
            def user_input():  # prompts user to input a number 42 or less until all add up to 179
                x = 0
                nums = []    
                while sum(nums) <= target:
                    nums.append(int(raw_input("Enter a number: ")))
                    if int(nums[x]) > int(maxNum):
                        print "Number cannot exceed 42."
                        user_input()
                    else:
                        x += 1
                print_nums(nums,x)
            
            def print_nums(nums,x):  # prints the sum of the numbers, the smallest, and the largest 
                print "Sum of all numbers is", sum(nums)
                nums.sort()
                x -= 1
                print "Largest number entered is", nums[x]
                print "Smallest number entered is", nums[0]
                decide()
            
            def decide():  # allows user to continue the program or exit 
                exit = raw_input("<9 to enter a new set of number.  0 to exit.> ")
                while True:
                    if int(exit) == 0:
                        return
                    elif int(exit) == 9:
                        user_input()
            
            user_input()
            

            【讨论】:

              猜你喜欢
              • 2022-01-23
              • 1970-01-01
              • 1970-01-01
              • 2017-09-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多