NoneType错误与while循环中的列表?

时间:2016-10-31 13:31:52

标签: python

我正在编写一个具有已定义函数的猜谜游戏程序。它要求用户考虑1到1000之间的数字,然后程序尝试在不到15次尝试中猜测该数字。使用我的函数,要在每个函数中返回多个值,我将它们作为列表返回。但是有一个NoneType错误 - 这是错误信息。

while opAns.lower() != "no":
    FBTrcTri = guessReturn(tries, upper, lower)
    feedback = FBTrcTri[0]
    errorBound = FBTrcTri[1]
    errorTrick = FBTrcTri[2]
    tries = FBTrcTri[3]

这是我的代码:

def guessReturn(tries, upper, lower):
    while tries < 15:


        errorInput = "yes"

        while errorInput == "yes":
            feedbackGuessVal = guesser(upper, lower)


            feedback = feedbackGuessVal[0]
            guessVal = feedbackGuessVal[1]


            LUITri = processData(feedback, tries, upper, lower, guessVal)


            lower = LUITri[0]
            upper = LUITri[1]
            errorInput = LUITri[2]
            tries = LUITri[3]


            errorBound = boundChecker(upper, lower)
            errorTrick = trickChecker(upper, lower)

            if errorBound == "yes":
                return
            elif errorTrick == "yes":
                return
            elif feedback == "0":
                tries += 1
                return


        tries += 1


    return [feedback, errorInput, errorBound, errorTrick, tries]

这里定义了函数:

public class ActorDisparo extends Actor {

private TextureRegion textureDisparo = new TextureRegion();
private World world;
public static Body body;
//private Fixture fixture;
private FixtureDef fdef;
private String userData;
private float anchoDisparo, altoDisparo;
private float positionX,positionY;
private static float porcentajeDeancho = 0,anchoMediano = 0, anchoPequeno = 0, anchoDiminuto = 0;
private TextureRegion arponRegion = new TextureRegion();

public ActorDisparo(World world, TextureRegion disparo, Vector2 position, float anchoDisparo, float altoDisparo, float fuerzaX, float fuerzaY, String userData){
    this.textureDisparo = disparo;
    this.world = world;
    this.anchoDisparo = anchoDisparo;
    this.altoDisparo = altoDisparo;
    this.userData = userData;

    BodyDef bodyDef = new BodyDef();
    bodyDef.position.set(position);
    bodyDef.type = BodyDef.BodyType.DynamicBody;
    body = world.createBody(bodyDef);

    PolygonShape shapeDisparo = new PolygonShape();
    shapeDisparo.setAsBox((anchoDisparo/2)/2,altoDisparo/2);

    fdef = new FixtureDef();
    fdef.shape = shapeDisparo;
    //fdef.restitution = 0.70f;

    fdef.filter.categoryBits = BolasGame.DISPARO_BIT;
    fdef.filter.maskBits = BolasGame.BOLAROJA_BIT |
                           BolasGame.TECHO_BIT;

    body.createFixture(fdef).setUserData(userData);
    shapeDisparo.dispose();
    body.setGravityScale(0f);
    body.applyLinearImpulse(fuerzaX,fuerzaY,position.x,position.y,true);

    setSize( anchoDisparo *BolasGame.MetrosAPixels ,altoDisparo*BolasGame.MetrosAPixels);

    //setBounds(0, 0, getWidth(), getHeight());
}

public float getPositionX() {
    return getPositionX();
}

public float getPositionY() {
    return getPositionY();
}

@Override
public void act(float delta) {
    super.act(delta);
}

@Override
public void draw(Batch batch, float parentAlpha) {
    super.draw(batch, parentAlpha);
    setPosition( (body.getPosition().x * BolasGame.MetrosAPixels) - getWidth()/2, (body.getPosition().y * BolasGame.MetrosAPixels) - getHeight()/2);
    batch.draw(textureDisparo,getX(),getY(),getWidth(),getHeight());
}

public void detach(){
        world.destroyBody(body);
        remove();
}

}

2 个答案:

答案 0 :(得分:2)

if errorBound == "yes":
    return
elif errorTrick == "yes":
    return
elif feedback == "0":
    tries += 1
    return

没有任何值的return语句将返回None,您将尝试将其视为列表

答案 1 :(得分:2)

该错误告诉您正在尝试对类型为[...]的对象(即NoneType单例对象)使用预订语法(None)。

您的guessReturn()函数会在多个位置返回None

if errorBound == "yes":
    return
elif errorTrick == "yes":
    return
elif feedback == "0":
    tries += 1
    return
没有显式返回值的

return会返回None

您正试图通过以下方式订阅该结果:

feedback = FBTrcTri[0]

您必须显式测试FBTrcTriNone(或使用异常处理来捕获TypeError),还是在列表或元组中返回至少4个值< em>总是,来自你职能的所有出口点。