诚意
诚意如你,当一诚的态度对待

导航

 

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)

 

posted on 2018-08-15 21:16  诚意  阅读(199)  评论(0)    收藏  举报