2016-11-16 100 views
-1

我正在努力研究一个程序,以判断创建的磁盘是否触及预定义框的边缘。解析器会说的东西,如触摸边缘的圆形

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 
+0

你为什么觉得'disksdescription' *可以在'touch_sides'中访问? – jonrsharpe

+1

Python是词法范围的,这意味着变量的存在取决于它被写入的位置,而不是被称为(动态范围)的位置。您应该允许'disksdescription'作为参数传入'touch_sides'。你也应该避免在循环变量'left'和'right'上进行赋值,因为这些值将被循环的下一次迭代覆盖,这通常不是非常有用。 – ebolyen

+1

欢迎来到StackOverflow。请阅读并遵守帮助文档中的发布准则。 [最小,完整,可验证的示例](http://stackoverflow.com/help/mcve)适用于此处。最值得注意的是,应该有一个驱动程序来测试你的代码和错误信息的全文。 – Prune

回答

0

概述

你必须在这段代码相当多的基本问题。我要退后一步并尝试解决您的一些过程问题。

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

这样做的好处是,问题通常很容易调试:只有新的2-5行是可疑的。将其与您当前的情况进行对比:您有几个错误;修复它们中的任何一个都不会给你一个明显更好的结果,所以你很难知道你做错了什么,直到你一次得到所有的结果。

什么是功能?

把它想象成某种安全设置,或许就像通往餐厅厨房的通道窗口一样。服务器通过窗口粘贴一张订单(纸片)。当厨师完成时,食物盘子回来。 通讯的所有都经过该窗口。当我们要求一份煎蛋卷时,我们所知道的,厨师在烤肉架上将肉块从牛排的整面上切下来......或者烘烤一些冷冻的东西。看不到它,说不出来;那是一间带有不透明墙壁的独立房间。

这意味着什么对我?

您的方案三 “房间”:在(简单)主程序,run_code,并touch_sides。他们中没有人能看到其他人。变量left in 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并打印结果。

在这一点上,你知道你可以可靠地传递函数之间的值。 现在你可以添加实际的代码。


还有什么?

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

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

直接降低到

left = (x <= radius) # the parentheses aren't necessary 
  • 请注意,你有两个变量,左,右,这是试图描述的磁盘列表的属性。
  • 请注意,这些变量与您用于迭代坐标列表的变量相同。他们不能同时执行这两个操作 - 创建更多的存储区域,例如left_touchesright_touches

现在应该足够了。活着,和程序。