01 一用而过:lambda

很多语言都有匿名函数,python的匿名函数写作lambda,当需要实现一定功能而又不想“大张旗鼓”的def一个函数时,lambda就是最优的选择。

其语法格式一般是这样的:

lambda x:x**2
# <function __main__.<lambda>(x)>

也可以将它赋值给一个变量,由于python中一切皆对象,所以后续程序中就可以用该变量调用这个匿名函数。

f = lambda x:x**2
f(2)
# 4

当然,这里其实没必要应用lambda来实现,因为既然要显式调用,还不如干脆直接写个明确的函数罢了。lambda函数更广泛的应用场景在于该匿名函数作为另一个函数的参数传递时,应用就比较合适了,例如,将lambda作为sort()函数的key参数,就可以实现特定功能的排序。

dyct = {'a':2, 'b':1, 'c':5}
sorted(dyct.items(), key = lambda x:x[1])
# [('b', 1), ('a', 2), ('c', 5)]

02 智能解压:zip

zip函数人如其名,是打包或者解包的函数,接受2个以上可迭代变量,输出对应位置组成元组后的迭代类型。例如:

a = ['a', 'b', 'c']
b = (4, 5, 6)
zip(a,b)
# <zip at 0x1da016d15c8>
list(zip(a,b))
# [('a', 4), ('b', 5), ('c', 6)]
tuple(zip(a,b))
# (('a', 4), ('b', 5), ('c', 6))

也可以接受多于2个输入可迭代变量,而且如果各迭代变量长度不一致也不会报错,只是此时返回迭代变量取决于输入总长度最短的一个。例如:

a = ['a', 'b', 'c', 'd', 'e']
b = (4, 5, 6, 7)
c = [True, False, True]
list(zip(a,b,c))
# (('a', 4, True), ('b', 5, False), ('c', 6, True))

与zip打包相对应的用法是解包,即对一个打包形式的元素进行依次解包,并返回多个新的列表。例如:

aZip = (('a', 4, True), ('b', 5, False), ('c', 6, True))
a, b, c = zip(*aZip)
# a:('a', 'b', 'c')
# b:(4, 5, 6)
# c:(True, False, True)

03 一一映射:map

map函数也正如其取名一样,是一个将接受的迭代变量依次经过某种映射,并输出映射后的迭代变量。例如,如果对列表中的某个变量依次完成求值,并返回一个新的列表,则可以应用map:

a = [1, 2, 3, 4]
map(str, a)
# <map at 0x1da017136d8>
list(map(str, a))
# ['1', '2', '3', '4']

这是map函数的一个典型用法:接受2个参数,第一个参数(上例中是str()函数)是一个要作用的函数,第二个参数是可迭代变量。

当第一个函数的参数是是一个多变量函数时,map也可以接受更多的参数。例如:

a = [1, 2, 3, 4]
b = [2, 2, 3, 3]
list(map(lambda x, y:x**y, a, b))
# [1, 4, 27, 64]

与zip函数中类似,当map里的函数参数长度不匹配时并不会报错,只是输出结果将由最短的决定:

a = [1, 2, 3, 4]
b = [2, 2]
list(map(lambda x, y:x**y, a, b))
# [1, 4]

04 一夫当关:filter

与map函数类似,filter函数也接受一个函数及其变量作为参数,只是要求这个函数的返回结果是bool型,并用这个bool的结果决定输出的取舍问题。例如需要对一个输入列表过滤,要求保留3的倍数:

a = range(10)
filter(lambda x:x%3==0, a)
# <filter at 0x1da0171c0f0>
list(filter(lambda x:x%3==0, a))
# [0, 3, 6, 9]

这里需注意,当filter的第一个函数返回值不是bool型时不会报错,只是它会转化为bool型判断,如果判断结果不是False(python中会判为False的变量包括0、None、[]等等),则会将其输出,否则过滤掉:

a = range(10)
list(filter(lambda x:x%3, a))
# [1, 2, 4, 5, 7, 8]

05 万剑归宗:reduce

map和filter函数都是多入多出型,实质上是完成了特定的变换或筛选。reduce则是归约函数,将一系列输入变量经过特定的函数后转化为一个结果输出。不过可能是由于应用场景有限的原因,reduce在python3中已不再是全局调用函数,必须要从functools包中导入方可使用:

from functools import reduce
a = range(5)
reduce(lambda x, y: x+y, a)
# 10

reduce函数还可以接受一个可选的初始值作为参数。应用reduce函数可以实现很多小trick,就看能不能想的到用的出:

