【问题标题】:Debugging a simple Python price code调试一个简单的 Python 价格代码
【发布时间】:2017-07-01 04:00:05
【问题描述】:

我在 Python 中有这段代码

def receipt(array):
  sum = 0.0
  for i in range(len(array)):
    sum = sum + array[i]
  return sum

array = []

while True:
  print("Calculating Price")
  n = input("Enter a price: ")
  if n == "":
    print("Goodbye")
    break
  array.append(n)
  totalCost = receipt(n)
  print("The total cost is " + str(totalCost))

我想知道为什么这段代码不起作用。第四行好像有错误

sum = sum + array[i]

但我无法弄清楚它的哪一部分是错误的。我相信我正确使用了 array[i] 组件。可能是字符串问题?

问题:

  1. 代码的哪一部分不起作用?
  2. 我的错误是什么?

总的来说,我对计算机科学比较陌生。谢谢您的帮助。任何事情都值得赞赏!

【问题讨论】:

  • 对于初学者,您在def 上的缩进是错误的。无法分辨这里属于什么。
  • 确保你的缩进是正确的,因为 Python 对事物的缩进很敏感。在第一行之后,您需要缩进 receipt 函数中的所有内容。
  • @McGlothlin 哎呀,在我的程序中,我已经正确缩进了。不管怎样,我会继续编辑它。
  • @Crescendo 我希望您正在学习 python,但是您的解决方案对于长数组来说效率低下。您在函数中传递整个数组并对其元素执行求和。您可以使用记忆技术,以便只向结果中添加新元素,而不是重新计算整个结果
  • @YamanJain 是的,我正在学习 Python。你说的这种“记忆”技巧是什么?

标签: python python-3.x


【解决方案1】:

我运行了你的代码并得到了这个错误:

$ python test.py
Calculating Price
Enter a price: 24
Traceback (most recent call last):
  File "test.py", line 14, in <module>
    totalCost = receipt(n)
  File "test.py", line 4, in receipt
    sum = sum + array[i]
TypeError: unsupported operand type(s) for +: 'float' and 'str'

这意味着在您的sum = sum + array[i] 行中,类型不匹配。您需要将array[i] 包装在float() 函数中以将array[i] 匹配到sum 的类型,这是一个浮点数,因为您将其初始化为0.0。文档说input() 函数返回一个字符串,并且由于您将n 附加到array,因此您正在尝试将字符串与浮点数相加。该行应如下所示:

  sum = sum + float(array[i])

尝试再次运行它,代码就可以工作了。 Hereinput() 的文档

编辑:现在要解决与总和有关的问题。

这是你的代码版本,我已经修改了更正,以便按照你想要的方式进行添加。

  1 def receipt(sumvar, n):
  2   sumvar = sumvar + float(n)
  3   return sumvar
  4
  5 array = []
  6 sumvar = 0.0
  7
  8 while True:
  9   print("Calculating Price")
 10   n = input("Enter a price: ")
 11   if n == "":
 12     print("Goodbye")
 13     break
 14   totalCost = receipt(sumvar, n)
 15   sumvar = totalCost
 16   print("The total cost is " + str(totalCost))

正如其他人所提到的,sum 不是一个很好的变量名,所以我将它重命名为 sumvar。注意函数外部的sumvar 声明。当您像以前一样在receipt() 中初始化sumvar 时,您将始终将n 添加到0.0。我怀疑这是你想要的。相反,您希望保持项目计数的运行总数,这需要传递到函数中。我还从你的函数中消除了循环。这个循环实际上是在迭代 array 中的字符,而不是你期望的元素。

【讨论】:

  • 这是一个很好的方法,感谢 cmets,这是一个很好的答案,是一个加分项 :)
【解决方案2】:

首先有几个问题。我会解释每一件事。 这是您的完整工作代码:

def receipt(array):
  total = 0.0
  for i in array:
    total = total + i
  return total

array = []

while True:
  print("Calculating Price")
  n = input("Enter a price: ")
  if n=="":
    print("Goodbye")
    break
  array.append(float(n))
  totalCost = receipt(array)
  print("The total cost is " + str(totalCost))

你的错误:

1)array.append(n) - 第一个。对于初学者来说很常见。

input() 在 python 中将用户输入作为 string。所以你的n 是一个字符串

请参阅所有语言的data types。 Python 是一种强类型语言,而 perl 不是。如何判断一种语言是强类型还是弱类型?简单的。在您的口译员中试试这个。

>>> a=5
>>> b='9'
>>> a+b
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    a+b
TypeError: unsupported operand type(s) for +: 'int' and 'str'

看到错误现在试试这个,

>>> a=5
>>> b='9'
>>> a+int(b)
14

工作得很好。 Python 不允许只使用a+b,而某些语言则允许使用 perl。阅读更多关于它的信息。因此,您不能将它们添加到 typecast。所以把它改成

array.append(int(n)) 

array.append(float(n))

如果您要使用浮点值。

2) totalCost = receipt(n) 看到你将n 传递给函数。但是你的函数定义有def receipt(array):。这里实际发生的是

receipt(n) ----> (calls) ---->def receipt(array):

在哪里n ------&gt; array 所以你的array 只不过是n。你应该做的是

totalCost = receipt(array)

3) sum = 0.0 从不 我说过永远不要使用内置或关键字名称(例如:sum、min、max、int、str 等)作为变量名。在PEP 8中阅读有关命名的更多信息

所以也许将sum 重命名为sum_(这是要遵循的约定)但是为什么不能将sum 重命名为total 更简单对吧?

4) 终于

