资讯专栏INFORMATION COLUMN

经验拾忆(纯手工)=> Python高阶函数操作

Elle / 834人阅读

摘要:解释就相当于把每个序列元素的每一个多带带用一个管道函数处理,再把他们按顺序组合成一个新可迭代对象注意这个管道函数只能是单参数函数,如果想传递多个参数怎么办使用偏函数怕有些人看不懂,这里就不用了,而是用普通函数定义方式固定值固定值固定值固定值固

map
In [25]: list(map(lambda a:a**2, [1,2,3,4]))
Out[25]: [1, 4, 9, 16]
解释:map就相当于 把每个序列元素 的每一个 多带带用一个管道函数处理,
     再把他们按顺序组合成一个新可迭代对象
注意:这个管道函数 只能是单参数函数,如果想传递多个参数怎么办???
    1. 使用偏函数 paitial (怕有些人看不懂,这里就不用lambda了,而是用普通函数定义方式)
        In [58]: def f(a,b):
            ...:     return a**2,b
        In [59]: f = partial(f,b="固定值")
        In [60]: list(map(f,[1,2,3,4]))
        Out[60]: [(1, "固定值"), (4, "固定值"), (9, "固定值"), (16, "固定值")]
        
       当然还是提供一下lambda的方式吧,看看有多简洁。
        In [64]: list(map(partial(lambda a,b:(a**2,b),b="固定值") ,[1,2,3,4]))
        Out[64]: [(1, "固定值"), (4, "固定值"), (9, "固定值"), (16, "固定值")]
        
    2. 如果想对map传递多个参数,除了上面用偏函数,还可以使用下面介绍的starmap  
      
map多参应用场景:进程池的imap (以后我也会写Python三器三程的文章)
starmap
In [30]: list(starmap(lambda a,b:a+b,( (1,2),(3,4))))
Out[30]: [3, 7]
解释一下:
    starmap 和 partial虽然都可以解决 map传多参,但还是有一些区别的
    starmap的 每一对的多个参数 都是密切相关的
    partial的 偏参数 是和所有 主参数 全部相关的
    
reduce
In [87]: from functools import reduce
In [88]: reduce(lambda a,b:a*b, [1,2,3,4])
Out[88]: 24
解释一下:reduce 相当于对一个序列"累"的操作 (累加、累乘等),返回结果就是累值
filter
In [100]: list(filter(lambda a:a if a>2 else None, [1,2,3,4]))
Out[100]: [3, 4]
解释一下:和map思想一样,根据条件过滤序列。
sorted
In [128]: dict1 = {"学号2":"1","学号1":"2"}
In [129]: sorted(dict1.items(),key=lambda x:x[1])
Out[129]: [("学号2", "1"), ("学号1", "2")]
解释一下:和list的sort函数类似,  但这个sorted的优点是针可以对所有序列排序
zip
In [132]: list(zip((1,2),(3,4,5)))
Out[132]: [(1, 3), (2, 4)]
解释一下:每个子序列对应位置进行组合, 如果格式不匹配,则会舍弃不匹配的那一项
三目运算
三目运算符可以使代码简介逻辑清晰(虽然 or and 也是可以使代码逻辑简洁,但有些烧脑,我几乎不用~~)
In [78]: print(1 if 0==0 else 2)
Out[78]: 1  
推导式
其实有时用推导式也可以代替部分高阶操作,并且推导式的效率也高
1. 列表推导式
    In [77]: [1 for _ in range(5) if 1==1]
    Out[77]: [1, 1, 1, 1, 1]

2. 集合推导式
    In [6]: {x for x in [1,2,1,2]}
    Out[6]: {1, 2}

3. 字典推导式
    In [18]: {value:key for key,value in {"name":"tom"}.items()}
    Out[18]: {"tom": "name"}

4. 生成器 (生成器还有另外的方式,后面还会三程三器)
    In [23]: (x for x in range(10))
    Out[23]:  at 0x0000024A4CFA8BA0>
    
    





文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43835.html

相关文章

  • 经验拾忆手工)=> Python基本数据类型

    摘要:不要疑惑,告诉你答案这个代表正负号的正。虽然一点技术含量没有,但是你要懂序列也许叫可迭代对象更为合适,但是我喜欢叫序列。 数据结构 可变类型与不可变类型(重头戏) 基操: 可变类型:[], {} # 可增删改 查 不可变类型: int float str () # 无法增删改, 只可查 升操: + 与...

    Andrman 评论0 收藏0
  • 经验拾忆手工)=> Python三程

    摘要:多线程对于爬虫方面也可以表现出较好的性能。计算密集型就别想多线程了,一律多进程。所以同一时刻最大的并行线程数进程数的核数这条我的个人理解很模糊,参考吧多线程多线程有种通过的那种方式,非常普遍,此处就不写了。 GIL的理解 GIL这个话题至今也是个争议较多的,对于不用应用场景对线程的需求也就不同,说下我听过的优点: 1. 我没有用过其他语言的多线程,所以无法比较什么,但是对于I/O而言,...

    Snailclimb 评论0 收藏0
  • 经验拾忆手工)=> Python好用深度技能工具介绍

    摘要:单元素元祖这是整数这才是元祖也许这两行,你们当时疑惑过,并且现在也都知道了,当然重点并不在这里。。虽然我水平很垃圾,但是我知道匿名函数有一种执行方式叫做自执行。看吧,这就是版的匿名函数自执行方法。 单元素元祖: a = (1) # 这是整数1 a = (1,) # 这才是元祖 也许这两行,你们当时疑惑过,并且现在也都知道了,当然重点并不在这里。。 我无聊的时候想过,为什么单...

    UnixAgain 评论0 收藏0
  • 经验拾忆手工)=> Python__黑魔法__

    摘要:类的继承类继承有三种调用方式,其实是有区别的,听我慢慢道来第一种父类方法参数直接调用第二种方法参数直接调用在谁的类下调用,就找此类对应的下一个就是要继承的第三种方法参数找类名对应的的下一个,就是继承的,一般写本身的类名上下文管理器上下文管理 类的继承 类继承有三种调用方式,其实是 有区别 的,听我慢慢道来 class A: def say(self, name): ...

    tulayang 评论0 收藏0
  • 经验拾忆手工)=> Python三器

    摘要:也就是给原函数加个外壳。类装饰填充了啊我是原函数类装饰填充了啊我是原函数说明后面关于类的装饰器如果理解困难当做了解即可,用的也少。 可迭代对象、生成器、迭代器三者的关系 1. 迭代器一定是可迭代对象 2. 生成器是迭代器的一种 3. 可迭代对象:必须实现 __iter__方法 4. 迭代器:必须实现 __iter__方法 和 __next__ 方法 5. 生成器:必须实现 __it...

    Miracle_lihb 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<