在一个练习中,必须编写一个以字符串作为输入的函数,它将返回' Valid'如果该字符串仅由“赛车”字样组成。一次或多次,没有前导和尾随空格,最多有一个空格分隔单词。否则返回'无效'。
我写了以下函数,我认为是正确的。
def is_valid(s):
match = re.match(r'^racecar(\sracecar)*$', s)
return 'Valid' if match != None else 'Not valid'
在解决方案中,他们采用了我以前从未见过的不同方法。什么是return语句中使用的以下语法的名称?
def is_valid(s):
l = s.split(' ')
return ['Not valid', 'Valid'][all(s == 'racecar' for s in l)]
答案 0 :(得分:3)
img[[1]]
是一个列表
['Not valid', 'Valid']
中的所有元素均为all(s == 'racecar' for s in l)
,则True
为l
,'racecar'
为False
。由于bool
是int
(其中True -> 1, False -> 0
)的子类,因此您可以使用此表达式索引到双元素列表。
['Not valid', 'Valid'][all(s == 'racecar' for s in l)]
# coerced to 0 or 1 --^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# in context where an int is required
因此等同于
'Valid' if all(s == 'racecar' for s in l) else 'Not valid'
但是,我不会在"真实"中使用它。代码,因为它可能会使您或您的同事在稍后阅读时感到困惑。此外,正如melpomene在注释中指出的那样,此版本确实接受空字符串为有效。您可以通过添加支票来解决这个问题:
['Not valid', 'Valid'][l and all(s == 'racecar' for s in l)]