需要帮助修复/改进python中的while循环求和计算器

时间:2012-07-16 18:10:09

标签: python sum calculator

请记住,我仍然是python编码的新手,因为我只是进入我的python编码类的第5章。记住这一点,我试图使用“while循环”创建一个总和计算器,直到用户输入负数而不是正数。

如果我对我的问题的描述不完全清楚,我会在这里发布确切的作业问题:

第5章,第200页,#8 数字之和

使用while循环编写程序,要求用户输入一系列正数。用户应输入负数以表示系列的结束。输入所有正数后,程序应显示其总和。

现在为我到目前为止编写的代码:

def main():
    number = float(input('Please enter in a positive number: '))
    while number > 0:
        positiveNumber()
    while number < 0:
        calculateTotal()
        printTotal()

def positiveNumber():
    number = float(input('If you are finished please enter a negative number.' + \ 'Otherwise, enter another positive number: '))
    while number > 0:
        positiveNumber()
    while number < 0:
        calculateTotal()
        printTotal()

def calculateTotal():
    total = 0 + number

def printTotal():
    print('The sum of your numbers is: ', total)

main()
  • 在第11行,我在那里有“+”符号,因为我想在那里创建一个输入空间,以便拥有更清晰的文字,但这似乎不起作用。

如果这个问题看起来像“nooby”,我很抱歉,但我需要帮助制作一个更清洁/工作的计算器。如果有人可以看看这段代码并希望帮助我改进它,我将不胜感激。谢谢!

最终编辑:

谢谢大家提供的信息!我学到了很多东西(对于“新手”=)。我使用了Talon876的答案来计算我的计算器。再次感谢大家!

5 个答案:

答案 0 :(得分:3)

如果要在多行上打印单个字符串,请在字符串中添加\n。 例如,

print "This is on the first line\nThis is on the second line"

会输出

This is on the first line
This is on the second line

看起来你正在将一个while循环与递归混合(从内部调用一个方法)。我建议使用一个while循环和一个输入变量来检查中断条件(输入是&lt; 0)

它看起来像这样:

sum = 0
number = float(input('Please enter in a positive number: '))
while number > 0:
    sum = sum + number
    number = float(input('If you are finished please enter a negative number.' + \ 'Otherwise, enter another positive number: ')) #fix this line using the information from the first part of the answer

这将循环直到用户输入负数或0.如果要接受0作为正数,请将while条件更改为number > -1

答案 1 :(得分:1)

如果没有明确地将其声明为全局变量,则无法更新python函数中的全局变量。观察:

a = 1
def foo():
    a = a + 6  #creates a new variable (a) that is confined to the "foo" namespace.
           #Note that it still uses a from the global namespace on the Right hand side
           #This is because python looks for a in the "foo" namespace first.  When
           #it isn't found there, it looks in the global namespace.  However, python
           #WON'T ASSIGN to something in the global namespace without being told 
           #to explicitly
    print (a)

foo() # 7
print (a)  # 1

def foo():
    global a #Tell python that it is OK to assign to variable "a" in the global namespace.
    a = a + 6
    print (a)

foo()   # 7
print (a) # 7

但是,这种强大的力量带来了巨大的责任。很多人会告诉你从不使用全局变量。在很多方面,它们是正确的,因为使用其他方法可以更加干净地完成使用全局变量可以完成的任何事情。我希望写这篇文章不是为了说服你使用全局变量,而是为了帮助你理解代码中的一个错误。

您可能想要尝试的一件事是让您的函数接受输入数字作为参数以及此时的总数,然后return新的总数。

祝你好运!

答案 2 :(得分:0)

问题是1.你没有声明你在函数中使用的变量是全局的,要注意对它们所做的更改

2.如果你通过递归调用函数来实现它,你不需要while循环!你需要检查条件lik“if&amp; else” 这是一个简单的while循环问题实现:

def main():
total=0
number = float(input('Please enter in a positive number: '))
while(number>0):
    total=total+number
    number = float(input('Please enter in a positive number to continue or a negative no. to stop: '))
print('The sum of your numbers is: %d'% total)
main()

答案 3 :(得分:0)

我觉得你在找这样的东西?但我不知道您需要使用哪种样式限制。

number = float(input('Please enter in a positive number: '))
to_sum = []
while number > 0:
    to_sum.append(number)
    number = float(input('If you are finished please enter a negative number.\n' +
                         'Otherwise, enter another positive number: '))
print('The sume of your numbers is: ', sum(to_sum))

请注意,因为您尝试分成多行的语句已经在()中,所以您不需要。你可以打破界限。

作业是否要求你使用这么多疯狂的功能?另外,您使用的是哪个版本的Python?

答案 4 :(得分:0)

您需要学习的一件事是如何将程序分解为函数。单个代码块比分解代码更好地解决了一些问题,我认为这是其中之一。

您需要计算一笔金额。您可以使用单个变量处理该变量,并在用户输入时添加更多数字。您的代码应该围绕此变量进行设计。如果您尝试将代码拆分为函数,则需要使用全局变量(不推荐!),或者您需要在函数中传递变量,或者您可以将变量放入对象然后进行制作函数是对象上的“方法”函数。但最简单的只是编写一些使用变量的代码,并使所有代码成为单个代码块(一个函数,甚至只是Python程序中的代码)。

这是一个解决方案:

sum = 0.0  # initial value; we will add values to this
print('Welcome to this program')
while True:
    s = input('User: enter data value or a negative number to stop')
    x = float(s)
    if x < 0:
        break
    sum += x  # add this value to update the sum
print('Here is your sum: {}'.format(sum))

所以,以上代码的优点是什么。需要使用变量sum的所有地方都在一起,我们可以看到它们。我们不需要声明sum全局,因为我们没有多个函数试图全部使用它。

查看该代码,并问问自己:如果我们将其分解为多个函数,它会更简单或更清晰吗?如果没有,那就不要这样做。

这里唯一棘手的问题是我们使用while True:作为循环。这是因为我们想做某事(得到输入),然后根据结果,决定是退出循环还是继续,然后最后根据决定做更多事情(更新总和)。

可以重写这个以使用“flag”变量,然后创建循环while flag:,但我不认为它更干净:

sum = 0.0  # initial value; we will add values to this
print('Welcome to this program')
continue_loop = True
while continue_loop:
    s = input('User: enter data value or a negative number to stop')
    x = float(s)
    if x < 0:
        continue_loop = False
    else:
        sum += x  # add this value to update the sum
print('Here is your sum: {}'.format(sum))

你认为拥有continue_loop标志变量更清楚吗?有些教科书说你应该用这种方式编写代码,因为他们认为使用break退出中间的循环是犯罪行为;他们认为循环应该只从通常的位置退出(对于while循环,它是顶部的。)

如果您真的想使用功能怎么办?好吧,你可以,但你仍然不应该使用全局变量。实际上,如果您正在编写“功能”解决方案,则根本不需要sum变量!

这是一个功能性解决方案。

def ask_and_sum():
    s = input('Hey dude enter a value or a negative to stop')
    x = float(s)
    if x < 0:
        return 0
    else:
        return x + ask_and_sum()

print('Welcome to this program')
print('Your sum is: {}'.format(ask_and_sum()))

而不是显式循环,它使用“尾递归”,其中函数以对自身的另一个调用结束。在这种情况下,我个人更喜欢显式循环。你觉得怎么样?

P.S。这个问题非常简单,如果不给你完整答案就很难讨论。我为此道歉。但即使您只是复制代码,请查看它,并考虑它,并确保您理解它。