首页 文章

不断提示用户输入Python

提问于
浏览
0

目标:*编写一个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()

7 回答

  • 0

    您可以通过封装程序的每个步骤来淘汰所有三个功能要求 . 我们不是让你的循环在函数内部,而是让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 变量重新分配给更大的元素 . 一旦我们对列表中的每个元素执行此操作,现在最高的数字将是最高数字,因此,我们将它返回到主程序 .

    同样,我们可以做同样的事情来寻找最小的 .

    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_numberget_smallest_number ,并将数字列表作为参数给出 . 它们将遍历列表,然后将适当的值返回到print语句 .

  • 4

    是的,当然,除了为每个数字创建变量之外,还有更好的方法 . 将它们存储在列表中 . 将它们存储在列表中也可以轻松找到它们的总和以及最高和最低值(这里有内置函数) .

    作为进一步的提示,您将需要使用两个循环,一个在另一个内部 . 外循环使用户输入数字直到其总和超过179.内循环使用户输入单个数字,直到它在1到42之间(包括1和42) .

  • 0
    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()
    
  • 0

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

    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
    
  • 1

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

    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
    
  • 0

    当您编写独立的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中列表的元素 . 但如果你不得不处理大量的数字,我建议你改用这样的解决方案 .

  • 2

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

    注意:分配有各种要求,我必须在我的代码中加入 . 因此,不必要的模块,全局变量和注释 .

    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()
    

相关问题