简说匿名函数与递归

递归

递归的两个条件:

  1. 一个函数在函数本身调用了函数自己
  2. 设置了正确的返回条件

 因为函数的每次调用的时候都需要进行压栈,弹栈,保存和恢复寄存器的栈的操作,所以递归是非常消耗时间和空间的

 

递归的应用,用于遍历文件系统 的所有的文件

import os
count = 0#为了打印出来的东西好看而使用的
def gg(path,ceng):
    lst =os.listdir(path)#打开文件夹,并列出该文件夹中所有的文件名和目录----以列表的形式进行返回
    # print(lst)
    for i in lst:
        File_path = os.path.join(path,i)#将文件的路径与文件名进行拼接,形成绝路径
        if os.path.isdir(File_path):#通过判断文件的绝对路径确定该文件是否是文件夹,如果是Ture,则递归执行函数,一层层往下找,直到是文件为止            
            print('\t'*ceng,i,sep = '')
            gg(File_path,ceng+1)
        else:
            print(i)#如果判断不是目录的话,直接将该文件的名称进行打印
gg('E:/a',count)
#

 

匿名函数:

是为了解决一些简单的函数的需求而设置的一句话的函数,函数的参数可以有多个,多个参数之间使用’,’进行分隔,

 

基本形式

lambda  参数:表达式(返回值)

eg:     lambda x,y : x+y

 :号前面的相当于函数的形式参数,

使用的方法

 panzhenwei(变量) = lambda x,y:x+y

调用的格式与基本的函数相同

 panzhenwei(11,22)

 

info = [{“name”:panzhenwei ,”age”:18},{“name”:chenweixian,“age”:19}]

列表中字典的排序

info.sort(key = lamba x:x[‘name’])   以名字进行排序

 

二分查找

普通的方式实现

lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]
n = int(input("请输入一个数字n:")) # 56
left = 0 # 左边界
right = len(lst) - 1 # 末尾的索引  右边界
while left <= right: # 当左边界大于右边界结束循环
    mid = (left + right) // 2 # 求中间的索引坐标
    if n < lst[mid]: # 判断你的数字和中间数的大小比较 .
        right = mid - 1 #  右边界往左移动
    elif n > lst[mid]:
        left = mid + 1 # 左边界往右移动
    else:
        print("找到了") # 找到了目标数字
        break
else: # 当左比右大, 循环结束. 没有找到目标数
    print("没找到"

 

通过递归的方式实现

lis = [2,3,4,6,90,55,4,433,22]

def Search(lis,gg,Left,Right):
    if Left > Right:
        return False
    Mid = (Left+Right)//2
    if gg < lis[Mid]:
        Right = Mid-1
        return Search(lis,gg,Left,Right)# #当递归有返回值的时候. 需要写return. 否则有可能接收不到返回值
    elif gg >lis[Mid]:
        Left = Mid+1
        return Search(lis, gg, Left, Right)
    else:
        print('找到了')
        return True

gg = int(input('请输入一个数字:'))
Left = 0
Right = len(lis)-1
bb  = Search(lis,gg,Left,Right)
print(bb)

 

posted @ 2018-11-05 20:24  好大一个圈  阅读(171)  评论(0编辑  收藏  举报