• python 列表解析与map和filter函数


    不知哪儿看到一个说法,大概是当map的函数参数可以直接引用一个已有的函数变量时(比如内建函数int,str之类的),用map更优美些,否则还是用列表解析更直观和快速.

    我同意此说法.

    昨天在写一个函数时,最开始用的是map:

    def process_messages(arr,msgs,mode):
        return map(lambda msg:process_message(arr,msg,mode),msgs)

    可以看到,那个lambda显得笨拙而庞大.今天起来转念一想,用列表解析不是更好么:

    def process_messages(arr,msgs,mode):
        return [process_message(arr,msg,mode) for msg in msgs]

    前段时间没事的时候用Python模拟map函数时发现,map函数的功能就是列表解析的子集..当时没有用到zip函数,版本是这样:

    def imap(func,*seqs):
        return (func(*(seq[i] for seq in seqs)) for i in range(len(seqs[0])))

    今天突然发现zip函数原来是可以接受多个序列的,于是有了更优美的版本:

    def imap(func,*seqs):
        return [func(*args) for args in zip(*seqs)]

    从上面的imap可以看到,列表解析完全可以涵盖map的功能.当然,一些由于程序构造需要传递函数变量的情况,可能只能使用map.但这种的话总是可以改的.

    而且,对于两个或两个以上的序列情况,map函数更繁杂:

    map(lambda arg1,arg2,...,argn:func(arg1,arg2,...,argn),seq1,seq2,...,seqn)
    
    [func(*args) for args in zip(seq1,seq2,...,seqn)]

    filer也有这样的倾向:

    def clean_message(s):
        return ''.join(filter(lambda c:c.isalpha(),s.upper()))
    
    def clean_message(s):
        return ''.join(c for c in s.upper() if c.isalpha())

    当然,以下这类情况用map,filter还是非常优美的:

    string='12345'
    map(int,string)
    
    numseqs=[(1,1,1,0),(1,1,1,1)] 
    filter(all,numseqs)

    附,强大而灵活的zip函数和for循环.

    >>> for k,v in [(1,2),(2,4)]:
        print k,v
    
        
    1 2
    2 4
    >>> for k,v,x in [(1,2,3),(2,4,5)]:
        print k,v,x
    
        
    1 2 3
    2 4 5
    >>> for k in [(1,2,3),(2,4,5)]:
        print k
    
        
    (1, 2, 3)
    (2, 4, 5)
    >>> 
  • 相关阅读:
    怎么写好组件
    html5/css3常考面试题
    js各种继承方式和优缺点的介绍
    C#控件背景透明的几种解决方案
    c# 控件闪烁处理方法
    使用委托的BeginInvoke方法来完成复杂任务的操作
    C#中的预处理器指令
    C#中父窗口和子窗口之间实现控件互操作
    C#编程让Outlook乖乖交出帐户密码
    在Linux上运行C#
  • 原文地址:https://www.cnblogs.com/xiangnan/p/3409906.html
Copyright © 2020-2023  润新知