为什么我不能在没有错误的情况下将函数放在另一个函数中?

时间:2016-04-18 22:46:50

标签: python function pygame

我正在制作一个需要许多x,y和z坐标的游戏,它们都有自己的功能。我需要在另一个函数中使用x或y函数来使它运行该函数。我并没有尝试protected MyGlobeFlasherHandler handlerFlashGlobe = new MyGlobeFlasherHandler(this); @Override protected onCreate(Bundle bundle) { handlerFlashGlobe.sendEmptyMessageDelayed(0, 700); } /** * private static handler so there are no leaked activities. */ protected static class MyGlobeFlasherHandler extends Handler { private final WeakReference<HomeBase> activity; public MyGlobeFlasherHandler(HomeBase activity) { this.activity = new WeakReference<HomeBase>(activity); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (activity.get() != null) { if (activity.get().shadedGlobe) { activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_blue)); } else { activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_red)); } activity.get().shadedGlobe = !activity.get().shadedGlobe; sendEmptyMessageDelayed(0, 700); } } } 其中的函数,而只是将def放在它前面并使代码运行。它们都是相同的if但不同的缩进。

  

有些人可以告诉我为什么在没有获得class的情况下我无法在另一个函数中重新运行该代码。

这是我的代码片段。

unresolved reference
  

在这种情况下,def within_y(co1,co2): if (co1.y1 > co2.y1 and co1.y1 < co2.y2) \ or (co1.y2 > co2.y1 and co1.y2 < co2.y2) \ or (co2.y1 > co1.y1 and co2.y1 < co1.y2) \ or (co2.y2 > co1.y1 and co2.y2 < co1.y1): return True else: return False def collided_left(co1, co2): if within_y(co1, co2): if co1.x1 <= co2.x2 and co1.x1 >= co2.x1: return True return False 会返回错误

谢谢大家,我还在学习语法和基本的python。

这是我的新代码。

if within_y(co1, co2):

我有另一个类可以完成所有视觉效果,在这个问题中不需要。

  

我也忘了说这是一个火柴人游戏,你需要在一些平台上跳一个火柴人来到门口。

2 个答案:

答案 0 :(得分:1)

这是一个范围问题。在类中定义函数时,它的名称不能从类中定义的其他函数访问。相反,您需要通过类名(或类的实例)访问它,并将该函数作为属性。

将您对within_y的通话更改为Coords.within_y应该有效。但我不确定这个简单的修复是否真的是最好的修复。

在类中定义函数时,通常它是一个在类的实例上调用的方法。例如:

class Foo():
    def bar(self):
        print("bar")

    def quux(self):
        print("quux")
        self.bar()
        print("quuux")

f = Foo()
f.bar() # prints bar
f.quux() # prints quux, then bar, then quuux, each on its own line

由于您的within_y和各种collided_X函数看起来像是Coords实例作为第一个参数,因此您已经可以将它们用作方法。因此,您可以致电Coords.within_y(co1, co2)而不是co1.within_y(co2)。所以这是修改代码的另一种方法,只需要很少的更改。

但是,如果您更改参数名称以使co1selfco2为其他内容(如{{{}},则会更自然(对于Python代码) 1}},也许)。命名方法other的第一个参数是一种约定,因此您并不总是需要遵循它,但这样做会使您的代码更容易理解为读取它的任何其他人。任何看到self的人都会立即知道他们正在阅读方法,def foo(self)是调用该方法的实例。

答案 1 :(得分:0)

可以将一个函数放在另一个函数中 - 这使它成为一个只能在外部函数内立即调用的本地函数 - 如果你正确地缩进它。您也可以直接返回逻辑表达式的值,而不是编写如下内容:

if logical_expression:
    return True
else:
    return False

最后,在Python中,通常可以通过在括号中包含表达式(或子表达式)来拆分长行,这通常会使它们更易读,更容易扩展或稍后编辑。

以下是您的代码执行所有这些操作时的样子:

def collided_left(co1, co2):
    def within_y(co1,co2):
        return ((co1.y1 > co2.y1 and co1.y1 < co2.y2) or
                (co1.y2 > co2.y1 and co1.y2 < co2.y2) or
                (co2.y1 > co1.y1 and co2.y1 < co1.y2) or
                (co2.y2 > co1.y1 and co2.y2 < co1.y1))

    return (within_y(co1, co2) and
            (co1.x1 <= co2.x2 and co1.x1 >= co2.x1))