Python语句无效语法!?为什么?

7 python if-statement

while x < len(Hand):
    while y < len(Hand):
        if Hand[x][0] == Hand[y][0] and y != x:
                sameRank += 1
        y += 1
    x += 1
Run Code Online (Sandbox Code Playgroud)

它突出显示"if"之前的空格并说出语法错误......没有任何意义.

Ben*_*rns 8

我在这里没有看到任何错误,但是你可能会在if语句下方缩进块.请注意,您的程序的其余部分使用4个空格来缩进?尝试将缩进减少到只有4个空格并查看它是否运行.

但是,您的代码确实存在逻辑错误.如果不在每个x的开头重新初始化y,则不会为每个x循环y.

这是我运行的逻辑错误修复程序的示例代码:

def example():
    Hand = [[1],[2],[3],[3],[4],[5],[2],[2],[1]]
    x = 0 
    sameRank = 0 

    while x < len(Hand):
        y = 0
        while y < len(Hand):
            if Hand[x][0] == Hand[y][0] and y != x:
                sameRank += 1
            y += 1
        x += 1

if __name__ == "__main__":
    example()
Run Code Online (Sandbox Code Playgroud)

最后,通过更加"pythonic",可以使这些代码更具可读性. 考虑一下:

def example():
    Hand = [[1],[2],[3],[3],[4],[5],[2],[2],[1]]
    sameRank = 0 

    for x in Hand:
        for y in Hand:
            if x[0] == y[0] and y != x:
                sameRank += 1

if __name__ == "__main__":
    example()
Run Code Online (Sandbox Code Playgroud)

此代码迭代内容Hand而不是递增临时整数变量,然后将其与索引运算符一起使用.它更好,因为有更少的"维护"行(例如x += 1),它更具可读性,并且它对类型不敏感,因为它将适用于包含列表的任何可迭代对象.

或者甚至(根据海登的评论):

def example():
    Hand = [[1],[2],[3],[3],[4],[5],[2],[2],[1]]
    sameRank = sum(1 for x in Hand for y in Hand if x[0] == y[0] and y!=x)

if __name__ == "__main__":
    example()
Run Code Online (Sandbox Code Playgroud)

此代码将对sum函数的调用与生成器表达式 组合在一起1 for x in Hand for y in Hand if x[0] == y[0] and y!=x.表达式返回一个生成器,它为列表中与您的条件匹配的每个项目生成 1,sum函数将所有这些1相加,从而为您提供所需的值sameRank.

看看这篇文章,可以很好地概述python习语.

最后,我不确定你正在使用什么编辑器,但是如果你直接从解释器的stderr/stdout获取对话框而不是消息和回溯,它听起来就像掩盖了真正的问题.当你想要学习时,有时候编辑的太多帮助是非常糟糕的.我个人使用Vim,但这对初学者来说可能有点多了.我对IDLE没有多少经验(甚至可能是你正在使用的),但我听说过将它用作学习工具的好东西.但是,如果你正在进行认真的开发,你很快就会成长.无论哪种方式,如果你使用IDLE,习惯于从命令行而不是从IDLE本身运行你的程序.我个人觉得这在很多情况下给了我更好的反馈.最后是PyDev IDE(基于Eclipse构建),它对其强大的内置可视化调试特别有用.这可能是一个不错的选择,但它确实是一个重量级选项,如果您还不熟悉Eclipse,我会将其置于"中级"难度级别.如果您熟悉Eclipse,那么PyDev就会让您感到宾至如归.