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”之前突出显示一个空格,并显示语法错误……毫无意义。
while x < len(Hand):
while y < len(Hand):
if Hand[x][0] == Hand[y][0] and y != x:
sameRank += 1
y += 1
x += 1
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()
最后,通过更加符合Python风格的编写方式,可以使这段代码变得更易读。请考虑以下方法:
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
),更易读,并且对类型不敏感,因为它将适用于包含列表的任何可迭代对象。或者甚至可以按照Hayden的评论改为: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加起来,从而给出你对sameRank
想要的值。你可能在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 语句现在可能已经正确缩进了,但最好还是检查一下代码片段中的所有其他行,确保它们都以相同的方式缩进。
以下是一些编辑器可能会提供的帮助:
如果你的编辑器没有支持上述任何功能,我建议尝试使用 Programmer's Notepad 或 Notepad2,即使只是为了帮助诊断这些问题。
如果这听起来过于挑剔,那就欢迎进入编程的世界吧!即使是最优秀的人也可能感到沮丧。选择你喜欢的版本(空格或制表符),并坚持使用。在Python中,有许多方法可以使代码更加简洁,如上所述,但习惯处理空格问题也是一个好主意。
if
代码块的缩进应该和while
代码块一样。请确认您没有混用tab键和空格键。 - cdhowiesum(1 for x in Hand for y in Hand if x[0] == y[0] and y!=x)
- Andy Hayden