我有一个字符串列表
[str1, str2, str3.....]
我还有一个def
来检查字符串的格式,例如:
def CheckIP(strN):
if(formatCorrect(strN)):
return True
return False
现在我想检查列表中的每个字符串,当然我可以用来逐个检查。但我可以使用map()
来使代码更具可读性吗?
答案 0 :(得分:6)
您可以将列表映射到您的函数,然后使用all
检查每个项目是否返回True
:
if all(map(CheckIP, list_of_strings)):
# All strings are good
实际上,删除CheckIP
函数并直接使用formatCorrect
会更清晰:
if all(map(formatCorrect, list_of_strings)):
# All strings are good
此外,作为额外奖励,all
使用延迟评估。这意味着,它只会在返回结果之前检查所需数量的项目。
但请注意,更常见的方法是使用generator expression代替map
:
if all(formatCorrect(x) for x in list_of_strings):
在我看来,生成器表达总是比map
更好,因为:
它们的可读性稍高。
如果不比使用map
更快,它们也同样快。此外,在Python 2.x中,map
创建了一个通常不必要的列表对象(浪费内存)。仅在Python 3.x中,map
使用惰性计算,如生成器表达式。
他们更强大。除了将项目映射到函数之外,生成器表达式还允许您在生成每个项目时对其执行操作。例如:
sum(x * 2 for x in (1, 2, 3))
大多数Python程序员都喜欢它们。在编程时保持常规非常重要,因为它可以简化维护并使您的代码更易于理解。
有人谈到从该语言的未来版本中删除map
,filter
等功能。虽然这不是一成不变的,但它在Python社区已经多次出现过。
当然,如果你是函数式编程的粉丝,那么你很可能同意第一和第四点。 :)
答案 1 :(得分:1)
一个例子,你怎么做:
in_str = ['str1', 'str2', 'str3', 'not']
in_str2 = ['str1', 'str2', 'str3']
def CheckIP(strN):
# different than yours, just to show example.
if 'str' in strN:
return True
else:
return False
print(all(map(CheckIP, in_str))) # gives false
print(all(map(CheckIP, in_str2))) # gives true
答案 2 :(得分:1)
L = [str1, str2, str3.....]
answer = list(map(CheckIP, L))
answer
是一个布尔值列表,answer[i]
为CheckIP(L[i])
。如果您想进一步检查所有这些值是否为True,可以使用all
:
all(answer)
当且仅当True
中的所有值均为answer
时,才会返回True
。但是,你可以这样做而不会发泄:
all(map(CheckIP, L)), as, in python3, `map` returns an iterator, not a list. This way, you don't waste space turning everything into a list. You also save on time, as the first `False` value makes `all` return `False`, stopping `map` from computing any remaining values