匿名函数lambda,map,filter,reduce,zip

有名函数   下面这种函数定义方式,有函数名的嘛,func就是函数的名字,指向函数代码在内存中的地址,加上括号就可以运行

def func(x,y):

  return x+y

print(func)   # <function func at 0x005A9540>  func就是函数的名字,指向函数代码在内存中的地址

 

匿名函数 lambda 不要问为什么,匿名函数就叫lambda 记住就可以。中文的释义 就是没有名字的函数,哈哈。英文我也没找到出处。

lambda x,y: x+y  # 它代表一个内存地址  <function <lambda> at 0x00270858>  

(lambda x,y: x+y)(1,2)  # 3, 内存地址加括号,传参数后运行函数,但是一般不这样用的

用lambda 去定义一个过渡的函数,是不是简单很多了。这个通常用在 将函数做成一个‘桥’ 就是短暂的用一下下的时候。通常跟其他函数联合使用。\

匿名函数,由于没有名字,只是一串内存地址,所以它会被Python解释器识别成 垃圾, 运行完了 就会被回收。

 

一、匿名函数的应用

dic = {'jack':5000,'joe':2000,'sue':6000}  # 找出工资最高和最低的人

p1 = max(dic,key = lambda k: dic[k])   # max函数有两个参数,一个可迭代对象,一个key = 函数的内存地址。key的意思是 对于可迭代对象按照key排序后取出最大值

p2 = min(dic,key = lambda k : dic[k])

dic_new = sorted(dic, key = lambda k : dic[k])  # 也是一样,按照key去排序,默认升序)

1.map 函数  

l = ['jack','joe','sue']

g= map(lambda name:name+'_l',l)  # map 函数有两个参数,前面是函数的内存地址(它决定这如何处理可迭代对象中的每个值),后面是可迭代对象。

print(g)    # <map object at 0x005B8BD0> map()返回的是一个可迭代对象。

 

l = [i.upper() for i in l]  # 用列表生成式也是可以做的

2.filter 函数

l = ['jack','joe','sue','bob']  # 留下已e结尾的名字

g = filter(lambda name: name.endswith('e') , l)   # filter 函数有两个参数,前面是函数的内存地址(它接收可迭代对象传进来的值,经过运算后,得到True或者False. filter会过滤掉结果为False的可迭代对象的值),后面是可迭代对象

print(g)   # <filter object at 0x005B8BD0>

print(list(g))  # ['joe', 'sue']

 

g = [i for i in l if i.endswith('e')]  # 用列表生成式也可以的

3.reduce 函数

reduce 是一个累加操作,不要问为什么reduce 是合并累加的意思,他就是这个意思。在Python 3中,reduce不是内置函数,需要从functools中导入。

from functools import reduce

reduce(lambda x,y: x+y, [1,2,3],10)   # 16  其实是从列表中取出一个值,跟初始值合并成一个....,重复操作,最后合并成一个值。初始值可以省略

 除了数字的合并,reduce也可以用来做字符串的合并

reduce(lambda x,y: x+y, [‘a','b','c'],'hello')   # ‘helloabc’

3.zip 函数

zip()---> print(list(zip(("a", "b","C"), (1,2,3)))) # [('a', 1), ('b', 2), ('C', 3)]

 

p = {"name":"alex","age":18}
print(list(zip(p.keys(),p.values()))) # [('name', 'alex'), ('age', 18)]

 

salaries = {
'tom': 3000,
'jack': 122121221,
'rose': 100,
}
k_and_v = zip(salaries.values(), salaries.keys())

print(k_and_v) # <zip object at 0x0000000000C07BC8>
print(max(k_and_v)) # (122121221, 'jack')
#k_and_v是迭代器,因而只能访问一次
# print(min(k_and_v)) #报错了

k_and_v2 = zip(salaries.values(), salaries.keys())
# print(list(k_and_v2)) # [(3000, 'tom'), (122121221, 'jack'), (100, 'rose')]
# print(list(zip(k_and_v2))) #[((3000, 'tom'),), ((122121221, 'jack'),), ((100, 'rose'),)]
# print(list(zip(*k_and_v2))) #[(3000, 122121221, 100), ('tom', 'jack', 'rose')]
print(list(map(list, zip(*k_and_v2)))) #[[3000, 122121221, 100], ['tom', 'jack', 'rose']]

 

class zip(object)
| zip(iter1 [,iter2 [...]]) --> zip object
|

Return a zip object whose .__next__() method returns a tuple
where the i-th element comes from the i-th iterable argument.
The .__next__() method continues until the shortest iterable in the argument sequence is exhausted and then it raises StopIteration.

返回一个zip对象,其剩余的next__()方法返回一个元组

第i个元素来自第i个可迭代参数。

剩余的next__()方法一直持续到参数序列中最短的可迭代被耗尽,然后它抛出StopIteration。

posted @ 2020-07-31 18:16  正在学Python  阅读(201)  评论(0编辑  收藏  举报