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"之前的空格并说出语法错误......没有任何意义.
我在这里没有看到任何错误,但是你可能会在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就会让您感到宾至如归.