以列表理解方式编写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 True
或 False
你的函数将在其他地方更可重用,然后如果你需要一个字符串,你可以写 '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'
.
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 True
或 False
你的函数将在其他地方更可重用,然后如果你需要一个字符串,你可以写 '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'
.