如何像计算机科学家一样思考

时间:2013-05-28 04:47:03

标签: python python-2.7 nonetype

正如标题所希望的那样,这是本书中的一个例子。 我还是编程新手,调试困难。对此表示欢迎任何批评,特别是如果它显示更有效的编码方式;请记住,我仍然是新人,所以如果你给我一个新的内置功能,我可能不知道你指的是什么。

因此,本练习的目的是编写一个函数,给它三个参数,以确定这三个参数是否形成一个三角形。这是我的代码:

def is_triangle(a,b,c):
    num_list = [a,b,c]
    biggest = max(num_list)
    other_two = num_list.remove(biggest)
    sum_of_two = sum(other_two)

    if sum_of_two > biggest:
        print 'Congrats, %d, %d, and %d form a triangle!' % (a,b,c)
    elif sum_of_two == biggest:
        print 'That forms a degenerate triangle!'
    else:
        print 'That does\'t make any sort triangle... >:['


def sides():
    side1 = raw_input('Please input side numero Juan: ')
    side2 = raw_input('Now side two: ')
    side3 = raw_input('...aaaannnd three: ')
    import time
    time.sleep(1)
    print 'Thanks >:]'
    side1 = int(side1)
    side2 = int(side2)
    side3 = int(side3)
    is_triangle(side1,side2,side3)

sides()

无论何时我运行它,我都会得到以下结果:

Traceback (most recent call last):
  File "A:/Python/is_triangle.py", line 27, in <module>
    sides()
  File "A:/Python/is_triangle.py", line 25, in sides
    is_triangle(side1,side2,side3)
  File "A:/Python/is_triangle.py", line 5, in is_triangle
    sum_of_two = sum(other_two)
TypeError: 'NoneType' object is not iterable

我的猜测是sum_of_two但是我不知道它有什么问题。有人可以帮我调试吗?

我花了一个小时用build_in函数重写它(以各种方式,到处都是or串)。但它看起来很糟糕,我宁愿学会用这种方式写作。

3 个答案:

答案 0 :(得分:5)

问题在于remove修改了基础列表 - 它不会返回新列表。将其更改为:

num_list.remove(biggest)
sum_of_two = sum(num_list)

要确切了解这种情况发生的原因,请在IDLE中尝试以下操作:

>>> x = [1,2,3,4,5]
>>> x.remove(1)
>>> x
[2,3,4,5]

答案 1 :(得分:2)

由于num_list.remove(biggest)返回None,请考虑改为

other1, other2, biggest = sorted(num_list)
sum_of_two = other1 + other2

看起来if块也需要缩进

def is_triangle(a, b, c):
    num_list = [a, b, c]
    other1, other2, biggest = sorted(num_list)
    sum_of_two = other1 + other2

    if sum_of_two > biggest:
        print 'Congrats, %d, %d, and %d form a triangle!' % (a,b,c)
    elif sum_of_two == biggest:
        print 'That forms a degenerate triangle!'
    else:
        print 'That does\'t make any sort triangle... >:['

答案 2 :(得分:2)

你犯了一个非常常见的错误,一个简单的错误。在Python中,当函数导致数据结构发生更改时,它不会返回更改的结构。通常它会返回None。如果函数获取新的数据结构或新值,则返回它。

所以,str.lower()实际上并没有改变字符串;它返回一个新字符串,其中字符是小写的。如果您有一个名为lst的列表并且您运行sorted(lst),则它不会更改列表;它返回一个已排序的新列表。但lst.sort()就地对列表进行排序,因此它不会返回对列表的引用;它返回None

在下面的评论中,@ lcc指出list.pop()从列表中删除一个值并返回该值。因此,这是一个更改数据结构并返回None之外的函数的函数示例,但它仍然无法返回对已更改数据结构的引用。

list.remove()函数更改列表,并返回None。您需要做的就是更改您的函数以使用相同的列表:首先使用列表查找最大值,然后从列表中删除最大值,然后将列表传递给sum()

Python以这种方式做事的原因是服从&#34;命令/查询分离&#34;原理

http://en.wikipedia.org/wiki/Command%E2%80%93query_separation