在列表理解中获得错误 - python

Del*_*ain 0 python list-comprehension list python-3.x

使用此代码获取错误(SyntaxError:无效语法)

score = [a*a in range(1, 100) if (a*a)%2 is 0 and str(a*a)[-1] is '0']
print(score)
Run Code Online (Sandbox Code Playgroud)

结果:

SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

但是当我使用它而没有列表理解方法时,相同的代码工作正常.

score = []
for a in range(1,100):
    if (a*a)%2 is 0 and str(a*a)[-1] is '0':
        score.append(a*a)
print(score)
Run Code Online (Sandbox Code Playgroud)

结果:

[100, 400, 900, 1600, 2500, 3600, 4900, 6400, 8100]
Run Code Online (Sandbox Code Playgroud)

sch*_*ggl 8

你错过了for a.此外,您应该使用==测试int和字符串的相等性,因为is检查对象标识:

score = [a*a for a in range(1, 100) if (a*a) % 2 == 0 and str(a*a)[-1] == '0']
Run Code Online (Sandbox Code Playgroud)

你也可以缩短== 0bool检查,一般考虑采用endswith了更强大的后缀检查:

score = [a*a for a in range(1, 100) if not (a*a) % 2 and str(a*a).endswith('0')]
Run Code Online (Sandbox Code Playgroud)

请参阅列表推导文档.


Wil*_*sem 5

问题是表达式的yield部分:

score = [a in range(1, 100) if (a*a)%2 is 0 and str(a*a)[-1] is '0']
Run Code Online (Sandbox Code Playgroud)

您想要添加a*a到列表中,所以:

score = [a*a for a in range(1, 100) if (a*a)%2 is 0 and str(a*a)[-1] is '0']
Run Code Online (Sandbox Code Playgroud)

但代码非常不优雅.你使用的is是引用相等.虽然大多数解释器缓存字符和小整数,但依赖它有点冒险:程序工作必须满足的假设越多,就越容易出错.

此外,您可以通过检查来检测是否a*a结束.由于是倍数,我们甚至可以放弃第一次检查.我们可以检查一个整数为零(这是).0(a*a)%10 == 0102inot iTruei == 0

因此,更安全,更短的解决方案是:

score = [a*a for a in range(1, 100) if not (a * a) % 10]
Run Code Online (Sandbox Code Playgroud)

然后产生然后:

>>> [a*a for a in range(1, 100) if not (a * a) % 10]
[100, 400, 900, 1600, 2500, 3600, 4900, 6400, 8100]
Run Code Online (Sandbox Code Playgroud)