python葵花宝典第15式-匿名函数、内置函数、映射函数
15.1 lambda函数(匿名函数)
匿名函数并不是没有函数名字
注意:
(1)函数的参数可以有多个,多个参数之间用逗号隔开
(2)匿名函数不管有多复杂,只能写一行,且逻辑结束后直接返回数据
(3)返回值和正常的函数一样,可以使任意数据类型
(4)Lambda表示匿名函数,不需要def进行生命,一句话就可以生声明一个函数
语法:lambda 参数:返回值
第一招
#匿名函数
a = lambda n : n*n
ret = a(9)
print(ret)
相当于:
#普通函数
def func(n):
return n * n
ret = func(9)
print(ret)
第二招(面试题)
t = lambda x,y : (x,y)
print(t(2,2))
15.2 sorted函数
(1)语法: sorted(list_name,key=function_name,reserve=False)
(2)key:排序方案,sorted函数内部会把可迭代对象中的每一个元素拿出来交给后面的key,后面的key计算出一个数字,作为当前这个元素的权重
(3)reserve:Ture反向排序,False正向排序
第三招
lst = ["王俊凯","易烊千玺","文章","赵四","李晓凡"]
def func(s):
return len(s)
print(sorted(lst,key=func))
第四招
lst = [{"name":"李晓凡","age":23},
{"name":"崔月红","age":24},
{"name":"柳博文","age":18},
{"name":"堡垒","age":25}]
print(sorted(lst,key=lambda el:el["age"],reverse=True))
15.3 filter筛选器
语法:filter(function,Iterable)
function:用来筛选的函数。在filter中会自动的将iterable中的元素传递给function.然后根据function返回的True或者False来判断是否保存此项数据
Iterable:可迭代对象
第五招
#filter筛选器
lst = ["文波","彭珍","鲍烈","李晓凡","崔月红","陈凤"]
#筛选
f = filter(lambda el : el[0] != "李",lst)
#将lst中的每一项传递给fun,所有返回Ture的都会保留,所有返回False都会过滤掉
print("__iter__" in dir(f))#判断filter是否可迭代
for e in f:
print(e)
相当于:
lst = ["文波","彭珍","鲍烈","李晓凡","崔月红","陈凤"]
def fun(el):
if el[0] == "李":
return False#舍弃的
else:
return True#保留的
f = filter(fun,lst)
#将lst中的每一项传递给fun,所有返回Ture的都会保留,所有返回False都会过滤掉
print("__iter__" in dir(f))#判断filter是否可迭代
for e in f:
print(e)
结果:
True
文波
彭珍
鲍烈
崔月红
陈凤
第七招
lst = [
{"name":"文波","age":26},
{"name":"彭珍","age":26},
{"name":"赵舜","age":24},
{"name":"陈凤","age":24},
{"name":"晓凡","age":23}
]
f = filter(lambda el: el["age"] > 24,lst)
print(list(f))
15.4 map()映射函数
语法:map(function,iterable)可以对可迭代对象中的每一个元素进行映射,分别取执行function
第八招
#map映射函数
lst = [1,4,7,2,5,8]
def fun(el):
return el**2
m = map(fun,lst)#把后面的可迭代对象中的每一个元素传递给function,结果就是function的返回值
print("__iter__" in lst)
print(list(m))
相当于:
lst = [1,4,7,2,5,8]
lst2 = []
#计算每个数字的平方
for el in lst:
lst2.append(el**2)
print(lst2)
结果:
False
[1, 16, 49, 4, 25, 64]
第九招(计算两个列表中相同位置的数据的和
)
lst1 = [1,2,3,4,5]
lst2 = [2,4,6,8,10]
print(list(map(lambda x,y: x+y, lst1, lst2)))
15.5 递归
第十招
#递归函数,自己调用自己
def fun():
print("文波很帅")
fun()
fun()
注意:递归深度,你可以自己调用自己的次数,官方文档最大深度为1000,在这之前会进行报错
第十一招(进行文件目录的遍历)
#遍历文件夹,打印所有的文件和文件夹
import os
def fun(filepath,n):
#1、打开文件夹
files = os.listdir(filepath)#查看当前目录中的文件
#2、拿到每一个文件名
for file in files:#获取文件名
#3、获取到文件的路径
file_p = os.path.join(filepath,file)
#4、判断是否是文件夹
if os.path.isdir(file_p):
#5、如果是文件夹,继续调用程序
print("\t"*n,file)
fun(file_p,n+1)
else:
#5、如果不是文件夹,直接打印文件
print("\t"*n,file)
fun("f:/python学习视频",0)
15.6 二分查找
(1)使用二分法可以提高效率
(2)只可用于有序列表
第十二招(普通循环)
lst = [11, 12, 22, 32, 33, 38, 45, 67, 83, 89, 90, 99]
n = 89
left = 0
right = len(lst) - 1
while left <= right:#边界,当右边小于左边时退出循环
mid = (left + right)//2#必须是整除
if lst[mid] > n:
right = mid - 1
if lst[mid] < n:
left = mid + 1
if lst[mid] == n:
print("找到了这个数")
break
else:
print("对不起,没有找到这个数")
第十三招(递归循环)
递归形式的二分法
lst = [11, 12, 22, 32, 33, 38, 45, 67, 83, 89, 90, 99]
def fun(n,left,right):
if left <= right:
mid = (left + right)//2
if n > lst[mid]:
left = mid + 1
return fun(n,left,right)
elif n < lst[mid]:
right = mid - 1
return fun(n,left,right)
elif n == lst[mid]:
print("找到这个数了")
return mid
else:
print("没有找到这个数")
return -1#一般的索引为+,什么都不返回则是None
#寻找33,从左至右进行查找
func = fun(33,0,len(lst)-1)
print(func)
结果:
找到这个数了
4
本期学习到此结束,欢迎关注批评指正!