// Fork me on GitHub

匿名函数与内置函数

语法:
    lambda 参数: 返回值
    lambda :

例如:lambda x,n:x**n 
f = lambda x,n:x**n
f(2,3)
>>>8

注意:
匿名函数需要一次性使用。
匿名函数单独使用毫无意义,它必须配合 “内置函数” 一起使用的才有意义。

# 有名函数
def func():   #func --->内存地址
    return 1
print(func())  # func函数对象 + ()   即调用

# 匿名函数:
# 匿名(), return 已经自动添加了
# lambda 匿名(): return 1
func = lambda : 1
print(func())   # 1

func = lambda : 1
print()

二、内置函数
内置函数:python内部提供的自带的内置方法
如:range,print,len,max,min,sorted,map,filter

max:求最大值 max(可迭代对象)

max内部会将可迭代对象中的每一个值取出,并且进行判断
list1 = [1,2,3,4,5]
print(max(list1))  
>>>5

# 需求: 获取dict1中薪资最大的人的 名字
dict1 = {
    'tank': 1000,
    'egon': 500,
    'sean': 200,
    'jason': 100
}
print(max(dict1, key=lambda x: dict1[x]))
>>>tank

sorted: 默认升序(从小到大) reverse:反转 reverse默认是False

list1 = [10, 2, 3, 4, 5]
print(sorted(list1))
print(sorted(list1, reverse=True))     # reverse=True--> 降序


dict1 = {
    'tank': 100,
    'egon': 500,
    'sean': 200,
    'jason': 50
}
# new_list = ['egon', 'sean', 'tank', 'jason']
new_list = sorted(dict1, key=lambda x: dict1[x], reverse=True)      #联想到for对字典取值都是去的键值
print(new_list)

[2, 3, 4, 5, 10]
[10, 5, 4, 3, 2]
['egon', 'sean', 'tank', 'jason]

map映射

语法:map(函数地址, 可迭代对象) ---> map对象
     map会将可迭代对象中的每一个值遍历取出,并且按照指定的规则映射到一个map对象中,
     可以再将map对象转换成列表/元组。
     注意: 只能转一次。

如:
name_list = ['egon', 'jason', 'sean',  'tank']
map_1 = (map(lambda x : x + '喜欢吃生蚝' if x == 'tank' else x + '_DJB',name_list))
print(map_1)   # map_1 是一个map对象  即<map object at 0x00000177C926FB48>
print(list(map_1))   #转成列表  map_1-->生成器--->用完后,就不能再取了
#print(tuple(list(map_1)))   #是一个空元组


Map
Map会将⼀个函数映射到⼀个输⼊列表的所有元素上。 这是它的规范:
规范
map(function_to_apply, list_of_inputs)
⼤多数时候, 我们要把列表中所有元素⼀个个地传递给⼀个函数, 并收集输出。 ⽐⽅说:
items = [1, 2, 3, 4, 5]
squared = []
for i in items:
squared.append(i**2)
Map可以让我们⽤⼀种简单⽽漂亮得多的⽅式来实现。 就是这样:
items = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, items))
⼤多数时候, 我们使⽤匿名函数(lambdas)来配合map, 所以我在上⾯也是这么做的。 不仅
⽤于⼀列表的输⼊, 我们甚⾄可以⽤于⼀列表的函数!
def multiply(x):
return (x*x)
def add(x):
return (x+x)
funcs = [multiply, add]
for i in range(5):
value = map(lambda x: x(i), funcs)
print(list(value))
# 译者注: 上⾯print时, 加了list转换, 是为了python2/3的兼容性
# 在python2中map直接返回列表, 但在python3中返回迭代器
# 因此为了兼容python3, 需要list转换⼀下
# Output:
# [0, 0]
# [1, 2]
# [4, 4]
# [9, 6]
# [16, 8]
View Code

 

reduce合并

from functools import reduce

    -每次从可迭代对象中获取两个值进行合并,并且可以设置初始值    
    -语法:reduce(lambda x, y: x + y, range(1, 101), 0)
    
# 需求: 求1——100的和
res = reduce(lambda x, y: x + y, range(1, 101), 1000)
print(res)  # 6050

 

filter过滤

语法:filter(函数地址,可迭代对象)
      filter_obj = filter(lambda x: x, name_list)
      filter会将可迭代对象中的值遍历取出,然后通过判断,把条件成立 “过滤获取”出来的值添加到 filter对象中
    
name_list = ['egon_dsb', 'jason_dsb','sean_dsb', 'tank']    
filter_obj = filter(lambda name: name.endswith('_dsb'), name_list)  #filter_obj是一个filter对象
print(filter_obj)   #<filter object at 0x0000016CC5A5ED48>
print(list(filter_obj))  #转成列表
# print(tuple(filter_obj))  #['egon_dsb', 'jason_dsb', 'sean_dsb']

 zip

zip(*Iterables),zip接受多个可迭代对象

列表并⾏排序
data = zip(list1, list2)
data.sort()
list1, list2 = map(lambda t: list(t), zip(*data))


解压列表
a=[1,2,3,4]
b=[7,8,9,0]
zipped=zip[a,b]
list[zipped]
a2,b2=zip(*zip(a,b))           
print(a==list(a2) and b==list(b2))

注:zip(a,b)是一个可迭代对象
*迭代器结果为(1,7)(2,8)(3,9)(4,0)  #打印时没有逗号,其实本质上是一样的
zip(*zip(a,b))等价于zip((1,7),(2,8),(3,9),(4,0))

xxx(*Iterables)的接受参数理解:

接受多个可迭代对象,

迭代器打散后为可以是多个普通元素,也可以是多个可迭代对象

 

posted @ 2020-09-14 16:52  繁星春水  阅读(120)  评论(0编辑  收藏  举报
1 //2 3
//4