1 lamda匿名函数
目的:为了解决一些简单的需求而设计的一句话函数,所有的匿名函数的函数名都是lamda
语法:
函数名 = lambda 参数: 返回值
注意:
(1)函数的参数可以有多个. 多个参数之间用逗号隔开
(2). 匿名函数不管多复杂. 只能写一⾏, 且逻辑结束后直接返回数据
(3). 返回值和正常的函数一样, 可以是任意数据类型

案例:
a = lambda a,b: max(a,b) print(a(2,5)) print(a.__name__) #<lambda>
坑:

->正确的方式yi = lambda x,y:(x,y)
补充:
匿名函数可以用在类里面:
案例:
1 class Foo: 2 v= lambda self,x : x+1 3 4 obj = Foo() 5 print(obj.v(1)) #2 6 7 # ---->相当于 8 class Foo: 9 def v(self,x): 10 return x+1 11 obj = Foo() 12 print(obj.v(1)) #2
2 递归--->自己调用自己
在函数中调用函数本身. 就是递归
递归的深度:自己调用自己的次数,官方文档中递归最大深度是1000,不到1000就会给你报错
案例:
1 import os 2 def func(filepath,n): 3 #1:打开这个文件夹 4 files=os.listdir(filepath) 5 #2:拿到每一个文件名 6 for file in files: 7 #3获取到路径 8 f_d=os.path.join(filepath,file) #文件的绝对路径 9 #4判断是否是文件夹 10 if os.path.isdir(f_d): 11 #5:如果是文件夹,继续在递归 12 print("\t"*n ,file,":") 13 func(f_d,n+1) 14 else: 15 print("\t"*n,file) 16 17 func("d:",0)
3 二分查找
掐头去尾取中间. 一次砍一半
前提:必须是有序序列
案例:
1 #二分查找法 2 lst = [22,44,55,66,78] #必须是有序的 3 n= 78 4 left =0 5 right=len(lst)-1 6 while left <= right: 7 mid = (left + right) // 2 8 if lst[mid] > n : 9 right = mid -1 10 if lst[mid] < n : 11 left = mid+1 12 if lst[mid] == n : 13 print("找到了,在这个位置",mid) 14 break 15 else: 16 print("没有找到")
牛逼算法:----》时间复杂度:o(1)
lst1=[5,6,7,8,9] lst2=[0,0,0,0,0,0,0,0,0,0] for el in lst1: lst2[el]=1 print(lst2[5]) #结果:1
--->思想:想要找到一个列表中的数,把一个列表中最大的数,若是9,那么就新建一个列表长度10,若列表1的某个数存在,就把列表2中对应的位置标1,这样查询的时间复杂度位o(1),但缺点索引不能找到
【补充】:
1:递归算法求阶乘
1 li=int(input("请您输入求阶乘的数:")) 2 fa=1 3 def factorial(n): 4 if n >1: 5 global fa 6 fa = fa*n * (n-1) 7 n=n-2 8 factorial(n) 9 return fa 10 print(factorial(li))
1 法2: 2 li=int(input("请您输入求阶乘的数:")) 3 fn=1 4 while 1: 5 fn = fn * li 6 li -= 1 7 if li == 0: 8 break 9 print(fn)
2:斐波那契数列0、1、1、2、3、5、8、13、21
需求:形成斐波那契数列,并找到想要找的数的位置
1 li=[0,1] #斐波那契数列 2 a=0 #斐波那契数列的索引 3 b=1 #斐波那契数列的索引 4 def su(n): #递归形成斐波那契数列 5 global a,b 6 while b < n-1: 7 li.append(li[a]+li[b]) 8 a += 1 9 b += 1 10 su(n) 11 return li 12 13 def maxi(n,s): #计算不超过某个数的最大的位置在斐波那契数列的什么位置 14 if n[len(n)-1] > s: #参数n:斐波那契数列;s:要比较的数 15 for i in range(len(n)): 16 if n[i]>s: 17 return i-1 18 else: 19 return -1 20 21 co=int(input("您要多少位:")) #需要形成多少位的斐波那契数列 22 su(co) #调用形成斐波那契数列 23 print("%s位形成的斐波那契数列是:"%li) 24 m=int(input("请您输入不超过哪个数,我们会帮您找位置")) 25 c=maxi(li,m) 26 if c != -1: 27 print("不大于%s的最大值是第%s个数"%(m,maxi(li,m))) 28 else : 29 print(c)
浙公网安备 33010602011771号