for i in range(len(array)):
    sum = sum + array[i]

当你可以简单地做for i in array:时,为什么要range(len(array))

看不懂这个看看这个例子:

>>> a = [1,2,3]
>>> for i in a:
    print(i)


1
2
3

参见for item in something 只会从一组事物(可迭代(列表、元组、集合等))中获取每个项目

所以只需将这些行更改为

  for i in array:
    total = total + i

你得到了你想要的,

输出:

Calculating Price
Enter a price: 10
The total cost is 10.0
Calculating Price
Enter a price: 20
The total cost is 30.0
Calculating Price
Enter a price: 15
The total cost is 45.0
Calculating Price
Enter a price: 
Goodbye

更新:

如 cmets 中所述,您需要了解有关缩进的更多信息。查看 cmets 中的链接。

【讨论】:

  • 还有一件事你忘了说;他的缩进很不稳定。 The PEP8 standard is to indent the code by four spaces.
  • @ChristianDean 更新并提到了它。我看到的代码是缩进的。可能有人编辑过它。
  • 不错的答案!非常完整,是加分项:)
  • 你是了不起的朋友@DamianLattenero :)
【解决方案3】:

你有一些问题,我会一一评论:

首先,您遇到了一些缩进问题,请小心处理。 其余都是代码中的cmets

更新

def receipt(array):
  sum = 0.0
  for i in range(len(array)):
    sum = sum + array[i]
  return sum
array = []
while True:
  print("Calculating Price")
  n = input("Enter a price: ") #If you convert the str into float here it will cause an error in the if
  if n == "": #here, when you hit enter, it sends the "" (empty string)
    print("Goodbye")
    break
  array.append(float(n)) #So an option is transform the string here
  totalCost = receipt(array) #and here, you gave to receipt() function the wrong param, you gave "n" and it was waiting for an array 
  print("The total cost is " + str(totalCost))

【讨论】:

  • @我试过了,Python说它无法将字符串转换为浮点数。关于还有什么问题的任何想法?我做了更改。
  • @Crescendo 这很奇怪,它对我有用,你使用的是哪个 python?
  • @Crescendo 尝试更改为n = float(eval(input("Enter a price: ")))
  • 我有最新版本。我相信 Python 3.6。如果我添加 eval(),我会收到“解析时出现意外的 EOF”错误。
  • @Crescendo 为了避免这个错误,你应该用array.append(float(n))替换该行,并让你的输入与原来的一样:n = input("Enter a price: "),这样你在尝试停止时避免错误插入值。或者就像我的回答所暗示的那样,简单地转换为函数内部的浮点数。
【解决方案4】:

你不应该使用 sum 作为变量,因为它是 Python 的内置变量,此外,在将 array[i] 添加到另一个浮点数时将其转换为浮点类型,还要注意你从不使用初始化的 @ 987654323@,你在计算totalCost时漏掉了:

def receipt(array):
    summ = 0.0
    for i in range(len(array)):
        summ = summ + float(array[i])
    return summ

array = []
while True:
    print("Calculating Price")
    n = input("Enter a price: ")
    if n == "":
        print("Goodbye")
        break
    array.append(n)
    totalCost = receipt(array)
    print("The total cost is " + str(totalCost))

【讨论】:

  • 感谢 cmets,这也是一个非常好的答案:),而且是一个加分项
【解决方案5】:

我已经更正了导致您的问题的原因,实际上您将“n”传递给收据而不是“数组”。

def receipt(array):
    sum = 0.0
    for i in range(len(array)):
        sum = sum + array[i]
    return sum

array = []
while True:
    print('Calculating Price')
    n = input("Enter a price: ")
    if n == "":
        print("Goodbye")
        break
    array.append(n)
    totalCost = receipt(array)  #receipt takes a list as a parameter (what you call array)
    print("The total cost is " + str(totalCost))

其他问题是:

  • 缩进(我怀疑这只是复制粘贴)
  • 输入也会在您使用它时出现错误,请查看this 以解决该问题
  • 考虑基于 n 的值创建循环,因为 while true 通常是不安全的
  • 或至少将您的 if 语句更改为“not n”,正如 here 所指出的那样,这更符合 Python 风格。以后请务必记下您使用的 python 版本。

【讨论】:

  • “虽然 true 通常不安全” - 嗯,不是真的。只要确保有中断条件,就可以使用while True 循环。它确实不亚于递归。我喜欢你其余的回答,但这部分让我有点恼火:P
  • 我也很烦。 while Truewhile condition--> 只要条件为真,while true 也一样。所以只要你有一个基于 while 内部某些条件的 break,两者几乎相同。
【解决方案6】:

不要使用sum作为变量名,它是Python的built-in

固定:

def receipt(array):
    total = 0.00 # avoiding 'sum'
    for price in array:
        total += float(price) # equivalent to 'total = total + float(price)'
    return total

array = []
print ("Calculating Price...") # outside 'while' to not reprint each time!

while True:
    price = input("Enter a price: ")
    if not price: # equivalent to 'if price is False, or 0 in CompSci speak
        print ("Goodbye!")
        break
    array.append(price)
    total = receipt(array)
    print("The current total cost is", total) # no need to convert to str()

一些忠告:

  • 编写函数时,最好是显式而不是 隐含的。所以使用有意义的变量!
  • 我们可以使用相同的变量名,因为 Python 使用 LEBG rule 用于变量范围。
  • 计算价格时(我们知道通常以 2 位小数结尾) 最好使用整数而不是浮点数,因为你会遇到 问题]( Limiting floats to two decimal points) 使用浮点数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多