Python札记24_lambda、map

浏览: 1045

Python中有几个特殊的函数,它们能够进行函数式的编程。在函数式编程中,一个程序会被看做是一个无状态的函数计算的串行。本文中讲解前2个特殊函数:

  • lambda
  • map
  • filter
  • reduce
  • zip

lambda

lambda函数在Python中是一个神奇的函数,只用一个代码就可以解决很多的问题,通过一个例子来体现下lambda函数的神奇之处:

下面是通过定义一个add函数来实现加法的功能

def add(x):
x += 2 # x自加2
return x

numbers = list(range(10))
new_numbers = []
for i in numbers:
new_numbers.append(add(i))

new_numbers

for列表解析

通过for语句的列表解析式来实现:好像也很厉害的样子

new_numbers = [x + 2 for x in list(range(10))]    # 可以不带listfor循环遍历的对象有next方法即可
new_numbers


lambda实现

通过lambda函数怎么实现呢?

lam = lambda x: x+2
lst = []
for i in numbers: # numbers还是上面的例子
lst.append(lam(i))

lst


res = lambda x, y: x + y   # 两个参数形式
res(2, 5)


res = lambda x,y: x**y    # 先定义两个参数和一个函数
z = 5 # z看做其中的一个参数
[res(z, i) for i in range(z)] # 将两个参数带入函数中


lambda总结

  • lambda后面直接跟上变量
  • 变量后面是冒号
  • lambda函数可以接受多个参数,包含可选参数
  • 冒号后面是表达式,表达式计算的结果就是本函数的返回值
  • lambda是单行函数,实际性能并没有提升,仅供选择使用

map

上面lambda函数中的例子通过map函数实现

def add(x):
x += 2 # x自加2
return x

numbers = list(range(10))
list(map(add, numbers)) # 先通过定义的函数实现


list(map(lambda x: x+2, numbers))


items = list(range(10))
squared = []
for i in items: # for遍历完成
squared.append(i*2)

squared


map实现

def square(x):
return x*2

list(map(square, items)) # map函数实现,两个参数中前面是函数,后面是序列


list1 = range(1, 6)
list2 = range(6, 11)
list(map(lambda x, y: x + y, list1, list2)) # 将两个list中的对象一次相加


for遍历循环实现

list1 = range(1, 6)
list2 = range(6, 11)
list3 = []
for i in range(len(list1)):
list3.append(list1[i]+list2[i])

list3


list1 = range(1, 6)
list2 = range(6, 11)
list3 = range(3, 8)
list4 = []
for i in range(len(list1)):
list4.append(list1[i] + list2[i] + list3[i]) # 3层相加更简洁

list4


list(map(lambda x, y, z: x+y+z, list1, list2, list3))


map总结

  • 基本样式:map(func, seq)
  • func是一个函数对象,seq是序列对象
  • 执行:可迭代序列对象seq中的元素,依次取出来放入函数func对象进行执行,相当于是for循环。
  • 如果lambdamap函数同时存在,注意参数和序列之间一一对应的关系。
  • 返回值被放入一个列表list中。
推荐 0
本文由 皮大大 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册