7
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”之前突出显示一个空格并说语法错误......没有意义。

4

3 回答 3

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函数的调用和生成器表达式 1 for x in Hand for y in Hand if x[0] == y[0] and y!=x。该表达式返回一个生成器,它为列表中与您的条件匹配的每个项目生成 1,并且 sum 函数将所有这些 1 相加,从而为您提供所需的值 for sameRank

看看这篇文章,对 python 成语有一个很好的概述。

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

于 2012-10-02T19:11:43.493 回答
1

您可能在if- 我以前在使用 TextMate 时遇到过类似空格的字符,其中 alt+space 会插入一个不间断空格 Unicode 字符而不是常规空格。

# 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
于 2012-10-03T13:15:46.907 回答
0

有时,制表符和空格的混合会使 python 出错——比如说,如果你的 while 循环用制表符缩进,而你的 if 语句使用空格代替。尽管 if 语句现在可以正确缩进,但它仍然有助于检查代码段中的所有其他行以确保它们都以相同的方式缩进。

您的编辑可能会提供一些帮助:

  • 点击选项卡按钮时插入多个空格而不是制表符
  • 显示空白字符,因此您可以轻松查看它是四个空格还是制表符
  • 搜索并替换制表符(\t如果您的编辑器支持通过正则表达式搜索)并将它们交换为四个空格,反之亦然。

如果您的编辑器不支持这些东西,我建议尝试使用Programmer's NotepadNotepad2,如果只是为了帮助诊断这些类型的问题。

如果这听起来不合理,欢迎编程!对于我们最好的人来说,这可能会令人沮丧。选择您喜欢的版本(空格或制表符),并坚持下去。上面提到,还有很多方法可以让 Python 中的代码变得更清晰,但是习惯于间距问题也是一个好主意。

于 2012-10-03T13:32:38.817 回答