python-day15-匿名函数,二分查找

---恢复内容开始---

一.lamda匿名函数:

语法:函数名 = lambda 参数:返回值

def func(n):
    return n*n
print(func(10))

f = lambda n:n*n  #匿名函数
print(f(10))

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

注意:

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

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

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

ps:__name__ 查看函数名:

def func(n):
    return n*n
a = func
print(a(5))
print(a.__name__)
结果:25
    func  #函数的函数名是func

f = lambda n :n*n
print(f(5))
print(f.__name__)
结果:25
    <lambda> #函数的函数名   

匿名函数其实是有名字,只是所有的函数名是lambda

二.sorted()

  排序函数

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

   Iterable:可迭代对象

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

   reverse:是否是倒叙,True:倒叙,False:正序 不写默认False

lst = [4,7,2,88,34,28,33,1]
lst1 = sorted(lst)
print(lst) #原列表不会变
print(lst1) #返回的新列表是经过排序的

  和函数组合使用,自己定义规则

lst = ["大阳哥a", "尼古拉斯aa", "赵四aaa", "刘能a", "广坤aaaaaa", "谢大脚a"]
def func(s):
    return s.count('a') #返回数字  根据a的个数排序
ls = sorted(lst,key = func)
print(ls)

  和lambda组合使用

lst = ["大阳哥a", "尼古拉斯aa", "赵四aaa", "刘能a", "广坤aaaaaa", "谢大脚a"]
ls = sorted(lst,key = lambda s:s.count('a'))
print(ls)
lst = [
        {'id':1, 'name':'alex', 'age':18},
        {'id':2, 'name':'taibai', 'age':58},
        {'id':3, 'name':'wusir', 'age':38},
        {'id':4, 'name':'ritian', 'age':48},
        {'id':5, 'name':'女神', 'age':18}
       ]

ls = sorted(lst,key=lambda dic:dic['age'],reverse = True)
print(ls)
例2

三.filter()

  筛选函数

  语法:filter(function,Iterable)

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

    Iterable:可迭代对象

lst = [1,2,3,4,5,6,7,8,9]
ls = filter(lambda a:a%2==0,lst) #出来的ls是迭代器, 筛选左右的偶数
print(list(ls)) #筛选出来的元素放到列表里
结果:[2, 4, 6, 8]
print('__iter__'in dir(ls)) #True
print('__next__'in dir(ls)) #True
lst = [
        {'id':1, 'name':'alex', 'age':18},
        {'id':2, 'name':'taibai', 'age':58},
        {'id':3, 'name':'wusir', 'age':38},
        {'id':4, 'name':'ritian', 'age':48},
        {'id':5, 'name':'女神', 'age':18}
       ]
ls = filter(lambda dic:dic['age']>40,lst)
print(list(ls))
结果:[{'age': 58, 'name': 'taibai', 'id': 2}, {'age': 48, 'name': 'ritian', 'id': 4}]
筛选年龄大于40的人

四.map()

  映射函数

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

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

lst = [1,3,4,5,6,7]
print(list(map(lambda n:n*n,lst))) #lst可以用切片分割,一块一块执行(用于大量数据时)
结果:[1, 9, 16, 25, 36, 49]
lst1 = [ 1, 2, 3, 4, 5]
lst2 = [ 2, 4, 6, 8]
print(list(map(lambda x, y:x+y, lst1, lst2))) # 如果函数中有多个参数. 后面对应的列表要一一对应

五.递归:

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

def func()
    print('我是谁')
    func()
func()

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

递归是应用:

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

import os
filePath = 'E:\python-practice'
def read(filePath,n):
    it = os.listdir(filePath) #获取到当前文件夹中的所有文件
    for el in it:#遍历文件夹中的文件,这里获取的只是本层文件名
        fp = os.path.join(filePath,el)  #加入文件夹,获取到文件夹+文件
        if os.path.isdir(fp):#如果该路径下的文件时文件夹
            print('\t'*n,el)
            read(fp,n+1) #继续进行相同的操作
        else:
            print('\t'*n,el) #递归出口,最终在这里隐含着return
read(filePath,0)

六.二分查找

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

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

# 判断n是否在lst中出现. 如果出现请返回n所在的位置
# 二分查找---非递归算法
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]
left = 0
right = len(lst)-1
n  = int(input('数:'))
count =1
while left <right: middle = (left + right)//2 if n < lst[middle]: right = middle-1 elif n>lst[middle]: left = middle+1 else:
     print(count)
print(middle) break
  count +=1
else: print('没有')
#用普通递归二分法
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]
def func(n,left,right):
    if left <= right:
        middle = (left + right) // 2
        if n < lst[middle]:
            right = middle-1
        elif n>lst[middle]:
            left = middle+1
        else:
            return middle
        return func(n,left,right)
    else:
        return -1
print(func(44,0,len(lst)-1))
另类二分法,很难计算位置
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]
def func(lst,n):
    left = 0
    right = len(lst)-1
    middle = (left + right) // 2
    if right<=0:
        print('没有')
        return
    if n < lst[middle]:
        lst = lst[:middle]
    elif n > lst[middle]:
        lst = lst[middle+1:]
    else:
        print('在这里')
        return
    func(lst, n)
func(lst,77)

猜你喜欢

转载自www.cnblogs.com/ITdong-1/p/9349686.html
今日推荐