Python 在这段代码中如何使用map()?

Python 在这段代码中如何使用map()?,python,Python,我有一个字符串列表 [str1, str2, str3.....] 我还有一个def来检查字符串的格式,比如: def CheckIP(strN): if(formatCorrect(strN)): return True return False 现在我想检查列表中的每个字符串,当然我可以使用for逐个检查。但是我是否可以使用map()使代码更具可读性…?您可以将列表映射到函数,然后使用检查它是否为每个项目返回True: if all(map(CheckIP

我有一个字符串列表

[str1, str2, str3.....]
我还有一个
def
来检查字符串的格式,比如:

def CheckIP(strN):
    if(formatCorrect(strN)):
        return True
    return False

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

您可以将列表映射到函数,然后使用检查它是否为每个项目返回
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
使用延迟评估作为额外的奖励。也就是说,在返回结果之前,它只检查所需数量的项


但是请注意,更常见的方法是使用一个而不是
映射

if all(formatCorrect(x) for x in list_of_strings):
在我看来,生成器表达式总是优于
map
,因为:

  • 它们更具可读性

  • 如果不比使用
    map
    更快的话,它们也同样快。此外,在Python2.x中,
    map
    创建了一个通常不必要的列表对象(浪费内存)。只有在Python3.x中,
    map
    像生成器表达式一样使用惰性计算

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

    sum(x * 2 for x in (1, 2, 3))
    
  • 它们是大多数Python程序员的首选。编程时遵守约定很重要,因为它简化了维护并使代码更易于理解

  • 有人说要从该语言的未来版本中删除诸如
    map
    filter
    等函数。尽管这不是一成不变的,但它在Python社区中已经出现过很多次


  • 当然,如果你是函数式编程的爱好者,你不大可能同意第一点和第四点

    您可以将列表映射到函数,然后使用检查是否为每个项目返回
    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
    使用延迟评估作为额外的奖励。也就是说,在返回结果之前,它只检查所需数量的项


    但是请注意,更常见的方法是使用一个而不是
    映射

    if all(formatCorrect(x) for x in list_of_strings):
    
    在我看来,生成器表达式总是优于
    map
    ,因为:

  • 它们更具可读性

  • 如果不比使用
    map
    更快的话,它们也同样快。此外,在Python2.x中,
    map
    创建了一个通常不必要的列表对象(浪费内存)。只有在Python3.x中,
    map
    像生成器表达式一样使用惰性计算

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

    sum(x * 2 for x in (1, 2, 3))
    
  • 它们是大多数Python程序员的首选。编程时遵守约定很重要,因为它简化了维护并使代码更易于理解

  • 有人说要从该语言的未来版本中删除诸如
    map
    filter
    等函数。尽管这不是一成不变的,但它在Python社区中已经出现过很多次


  • 当然,如果你是函数式编程的爱好者,你不大可能同意第一点和第四点

    一个例子,您可以如何做:

    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 
    

    例如,您可以如何做:

    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 
    
    answer
    是一个布尔值列表,使得
    answer[i]
    CheckIP(L[i])
    。如果要进一步检查所有这些值是否为真,可以使用
    all

    all(answer)
    
    当且仅当
    answer
    中的所有值均为
    True
    时,此函数返回
    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
    
    answer
    是一个布尔值列表,使得
    answer[i]
    CheckIP(L[i])
    。如果要进一步检查所有这些值是否为真,可以使用
    all

    all(answer)
    
    当且仅当
    answer
    中的所有值均为
    True
    时,此函数返回
    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
    

    什么是最好的,为什么?我想你已经说过了,但更详细地说-
    所有的
    只会在它找到一个
    False
    的值之前进行,所以如果前几个值中有一个是坏的,那么在找到它之前只需迭代几次,所需的时间就会少得多。@G.Meyer-你是对的,我本来应该更清楚的。使用
    all
    是非常重要的一点。更新。什么是最好的?为什么?我想你已经说过了,但更详细地说-
    所有的
    只会在它找到一个
    False
    的值之前进行,所以如果前几个值中有一个是坏的,那么在找到它之前只需迭代几次,所需的时间就会少得多。@G.Meyer-你是对的,我本来应该更清楚的。使用
    all
    是非常重要的一点。更新。还有一个快速提示-在
    CheckIP
    函数中,实际上不需要
    if
    语句,因为如果
    formatCorrect
    为真,则返回
    True
    ,如果为假,则返回
    False
    。因此,您可以按照<任务> >代码>(代码)> <代码>返回格式纠正(STRN)。谢谢G. Meyer,好建议!还有一个快速注意事项-在
    CheckIP
    函数中,实际上不需要
    if
    语句,因为如果
    formatCorrect
    为真,则返回
    True
    ,如果为假,则返回
    False
    。因此,您可以根据任务考虑做<代码>返回格式纠正(STRN)< /代码>。