以列表理解方式编写for循环以缩短代码

writing a for loop in list comprehension way to shorten the code

def rahu(big_jug):    

    try_a=list(range(0,int(big_jug/3)+1))    

    for a in try_a:        

        b=(big_jug-3*a)/5        

        if b==int(b):

            return('yes')

    return('no')

现在尝试以列表推导方式编写并在“Return”内完成 For 循环...但出现错误并尝试了 2-3 种方式

def rahu(big_jug): 

    try_a=list(range(0,int(big_jug/3)+1))

    b=(big_jug-3*a)/5

    return ('yes' if b==int(b) for a in try_a  else 'no')
  File "<ipython-input-7-f8ff1bb94105>", line 4
    return ('yes' if b==int(b) for a in try_a  else 'no')
                                 ^
SyntaxError: invalid syntax

我想问题是在 for 循环外定义 ''a'',但是如何在 return 内用其他条件定义它

这里有一些代码可以满足您的需求:

def rahu_comprehension(big_jug):
    return next(
        ('yes'
         for a in range(0, int(big_jug / 3) + 1)
         for b in [(big_jug - 3 * a) / 5]
         if b == int(b)
         ),
        'no'
    )

虽然这是多行,但这只是为了便于阅读,它作为单行工作。

在解释这段代码之前,我有几点注意事项:首先,这并不总是一个好主意——尽管可以通过使用列表(或其他)理解来简化一些代码,但这段代码是我个人更喜欢使用 for 循环以使其更具可读性的复杂程度。其次,从函数中 returning 字符串 'yes''no' 不是好的做法。如果你 return TrueFalse 你的函数将在其他地方更可重用,然后如果你需要一个字符串,你可以写 'yes' if rahu(x) else 'no'.

现在,进入代码解释。

代码的核心是生成器表达式:

('yes'
 for a in range(0, int(big_jug / 3) + 1)
 for b in [(big_jug - 3 * a) / 5]
 if b == int(b)
 )

请注意,这使用圆括号而不是方括号,这使其成为生成器表达式而不是列表理解。这意味着它不会计算整个列表和 return 它,而是只在需要时计算每个项目。在这种情况下我们只需要找到第一项,因为你的原始代码在 if 语句中的条件为 True 时立即停止计算,因此通过使用生成器表达式,我们可以在找到后停止做额外的工作第一个值。 此生成器表达式类似于以下代码:

results = []
for a in range(0, int(big_jug / 3) + 1):
    for b in [(big_jug - 3 * a) / 5]:
        if b == int(b):
            results.append('yes')

外部 for a in ... 循环与您的代码相同。内部 for b in [(big_jug - 3 * a) / 5] 相当于变量赋值,因为它循环遍历长度为 1 的列表:

results = []
for a in range(0, int(big_jug / 3) + 1):
    b = (big_jug - 3 * a) / 5:
    if b == int(b):
        results.append('yes')

我们使用这个循环的原因是 python 中的推导不允许变量赋值,这是允许这样赋值的技巧。

表达式的next(..., 'no')部分是从生成器中取出第一项(这将是一个'yes'),或者如果生成器没有任何项,则使用默认值'no'.