from functools import reduce
s = 'abcdefg'
reduce(lambda x, y: y+x, s, 'AA')
# 'gfedcbaAA'

06 最后

当然,尽管几个函数用法不可谓不优美、功能不可谓不强大,但都不是必须的,甚至某种程度上都可以用其他形式加以替代,例如map和filter函数都可以用列表推导式来简单实现,reduce函数功能也顶多用一个for循环迭代就能解决。

但在致力于使python程序变得更加简洁优雅乃至装B耍秀的路上,这些函数也确有其用武之地,未尝不值得一试!

原文链接:https://batdalao.github.io/posts/438b.html

【干货】Python中几个有趣的函数相关推荐

  1. Python中几个有趣的函数

    众所周知,python功能强大.语法灵活,这些得益于其丰富而强大的库.除了众多第三方库和方法函数,python自带的很多函数也非常有趣,用起来称得上优雅. 很多人学习python,不知道从何学起. 很 ...

  2. Python中常用最神秘的函数! lambda 函数深度总结!

    今天我们来学习 Python 中的 lambda 函数,并探讨使用它的优点和局限性 Let's do it! 什么是 Python 中的 Lambda 函数 lambda 函数是一个匿名函数(即,没有 ...

  3. python一行输出多个数据_如何在Python中让两个print()函数的输出打印在一行内?

    1.两个连续的print()函数为什么在输出时内容会分行显示? 解:print()中有两个默认参数sep和end,其中sep是代替分隔符,end是代替末尾的换行符,默认使用','代替空格,且默认末尾加 ...

  4. python中实现延时回调普通函数示例代码

    这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 回调函 ...

  5. Python中常用的高阶函数

    Python 中常用的高阶函数 ① filter(function,iterable)filter(function, iterable)filter(function,iterable)   过滤器 ...

  6. Python中的startswith和endswith函数使用实例

    Python中的startswith和endswith函数使用实例 在Python中有两个函数分别是startswith()函数与endswith()函数,功能都十分相似,startswith()函数 ...

  7. python整数转换字符串_使用Python中的str()函数将整数值转换为字符串

    python整数转换字符串 Given an integer value and we have to convert the value to the string using str() func ...

  8. python中zip的使用_浅谈Python中的zip()与*zip()函数详解

    前言 1.实验环境: Python 3.6: 2.示例代码地址:下载示例: 3.本文中元素是指列表.元组.字典等集合类数据类型中的下一级项目(可能是单个元素或嵌套列表). zip(*iterables ...

  9. python一个函数调用另一个函数中的变量_在Python 中同一个类两个函数间变量的调用方法...

    在Python 中同一个类两个函数间变量的调用方法 更新时间:2019年01月31日 15:44:54 作者:wxy_summer 今天小编就为大家分享一篇在Python 中同一个类两个函数间变量的调 ...

最新文章

  1. 汉字笔画数据_统计学原理 数据的预处理
  2. 单片机c语言正弦计算器,求一个 89C51 简易计算器的c语言程序 只要加减乘除就行!...
  3. 《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》——02-04项目范围(Scope)管理...
  4. C++:连接MySQL
  5. 杭电5621 KK's Point
  6. 微软联合创始人保罗·艾伦去世,曾说服比尔·盖茨辍学
  7. 论开学第一个月干了点啥
  8. Java基础篇:什么是异常,异常处理的基础是什么?
  9. 搭建Open××× Server路由模式、证书认证
  10. 《python数据分析》电子书
  11. AVOD-代码理解系列(三)
  12. 怎么把Word转PDF格式?分享几种好用的转换方法
  13. Azure CDN 服务详解
  14. 嵌入式软件工程师自学之路
  15. 苹果你深深的伤害了我,还不让我说
  16. Pytorch模型量化实践并以ResNet18模型量化为例(附代码)
  17. 新媒体运营教程:线上线下用户转化的核心流程!
  18. 华为机试真题 C 实现【非严格递增连续数字序列】【2022 Q4新题】
  19. 财务软件“新物种”来了!唯你科技“精采智能”领势
  20. Android头像上传--图片转base64,后台接收到的总是null问题

热门文章

  1. codeforces 1221 A B C D
  2. node 无脑生成小程序二维码图
  3. 送专利啦~~ .Net高阶异常处理之TopLevelEH
  4. 数据库原理--事务(一)
  5. What is Equivocation in Byzantine Fault Tolerance?
  6. bash 学习笔记2
  7. 索引器(C# 编程指南)
  8. jQuery 笔记目录
  9. 服务器是怎么工作的?(一)——DHCP工作原理剖析
  10. oracle修改用户的登录密码