day14,匿名函数,排序,筛选,映射,递归,二分法

一:匿名函数。

  匿名函数语法:

     函数名= lambda  形参:返回值

    (1)例 :

a=lambda n:n**n
 r=a(3print(r)  结果为:27

 

    (2)例:写一个lambda 给函数传递两个参数, a, b 计算a+b的结果。

         

a=lamabda  m,n:m+n

 

    (3)例:写一个lambda 计算字符串长度并返回 # len()

         

a=lambda  s:len(s)

 

              匿名函数有名字,统一叫“lambda”

    注意!:匿名函数一般不会用来做复杂的操作。

二:sorted(排序函数)

  排序函数语法:

      sorted(iterable,key=none,reverse=false)

      lterable(可迭代对象)  key(排序规则) reverse(是否是倒叙,true:倒叙,false:正序)

     (1)例:

lst=[1,5,3,4,6]
lst2=sorted(lst)
print(lst)#原列表不会改变
print(lst2)#返回的新列表是经过排序的

dic={1:‘a’,3:‘c’,2:‘b’}
print(sorted(dic))  #如果是字典。则返回排序过后的key

     (2)例:函数和 lambda 组合使用

lst=[”饭岛振宇“,”火星情报局“,”神盾局特工3“,"樱井"]
#计算字符串长度
def func(s)
    return len(s)
print(sorted(lst,key=lambda s:len(s)))

     (3)l例:函数和 lambda 组合使用

lst = [{"id":1, "name":'alex', "age":18},      
 {"id":2, "name":'wusir', "age":16},       
{"id":3, "name":'taibai', "age":17}] 
#按照年龄对学生信息进行排序
print(sorted(lst,key=lambda e:e['age']))

三:filter()筛选函数:

  筛选函数语法:

    filter(function.lterable)

    function:用来筛选的函数,在filter中会自动的把iterable中的元素传递给function,然后根据function

               返回 的true或者 false来判断是否保留此项数据

    lterable:可迭代对象

    (1)例:

lst = [1,2,3,4,5,6,7]
le = filter(lambda x: %2==0,lst) #筛选所有的偶数
print(le)
print(list(le))

    (2)例:

lst = [{"id":1, "name":'alex', "age":18},       
        {"id":2, "name":'wusir', "age":16},      
        {"id":3, "name":'taibai', "age":17}]
fl=filter(lambda e: e['age'] > 16,lst) #筛选年龄大于16的数据
print(list(fl))            

四:map() 映射函数

  映射函数的语法:

  map(function,iterate)可以对可迭代对象中的每一个元素进行映射,分别取执行function

  (1)例:

#计算列表中的每个元素的平方,但会新的列表
def func(s)
    return s*s

mp = map(func,[1,2,3,4,5,6,])
print(mp)
print(list(mp))  
#改写成lambda
print(list(map(lamabda s:s*s,[1,2,3,4,5,6])))

  (2)例:

   

#计算两个列表中相同的数据的和
lst1 = [1, 2, 3, 4, 5] 
lst2 = [2, 4, 6, 8, 10]
print(list(map(lambda x,y:x+y,lst1,lst2)))

五:递归 

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

def func():
    print(”我是谁“)
    func()
func()
 #在python中递归的深度最大可以到1000,但结果都不回达到1000.
def foo(n):
    print(n)
    n+=1
    foo(n)
foo(1)

  递归的应用:

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

               所有文件。

import os

def func(path,ceng):
    lst = os.listdir(path) #获取到当前文件夹中的所有文件
    for el in lst:  #遍历文件夹中的文件,这里获取的只是本层文件名
        rp = os.p    ath.join(path,el) #加入文件夹 获取到文件夹+文件    
        if os.path.lisdic(rp):     #如果该路径下的文件是文件夹
            print("\t"*ceng,el,sep="")
            func(rp,ceng+1)      #继续进行相同的操作
        else:
            print("\t"*ceng,el,sep=")  #递归出口,最终在这里隐含着return

func(”e:\哈哈“,0)

六:二分查找

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

   使用二分查找。

   要求:查找的序列必须是有序序列   。总结:掐头去尾找中间

           例:

   # 判断n是否在lst中出现. 如果出现请返回n所在的位置

   # ⼆二分查找---⾮非递归算法 

   

lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789] 
n = int(input("请输入一个数字"))
laft = 0  #左边界
right = len(lst) - 1  # 末尾的索引,右边界
while lsft <= right:  # 当左边界大于右边界结束循环

    mid = (laft+right)// 2   #地板除以2  ,求中间的索引坐标
    if n < lst[mid]:   #判断你的数字和中间数大小的比较
    right = mid - 1    #右边界就往左边界移动
    elif n > lst[mid]:
    laft = mid + 1    #左边界往右边界移动+1
    elseprint("找到了")   #否则 就是找到目标  退出
        break
else#当左边比右边大,循环结束,没有找到目标数
    print(”没找到“)

       

# 递归函数写
lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]
def binary_search(lst,n,left,right):
    if left > right:
        ruturn Flase
    mid = (left+right) // 2
    if n > lst[mid]:
        left = mid + 1   #当递归有返回值的时候,需要写ruturn,否则有可能接收不到返回值
        return binary_search(lst,n,lsft,right)
    elif n < lst[mid]:
        right = mid - 1
        return binary_search(lst,n,left,right)
     else:
        print("找到了")
        return
n = int(input("请输入一个数字"))
ret = binary_search(lst,n,0, len(lst)- 1)
print(ret)

 

     

posted @ 2018-11-05 20:35  一碗窝子面  阅读(194)  评论(0编辑  收藏  举报