while x < len(Hand):
while y < len(Hand):
if Hand[x][0] == Hand[y][0] and y != x:
sameRank += 1
y += 1
x += 1
它突出显示“if”之前的空格并说出语法错误......没有任何意义。
答案 0 :(得分: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()
最后,通过更加“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()
此代码迭代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()
此代码将对sum
function的调用与generator expression 1 for x in Hand for y in Hand if x[0] == y[0] and y!=x
相结合。表达式返回generator,列表中的每个项目都符合您的条件,并且sum函数会将所有这些1加起来,从而为您提供sameRank
之后的值。 / p>
请查看this article以获得有关python习语的详细概述。
最后,我不确定你正在使用什么编辑器,但是如果你直接从解释器的stderr / stdout获取对话框而不是消息和回溯,它听起来就像掩盖了真正的问题。当你想要学习时,有时候编辑的太多帮助是非常糟糕的。我个人使用Vim,但这对初学者来说可能有点多了。我对IDLE没有多少经验(它甚至可能是你正在使用的),但我听说过将它用作学习工具的好处。但是,如果你正在进行认真的开发,你很快就会成长。无论哪种方式,如果你使用IDLE,习惯于从命令行而不是从IDLE本身运行你的程序。我个人觉得这在很多情况下给了我更好的反馈。最后是PyDev IDE(基于Eclipse构建),这对于其强大的内置可视化调试特别有用。这可能是一个不错的选择,但它确实是一个重量级选项,如果您还不熟悉Eclipse,我会将其置于“中级”难度级别。如果您熟悉Eclipse,那么PyDev就会让您感到宾至如归。
答案 1 :(得分:1)
你可能在if
之前有一个类似空格的字符 - 我曾经在使用TextMate时得到这个字符,其中alt + space会插入一个非空格的Unicode字符而不是常规空格。< / p>
您的文件开头是否有类似# coding: utf-8
的内容?如果是这样,请删除它,您可能会收到更好的错误消息。
顺便说一句,如果不使用sum
/ generation表达式(这可能会比学习Python的东西更加混乱),你的循环可以这样简化:
for x in range(len(Hand)):
for y in range(len(Hand)):
if Hand[x][0] == Hand[y][0] and y != x:
sameRank += 1
答案 2 :(得分:0)
有时混合使用制表符和空格会使python跳起来 - 比方说,如果你的while循环缩进了标签,而if语句则使用空格。虽然if语句现在可以正确缩进,但它仍然可以帮助检查代码段中的所有其他行,以确保它们都以相同的方式缩进。
您的编辑可以通过以下几种方式提供帮助:
\t
,如果您的编辑器支持使用正则表达式进行搜索)并将它们与四个空格交换,反之亦然。如果您的编辑不支持这些内容,我建议您尝试Programmer's Notepad或Notepad2,只是为了帮助诊断这些问题。
如果这听起来不合理,请欢迎编程!这对我们最好的人来说可能是令人沮丧的。选择您喜欢的版本(空格或制表符),并坚持使用它。如上所述,还有很多方法可以使用Python编写一个更干净的代码,但同样也要考虑到间距问题。