python函数终章,递归、匿名函数和部分内置函数

函数递归

什么是函数递归:函数递归调用是一种特殊的函数嵌套调用,在调用一个函数的过程中,又间接或直接的调用了该函数本身

递归必须要有两个明确的阶段:

    递推:一层一层递归调用下去,每进入下一层递归问题的规模必须有所减少

    回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推,进行一层一层回溯

    递归的精髓在于通过不断的重复逼近一个最终的结果

理论上来说递归能做的事情,循环都能够完成,那么为什么还要有递归这种机制呢,看了下面的例子有可能会使我们清晰点了。

例:在嵌套多层的列表中取出每一层列表中的值

l = [1,[2,[3,[4,[5,[7,[9,[8,[10,]]]]]]]]]

def tell(l):

    for item in l :

        if type(item) is list:

            tell(item)#继续进入下一层递归

        else:

            print(item)

tell(l)

用递归实现二分查找(我们假设有一个从小到达排序好的列表,而且我们不知道 in 方法)

nums = [1, 3, 7, 11, 13, 22, 34, 55, 68, 99,123, 146, 155, 173, 189, 222, 235, 250, 265, 362, 456]

def search(search_num, nums):

    print(nums)

    if len(nums) == 0:

        print('not exists')

        return

    mid_index = len(nums) // 2

    if search_num > nums[mid_index]:

        nums = nums[mid_index+1 : ] #被找的数处于二分之后列表中的右侧

        search(search_num, nums)

    elif search_num < nums[mid_index]:

        nums = nums[: mid_index]   #被找的数处于二分之后列表中的左侧

        search(search_num, nums)

    else:

        print('find it')

search(43, nums)

匿名函数

我们之前所用过的所有函数都是有名字的函数,那么什么叫匿名函数呢

我们将没有绑定名字,用一次之后内存地址被回收掉的函数称之为匿名(lambda)函数,该函数可以快速生成函数对象,语法不是很难,如下:

res = (lambda x, y: x+y) (1, 2)

print(res)

也可以把匿名函数赋值给一个变量来绑定关系,但这样就失去了匿名函数的意义了

f = lambda x, y:  x+y

print(f)

prinr(f(1, 2))

常用内置函数

max , min, map, filter, sorted

max, min函数

我们有一个字典如下,我们需要拿到value中最大值和最小值对应的人名:

salaries = {'ming': 5000, 'tom':8700, 'alex':5600, 'egon':6355}

print(max(salaries, key = lambda k: salaries[k]))

print(min(salaries, key = lambda k: salaries[k]))

sorted函数

l = [10, 3, 8, 7, 12, 15, 2]

l1 = sorted(l, reverse = False) #用sorted排序将 l 列表中的元素从小到大排列

print(l1)

l1 = sorted(l, reverse = True) #用sorted排序将l 列表中的元素从大到小排列 

print(l2)

map函数

name = ['ming', 'egon', 'tom', 'tony']

lst = map(lambda x: x+'aa', names) #在每个人名后面加上'aa'字符

print(list(lst)) #map函数将可迭代对象变成了迭代器对象,所以我们转换成列表

filter函数

names = ['min', 'egon', 'alex', 'xiaoxiao']

name_n = filter(lambda x: x.endswith('n'), names)# 将以'n'结尾的人名过滤掉

print(name_n)

print(list(name_n))filter 得到的是一个迭代器对象,我们转换成字符来看结果


猜你喜欢

转载自blog.csdn.net/zhou_le/article/details/80692362