繁体   English   中英

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

[英]Python if Statement Invalid Syntax!? Why?

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”之前的空格并说出语法错误......没有任何意义。

我在这里没有看到任何错误,但是你可能会在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()

1 for x in Hand for y in Hand if x[0] == y[0] and y!=x此代码将对sum函数的调用与1 for x in Hand for y in Hand if x[0] == y[0] and y!=x生成器表达式 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就会让您感到宾至如归。

你可能在if之前有一个类似空格的字符 - 我习惯使用TextMate时这样做,其中alt + space会插入一个非破坏空间的Unicode字符而不是常规空格。

你在文件的开头有# coding: utf-8吗? 如果是这样,请将其删除,您可能会收到更好的错误消息。

顺便说一句,如果不使用sum /生成表达式(这可能比学习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

有时混合使用制表符和空格会使python跳起来 - 比方说,如果你的while循环缩进了标签,而if语句则使用空格。 虽然if语句现在可以正确缩进,但它仍然可以帮助检查代码段中的所有其他行,以确保它们都以相同的方式缩进。

您的编辑可以通过以下几种方式提供帮助:

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

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

如果这听起来不合理,请欢迎编程! 这对我们最好的人来说可能是令人沮丧的。 选择您喜欢的版本(空格或制表符),并坚持使用它。 如上所述,还有很多方法可以使用Python编写一个更干净的代码,但是也应该习惯间距问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM