Python如何将带条件返回的for循环改写为列表推导式简化代码
错误原因
- 变量
a未定义就提前使用:你把b=(big_jug-3*a)/5的计算逻辑放在了for迭代逻辑之前,此时a还没有被赋值,就算语法不报错,运行时也会触发名称错误。 - 语法顺序错误:Python的三元表达式结构为
值1 if 条件 else 值2,你把for迭代逻辑插在了if和else中间,不符合语法规范,直接触发SyntaxError。
正确改写方案
你可以搭配Python内置函数any()+生成器表达式实现一行判断,不需要额外定义中间变量,代码如下:
def rahu(big_jug): return 'yes' if any((big_jug - 3*a) % 5 == 0 for a in range(int(big_jug / 3) + 1)) else 'no'
逻辑说明
any()会迭代所有可能的非负整数a(取值范围从0到big_jug//3),只要存在任意一个a满足(big_jug - 3*a)可以被5整除,就说明存在对应的非负整数b,此时返回yes;如果所有a都不满足条件,就返回no。这里用取模运算% 5 == 0替代b == int(b)的判断,写法更简洁,也不需要额外定义变量b。
内容的提问来源于stack exchange,提问作者rahul mathur
相关产品推荐
相关产品推荐

