函数递归 三元表达式 匿名函数 函数内置方法

递归函数

定义:任何函数在调用自己的情况下 就叫递归  函数在调用的时候可以直接性或者间接性的调用自己.但是他不能无限制的调用下去 也不应该无限制的调用下去

递归分为两个阶段,递推和 回溯 (回溯就像while循环一样一直重复下去 但是每一次重复 都要建立在上一次循环的基础上 减小目标难度)

                                                                  递归的递推:递归每一次都是基于上一次进行下一次的执行。

                                                                  递归的回溯:当遇到终止条件,则从最后往回一级一级的把值返回来。

                                                                  递归函数调一般 用自身去解决一个规模比原始问题要小一些的问题。

    一个简单的递归 因为说过函数不能无限的递归小下去 所以 他的范围在 997-998之间

下面是一个回溯和递推的展示:

def age(n):
    if n == 1:
        return 18
    return age(n-1) + 2
print(age(5))

#age(5) = age(4) +2    第一次进入

#age(4) = age(3) +2    第二次进入

#age(3) = age(2) +2    第三次进入

#age(2) = age(1) +2    第四次进入

#age(1) = 18          第五次进入,此时达到结束的条件,递归终止

这是一个典型的递归递推算法,它的每一次执行都是基于上一次的结果。

总结:递归必须要有一个明确的结束条件, 否则就变成死循环导致栈溢出,以上两例都是以“if”语句作为结束条件的。每递归一次要解决一些事情,否则就失去了递归的意义。

算法之二分算法:什么是算法 算法就是一个可以提高解决问题效率的方法 

        二分算的就是 快速寻找你想在一个容器类型里寻找的值 容器里面必须有大小顺序 假如你想寻找一个列表里的值 可以使用for循环的遍历来实现 但是效率太慢

就好比说我想在一个 有10000个数字的列表里找最后一个数字 那么就需要循环10000次 这样就需要用到二分算法

l = [1,3,5,12,57,89,101,123,146,167,179,189,345]

target_num = 666

def get_num(l,target_num):
    if not l:
        print('不在数字内')
        return
    # 获取列表中间的索引
    print(l)
    middle_index = len(l) // 2
    # 判断target_num跟middle_index对应的数字的大小
    if target_num > l[middle_index]:
        # 切取列表右半部分
        num_right = l[middle_index + 1:]
        # 再递归调用get_num函数
        get_num(num_right,target_num)
    elif target_num < l[middle_index]:
        # 切取列表左半部分
        num_left = l[0:middle_index]
        # 再递归调用get_num函数
        get_num(num_left, target_num)
    else:
        print('find it',target_num)

get_num(l,target_num)

三元表达式 其实就是把很简单的逻辑判断 不值得写那么多行的if else 简化成一行  固定表达方式 :

三元表达式固定表达式
    值1 if 条件 else 值2
        条件成立 值1
        条件不成立 值2

列表生成式:列表生成式作用是用来生成列表的,那么其特点也肯定是使用“[]”来去表示的 也是把简单的代码写成一行例子:

假如我们这里需要创建一个列表 和a列表对比 如果在a里面 我们打印他

他其实就相当于:

a=[1,2,5,7]
for b in list(range(1,10)):
    if b in a:
        print(b)

补充
# 先for循环依次取出列表里面的每一个元素
# 然后交由if判断 条件成立才会交给for前面的代码
# 如果条件不成立 当前的元素 直接舍弃

同样 集合也可以这样使用:

res = {i for i in range(10) if i != 4}
print(res)

但是使用()号的话返回的不是元组 而是一个地址 叫生成器 需要用for循环来打印

res1 = (i for i in range(10) if i != 4)  # 这样写不是元组生成式 而是生成

print(res1)
for i in res1:
    print(i)

字典也可以这样使用:

l1 = ['name','password','hobby']

d = {i:j for i,j in enumerate(l1) if j != '123'}

返回的是一个字典 {index:他的一个值}

匿名函数:没有名字的函数 主要起到临时存在.用lambda  

func = lambda x,y:x+y
print(func(1,2))

也可以直接传值
res = (lambda x,y:x+y)(1,2)
print(res)
# :左边的相当于函数的形参 # :右边的相当于函数的返回值 # 匿名函数通常不会单独使用,是配合内置函数一起使用

常用的内置函数

max() 求最大值 内部是基于for循环  min() 求最大值 内部是基于for循环

chr ()查看数字对应的 A-Z a-z

map() 映射 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回

zip 拉链 基于for循环 把两个 不同的列表 都一一对应的放在一个元组里面 最后打包成一个列表 元组个数取决于 最短的那个列表

stored() stored(列表 , reverse=True) 给列表排序 

from functools import reduce

from functools import reduce
l = [1,2,3,4,5,6]
print(reduce(lambda x,y:x+y,l,19))  # 19初始值  第一个参数
# 当初始值不存在的情况下 按照下面的规律
# 第一次先获取两个元素 相加
# 之后每次获取一个与上一次相加的结果再相加

 

posted @ 2019-07-13 02:05  LD_Dragon  阅读(286)  评论(0编辑  收藏  举报