-2

我敢肯定人们一直在问这个问题,但为什么我的程序总是收到 TypeError 代码?

下面的代码称为 q1

def rect_bounds(x, y, px, py):
    x = 0
    y = 0
    px = 0
    py = 0

    if px < x and py < y:
        print("point is inside rectangle")
    elif px == x or py == y:
        print("point is on edge of rectangle")
    else:
        print("out of bounds")

    return x, y, px, py

此代码称为 q1_test

import q1

x = int(input("Enter the length in the x-direction: "))
y = int(input("Enter the length in the y-direction "))  
px = int(input("Enter a x-coordinate: "))
py = int(input("Enter a y-coordinate: "))
x, y, px, py = q1.rect_bounds(x, y, px, py) #error comes up here
print()

基本上,代码应该询问用户在 x 和 y 方向上的长度,然后要求用户输入 x 和 y 坐标。然后,代码会告诉用户该点是在矩形内、在矩形的边缘上还是完全在矩形外。我在标记的地方不断收到错误,但我不知道为什么会这样。

错误:

Traceback (most recent call last): File "C:\Users\Michael\Dropbox\mdocs\CP104 Workspace\ostr1470_a9\src\q1_test.py", line 18, in <module> x, y, px, py = q1.rect_bounds(x, y, px, py) TypeError: 'NoneType' object is not iterable

错误不再出现。而是返回: 输入 x 方向的长度: 5 输入 y 方向的长度 5 输入 x 坐标: 2 输入 y 坐标: 2 点在矩形的边缘

(显然不是)

4

3 回答 3

4

它看起来像rect_bounds不返回任何东西。q1.rect_bounds(x, y, px, py)不能解压成四个变量x, y, px, py。如果您尝试这样做,您将收到相同的错误:

a, b, c, d = None

此外,在 中rect_bounds,您有:

x = 0
y = 0
px = 0
py = 0

这意味着参数始终设置为零。您应该摆脱这些,以便该功能按预期工作。

此外,假设矩形的其他两个边界是 x 和 y 轴,您应该添加:

if px < x and py < y and 0 < x and 0 < y :
    print("point is inside rectangle")
elif px == x or py == y or px == 0 or py == 0:
    print("point is on edge of rectangle")

如果矩形的其他边界在其他地方,则用正确的逻辑替换 0。

于 2013-10-16T06:35:19.247 回答
2

您没有从函数返回任何内容,因此结果不可迭代。

>>> a,b,c,d = [1,2,3,4]
>>> a
1
>>> b
2
>>> x,y,z = None   # Your function also returns None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable
于 2013-10-16T06:36:53.460 回答
0

您最初的问题是,您告诉呼叫者您正在返回四件东西,而实际上您没有返回任何东西。你已经解决了这个问题。

让我继续为您解决这个编程问题。你似乎很困惑,你在这里得到的帮助并不是很重要。

我会假设你的矩形的一个角是(0,0),另一个是(x,y)。

x = int(input("Enter the length in the x-direction: "))
y = int(input("Enter the length in the y-direction "))  
px = int(input("Enter a x-coordinate: "))
py = int(input("Enter a y-coordinate: "))
if x>=0 && y>=0:
    r = rect_bounds(x,y,px,py);
    if r==0:
        print('the point is inside')
    elif r==1:
        print('the point is on the border')
    elif r==2:
        print('the point is on a corner (both borders)')
    elif r==3:
        print('the point is outside')


def rect_bounds(x,y,px,py):
    if (px>0 && py>0 && px<x && py<y):
        c = 0; #inside
    elif (px==x||px==0) && py>0 && py<y:
        c = 1; #on the border
    elif px>0 && px<x && (py==y || py==0):
        c = 1; #on border
    elif px==x && py==y:
        c = 2; #on corner
    elif px==x && py==0:
        c = 2; #on corner
    elif px==0 && py==y:
        c = 2; #on corner
    elif px==0 && py==0:
        c = 2; #on corner
    else:
        c = 3; #outside
    return c

观察我应用的做法:

  • 我不从我的函数 rect_bounds 打印,它只会让一切都变得有问题和令人困惑。当您获得更多练习时,您将阅读有关将库与应用程序分离的内容。
  • 我记录了我所有的案例和我的假设(例如,矩形的一个角见 0,0,长度必须为正数)并仔细检查所有内容。您可能需要编写测试用例以确保一切正常。
于 2013-10-16T06:35:18.650 回答