接触边缘的圆

2024-07-02 11:01:48 发布

您现在位置: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

Tags: inrightforisdefleftnrrow
1条回答
网友
1楼 · 发布于 2024-07-02 11:01:48

概述

这段代码中有很多基本问题。我要退一步,试着解决你的几个流程问题。你知道吗

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

这样做的好处是问题通常很容易调试:只有新的2-5行是可疑的。把这和你目前的情况对比一下:你有几个错误;纠正其中任何一个都不会给你一个明显更好的结果,所以你很难知道你做错了什么,直到你一下子把所有的错误都搞定。你知道吗

什么是函数?

把它想象成某种安全装置,也许就像通往餐厅厨房的通道。服务员把一张订单(纸条)从窗口递出去。烹饪结束后,盘子里的食物又回来了。所有的通信都通过那个窗口。当我们要煎蛋卷的时候,据我们所知,厨师是在烤盘上切牛肉片。。。或者用核弹炸一些冷冻的东西。看不见,也说不清;那是一个单独的房间,墙壁不透明。你知道吗

这对我意味着什么?

程序中有三个“房间”:主程序、运行代码和触摸面。他们谁也看不见其他人的内心。运行代码中的变量left触摸侧中的变量left没有关系。这些都是完全独立的实体,没有比金正日和卡戴珊更紧密的联系。你知道吗

特别是,第一行接触面是一个终极嗯?Python编译器的时刻。没有定义的东西叫做diskscription。在更远的地方,您需要花费大量的工作来获取leftright的值,但是您不会将它们滑回窗口。运行代码不知道您在那里做了什么有用的事情。你知道吗

要解决的问题

  1. 回去做你跳过的简单练习。他们的目的是不让你一下子犯这些错误。编写普通函数和普通调用。学习使用输入参数和返回值。你知道吗
  2. 练习增量编程。注释掉你的函数体。现在,运行程序,只需调用run\u code()。它不会做任何事,但它这样做没有错误。你知道吗
  3. 接下来,将“存根”代码放入触摸屏:不计算任何内容,而是打印参数值。忽略输入参数,并为left和right返回False。将代码添加到运行调用触摸侧面的代码并打印结果。你知道吗

此时,您知道可以在函数之间可靠地传递值。现在您可以添加实际的代码。你知道吗


还有什么?

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

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

直接减少到

left = (x <= radius)    # the parentheses aren't necessary
  • 请注意,您有两个变量,left和right,它们试图描述磁盘列表的属性。你知道吗
  • 请注意,这些变量与您用来遍历坐标列表的变量相同。他们不能同时做这两件事,多做几个存储区,比如左触球右触球。你知道吗

现在应该够了。长寿,计划。你知道吗

相关问题 更多 >