我怎么能在这段代码中使用map()?

liu*_*ong 1 python

我有一个字符串列表

[str1, str2, str3.....]
Run Code Online (Sandbox Code Playgroud)

我还要def检查字符串的格式,例如:

def CheckIP(strN):
    if(formatCorrect(strN)):
        return True
    return False
Run Code Online (Sandbox Code Playgroud)

现在我想检查列表中的每个字符串,当然我可以用来逐个检查.但是我可以使用它map()来使代码更具可读性吗?

iCo*_*dez 6

您可以将列表映射到您的函数,然后使用all它来检查它是否True为每个项目返回:

if all(map(CheckIP, list_of_strings)):
    # All strings are good
Run Code Online (Sandbox Code Playgroud)

实际上,只是摆脱CheckIP功能并formatCorrect直接使用会更简洁:

if all(map(formatCorrect, list_of_strings)):
    # All strings are good
Run Code Online (Sandbox Code Playgroud)

此外,作为额外的奖励,all使用懒惰评估.这意味着,它只会在返回结果之前检查所需的项目数.


但请注意,更常见的方法是使用生成器表达式而不是map:

if all(formatCorrect(x) for x in list_of_strings):
Run Code Online (Sandbox Code Playgroud)

在我看来,生成器表达总是比map因为:

  1. 它们更具可读性.

  2. 如果不比使用速度快,它们也同样快map.此外,在Python 2.x中,map创建一个通常不必要的列表对象(浪费内存).只有在Python 3.x中才会map像生成器表达式一样使用延迟计算.

  3. 它们更强大.除了将项目映射到函数之外,生成器表达式还允许您在生成每个项目时对其执行操作.例如:

    sum(x * 2 for x in (1, 2, 3))
    
    Run Code Online (Sandbox Code Playgroud)
  4. 它们是大多数Python程序员的首选.在编程时保持常规非常重要,因为它可以简化维护并使您的代码更易于理解.

  5. 有没有像去除功能的讲map,filter从语言的未来版本,等等.虽然这不是一成不变的,但它在Python社区中已经出现过很多次了.

当然,如果你是函数式编程的粉丝,你就不太可能同意第一和第四点.:)