圆圈接触边

时间:2016-11-16 22:29:39

标签: python

我正在努力研究一个程序来判断创建的磁盘是否接触到预定义框的边缘。解析器不断说出诸如

之类的内容
NameError: global name 'disksdescription' is not defined
Warning: variable 'left' is assigned to, but never used

目前的代码是:

import numpy.random as nr

def touch_sides(disk, radius, x, y):
    for disk in disksdescription:
        for left in disk.values()[2]:
            if x <= radius:
                left = True
            else:
                left = False
        for right in disk.values()[3]:
            if x >= 1-radius:
                right = True
            else:
                right = False        


def run_code():

    radius = 0.1

    coordinates = nr.uniform(size=(1,2))
    print coordinates
    disksdescription = []

    for row in range(0, coordinates):

        x = coordinates[row, 0]
        y = coordinates[row, 1]

        disksdescription.append({'x': x, 'y': y, 'left': left, 'right': right})
        touch_sides(coordinates, radius, x, y)

        print disksdescription

1 个答案:

答案 0 :(得分:0)

<强>概述

此代码中存在许多基本问题。我要退出并试图解决你的几个过程问题。

最重要的是,我强烈建议您采用增量编程:编写几行代码,只需一步或两步逻辑。然后测试,直到你确定它做你想要的。只有这样你才能写更多的代码。

这样做的好处是问题通常很容易调试:只有新的2-5行是可疑的。与你目前的情况形成对比:你有几个错误;修理其中任何一个都不会给你一个明显更好的结果,所以你很难在你立刻得到所有这些之前先了解你做错了什么。

什么是功能?

将其视为某种安全设置,可能就像用餐厨房的传递窗口一样。服务器通过窗口粘贴订单(纸条)。烹饪完成后,食物会回来。 通信的所有都通过该窗口。当我们要求煎蛋卷时,就我们所知道的那样,厨师正在烤肉的整个牛肉切片上切碎肉块......或者将一些冰冻的东西捏成碎片。看不到,分不清楚;那是一间带有不透明墙壁的独立房间。

对我来说意味着什么?

您的计划中有三个“房间”:(琐碎的)主程序, run_code touch_sides 。他们中没有人能看到其他人。 run_code 中的变量 touch_sides 中的变量无关。这些是完全独立的实体,与 Kim Jong Il和 Kim Kardashian相比没有更多的联系。

特别是, touch_sides 的第一行是Python编译器的最终呵呵?时刻。没有定义的名为diskdescription的东西。更进一步,你花费工作来获得正确的值,但是你不会在窗口中滑回它们。 run_code 不知道你在那里做了什么有用的东西。

需要修复的内容

  1. 回去做你跳过的简单练习。他们的目的是让你不要马上犯下这些错误。写琐碎的函数和琐碎的调用。学习使用输入参数和返回值。
  2. 练习增量编程。注释你的功能正文。现在,运行该程序,只需调用 run_code()。它不会做任何事情,但它没有错误。
  3. 接下来,将“stub”代码放入 touch_sides :不计算任何内容,但打印参数值。忽略输入参数并向左和向右返回False。将代码添加到 run_code ,调用 touch_sides 并打印结果。
  4. 此时,您知道可以在函数之间可靠地传递值。 现在您可以添加实际代码。

    还有什么?

    熟悉布尔表达式的概念。了解您的原始代码

    if x <= radius:
        left = True
    else:
        left = False
    

    直接缩减为

    left = (x <= radius)    # the parentheses aren't necessary
    
    • 请注意,您有两个左右变量,它们试图描述磁盘列表的属性。
    • 请注意,这些变量与您用于迭代坐标列表的变量相同。他们不能同时做两件事 - 再做几个存储区,例如 left_touches right_touches

    现在应该足够了。长寿,和节目。