lambda匿名函数,sorted(),filter(),map(),递归函数

1.lambda匿名函数

  为了解决一些简单的需求而设计的一句话函数

1 #计算n的n次方
2 def func(n):
3     return n**n
4 print(func(10))
5 
6 
7 f = lambda n: n**n
8 print(f(10))

lambda表示的是匿名函数,不需要用def来声明,一句话就可以声明出一个函数

语法:

  函数名= lambda 参数:返回值

注意:

  1.函数的参数可以有多个,多个参数之间用逗号隔开

  2.匿名函数不管多复杂,只能写一行,且逻辑结束后直接返回数据

  3.返回值和正常的函数一样,可以是人忆数据类型


匿名函数并不是说一定没有名字,这里前面的变量就是一个函数名,说他是匿名原因是我们通过__name__查看的时候是没有名字的,统一都叫lambda,在调用的时候没有什么特别之处,像正常的函数调用即可.

2.sorted()

排序函数,返回一个新列表

语法: sorted(iterable,key=None,reverse=False)

  iterable:可迭代对象

  key:排序规则(排序函数),在sorted()内部会将可迭代对象中的每一个元素传递给这个函数的参数,根据函数运算结果进行排序

  reverse:是否是倒叙.True:倒叙,False:正序

1 lst = [1,5,3,4,6]
2 lst2 = sorted(lst)
3 print(lst)        #原列表不会改变
4 print(lst2)      #返回的新列表是经过排序的
5 
6 dic = {1:"A",3:"C",2:"B"}
7 print(sorted(dic))    #如果是字典,则返回排序过后的key

和函数组合使用:

1 #根据字符串长度进行排序
2 lst = ["麻花藤","冈本次郎","中央情报局","狐仙"]
3 
4 #计算字符串长度
5 def func(s):
6     return len(s)
7 print(sorted(lst,key=func))

和lambda组合使用:

 1 #根据字符串长度进行排序
 2 lst = ["麻花藤","冈本次郎","中央情报局","狐仙"]
 3 
 4 #计算字符串长度
 5 def func(s):
 6     return len(s)
 7 print(sorted(lst,key=lambda s:len(s)))
 8 
 9 lst = [{"id":1,"name":'alex',"age":18},
10          {"id":2,"name":'wusir',"age":16} ,
11          {"id":3,"name":'taibai',"age":17}]
12 
13 #按照年龄对学生信息进行排序
14 print(sorted(lst,key=lambda e:e['age']))

3.filter()

  筛选函数,返回一个迭代器

   语法:filter(function,iterable)

    function:用来筛选的函数.在filter中会自动的把iterable中的元素传递给function.然后根据function返回的True或者False来判断是否保留此项数据

    iterable:可迭代对象

 1 lst = [1,2,3,4,5,6,7]
 2 l1 = filter(lambda x:x%2==0,lst)#筛选所有的偶数
 3 print(l1)
 4 print(list(l1))
 5 
 6 lst = [{"id":1,"name":'alex',"age":18},
 7          {"id":1,"name":'alex',"age":18},
 8          {"id":1,"name":'alex',"age":18}
 9 ]    
10 fl = filter(ambda e:e['age']>16,lst)#筛选年龄大于16的数据
11 print(list(fl))

4.map()

映射函数,返回一个迭代器

语法:map(function,iterable)可以对可迭代对象的每一个元素进行映射,分别去执行function

  计算列表中每个元素的平方,返回新列表

1 def func(e):
2     return e*e
3 mp = map(func,[1,2,3,4,5])
4 print(mp)
5 print(list(map))

改写成lambda

print(list(map(lambda x:x*x,[1,2,3,4,5])))

计算两个列表中相同位置的数据的和

1 lst1 = [1,2,3,4,5]
2 lst2 = [2,4,6,8,10]
3 print(list(map(lambda x,y:x+y,lst1,lst2)))

5.递归

  在函数中调用函数本身,就是递归

1 def func():
2     print("我是谁")
3     func()
4 func()

在python中递归的深度最大到998

1 def foo(n):
2     print(n)
3     n += 1
4     foo(n)
5 foo(1)

递归的应用:

  我们可以使用递归来遍历各种树形结构,比如我们的文件夹系统,可以使用递归来遍历该文件夹中的所有文件

  

 1 import os
 2 
 3 def read(filepath ,n):
 4     files = os.listdir(filepath)#获取到当前文件夹中的所有文件
 5     for fi in files:#遍历文件夹中的文件,这里获取的只是本层文件名
 6         fi_d = os.path.join(filepath,fi)#加入文件夹,获取到文件夹+文件
 7         if os.path.isdir(fi_d):#如果该路径下的文件是文件夹
 8             print("\t"*n,fi)
 9             read(fi_d,n+1)#继续进行相同的操作
10         else:
11             print("\t"*n,fi)#递归出口,最终在这里隐含着return
12 
13 #递归遍历目录下所有文件
14 read("d:/",0)

6.二分查找

  二分查找每次能够排除掉一半的数据,查找的效率非常高,但是局限性比较大,必须是有序序列才可以使用二分查找

  要求:查找的序列必须是有序序列

 1 #判断n是否在lst中出现,如果出现请返回n所在的位置
 2 #二分查找-----非递归算法
 3 lst = [22,33,44,55,66,77,88,99,101,238,345,456,567,678,789]
 4 n = 567
 5 left = 0
 6 right = len(lst)-1
 7 count = 1
 8 while left <= right:
 9     middle = (left + right) // 2
10     if n < lst[middle]:
11         right = middle - 1
12     elif n > lst[iddle]:
13         left = middle + 1
14     else:
15         print(count)
16         print(middle)
17         break
18     count += 1
19 else:
20     print("不存在")

#普通递归版本二分法

  每次左边加1,右边减1

 1 def func(n,left,right):
 2     if left <= right:
 3         middle = (left + right) // 2
 4         if n < let[middle]:
 5             right = middle -1
 6         elif n > lst[middle]:
 7             left = middle + 1
 8         else:
 9             return middle
10         return func(n,left,right)#这个return必须要加,不然接收到的永远是None
11     else:
12         return -1
13 print(func(567,0,len(lst)-1))

#另类二分法,很难计算位置

  每次从左边到中间或者从中间到右边分

 1 def func(lst,target):
 2     left = 0
 3     right = len(lst)-1
 4     if left > right:
 5         print("不在这里")
 6     middle = (left + right) // 2
 7     if target < lst[middle]:
 8         return func(lst[:middle],target)
 9     elif target > lst[middle]:
10         return func(lst[middle+:],target)
11     else:
12         print("在这里")
13 func(lst,567)

猜你喜欢

转载自www.cnblogs.com/s593941/p/9483587.html