匿名函数
当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
lambda 参数列表:函数体
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
#比如要实现两个数x,y相加,普通函数的实现
def add(x,y):
return x+y
add(3,4)
out:7
#用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
add_lambda = lambda x,y:x+y
add_lambda(3,4)
out:7
三元运算法
#Python的三元运算符跟其他语言不太一样,Python的实现如下:
condition = True
print(1 if condition else 2)
out:1
condition = False
print(1 if condition else 2)
out:2
map函数的应用
map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
第二个参数是*iterables(可迭代对象,是一个list),所以可以接收多个list对象,供给函数使用
举例说明,map就是输入多少个,返回也是多少个数据,只是中间经过函数的一些算法和数据结构的操作,内容变化了,大概的架构如下图所示:
image.png
list1 = [1,2,3,4,5]
r = map(lambda x:x*x,list1)
print(r)
#map转换出来的是map对象,需要进行强转list
print(list(r))
out:[1, 4, 9, 16, 25]
r = map(lambda x,y:x*x+y*y,list1,list1)
print(list(r))
out:[2, 8, 18, 32, 50]
filter过滤器
和map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
list2 = [' ','','35', 'aaa','hahh',None]
r = filter(lambda x:x if x and len(x.strip())>0 else 0,list2)
print(list(r))
out:['35', 'aaa', 'hahh']
#也可以这样实现
list2 = [' ','','35', 'aaa','hahh',None]
def is_not_empty(x):
return x and len(x.strip())>0
f = filter(is_not_empty,list2)
list(f)
out:['35', 'aaa', 'hahh']
reduce函数应用
reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
其大概架构如下图所示:
image.png
代码如何实现呢:
from _functools import reduce
list1 = [1,2,3,4,5]
r = reduce(lambda x,y:x+y,list1)
print(r)
out:15
#也可以有初始值,下面的初始值为10,所以最后计算的值是25
from _functools import reduce
list1 = [1,2,3,4,5]
r = reduce(lambda x,y:x+y,list1,10)
print(r)
out:25
Python的三大推导式
根据已有的列表推导出新的列表.
#其实map也可以实现的,但是根据上面map的结果可知,打印出来的结果是map格式的,需要进行强转,所以不方便
list1 = [1,2,3,4,5,6]
f = map(lambda x:x+x,list1)
print(list(f))
list2 = [i+i for i in list1]
print(list2)
#所以列表解析式更方便啦
#有选择性的筛选
list3 = [i+i for i in list1 if i>3]
print(list3)
out:
[2, 4, 6, 8, 10, 12]
[2, 4, 6, 8, 10, 12]
[8, 10, 12]
集合推导式
list2 = {i+i for i in list1}
print(list2)
#所以列表解析式更方便啦
#有选择性的筛选
list3 = {i+i for i in list1 if i>3}
list3
out:
{2, 4, 6, 8, 10, 12}
{8, 10, 12}
字典推导式
#字典推导式个前面两个(集合和列表推导式有点不太一样,该获取数据需要.items())
s = {
'name':'zhangsan',
'age':25,
}
#拿出所有的key,并变成列表
a_key = [key for key,value in s.items()]
print(a_key)
#key 和 value颠倒
a1 = {value:key for key,value in s.items()}
print(a1)
#只拿出符合条件的值
a2 = {value:key for key,value in s.items() if key=="name" }
print(a2)
out:
['name', 'age']
{'zhangsan': 'name', 25: 'age'}
{'zhangsan': 'name'}
网友评论