day、12不知名内容

时间:2021-10-17 20:30:42

今日内容

  • 递归函数

  • 二分法

  • 三元表达式

  • 列表生成式

  • 字典生成式

  • 匿名函数

  • 常用的内置函数

一、递归函数

1、什么是递归函数

所谓递归函数就是一个函数在其内部调用该函数,反复的调用下去,直到函数执行到不满足条件是停止调用并输出结果

2、递归函数的两个阶段

递归函数的执行可以分为两个阶段,分别为回溯和递推。

回溯:就是一次次的重复的过程,这个重复过程必须建立在每一次重复问题的复杂度都在降低,直到有一个最终的结束条件。

递推:一次次往回推到的过程。

3、递归函数的使用

递归函数在使用时不需要考虑循环的次数,只需要把握结束的条件即可。

递归函数如果没有结束条件,将会一直运行,python内部限制最高1000次,可以通过调用os模块修改递归层数。过多的递归层数对内存不是很友好,不建议修改限制。

def age(n):
    if n == 1:  # 必须要有结束条件n=1
        return 18
    return age(n-1) + 2
res = age(5)
print(res)  # 26
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]
def get_num(l):
    for i in l:
        if type(i) is int:
            print(i)
        else:
            get_num(i)

get_num(l)  # 循环打印l中的所有数字

二、算法之二分法

算法:虽未算法就是解决问题的高效率的方法

二分法:在已经排列好数字大小的有序容器中查找想要查找的数字

target_num = 666
l = [1,3,5,12,57,89,101,123,146,167,179,189,345]
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)

三、三元表达式

三元表达式:将流程控制代码写成表达式的形式用一个变量名接收返回值。

x = 99999
y = 9898898
res = x if x > y else y

# 如果if后面的条件成立返回if前面的值 否则返回else后面的值
print(res)  # 9898898

三元表达式的固定表达式形式为:

res = 值1 if 条件 else 值2  (条件成立 值1 条件不成立 值2)

三元表达式的也可以嵌套多层判断:

res = x if x > y else (m if m >n else (...))

取值的判断与单层取值一样。

四、列表生成式

列表生成式:将满足条件的值放在一个列表中,生成一个新列表。

基本形式:res = [满足添加到列表的元素 for 添加到列表的元素 in 容器类型的数据类型 if 条件判断]

l = ['tank_sb', 'nick_sb', 'oscar_sb', 

res = [name for name in l if name.endswith('_sb')]  # 后面不支持再加else的情况
# 先for循环依次取出列表里面的每一个元素
# 然后交由if判断  条件成立才会交给for前面的代码
# 如果条件不成立 当前的元素 直接舍弃

print(res)  # ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']

五、字典生成式

字典表达式:将满足条件的值组成键值对的形式放在一个字典中,生成一个新的列表。

基本形式:基本形式:res = {满足条件的元素组成的健值对 for i,j in 容器类型的数据类型 if 条件判断}

l1 = ['name','password','hobby']
l2 = ['jason','123','DBJ','egon']

d = {j:l2[i] for i,j in enumerate(l1)}
print(d)  # {'name': 'jason', 'password': '123', 'hobby': 'DBJ'}

六、匿名函数

通俗点讲匿名函数就是没有名字的函数,随调随用,用完就销毁,一个临时存在的函数。

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

匿名函数一般和内置函数一起使用

七、常用的内置函数

常用的内置函数由很多,包括print、input等等。今天主要讲了map、zip、filter、sorted、reduce。

# map zip filter sorted reduce

# map 映射
l = [1,2,3,4,5,6]

print(list(map(lambda x:x+5,l)))  # [6, 7, 8, 9, 10, 11] 基于for循环


# zip 拉链  # 基于for循环
l1 = [1,2,]
l2 = ['jason','egon','tank']
l3 = ['a','b','c']
print(list(zip(l1,l2,l3)))  # [(1, 'jason', 'a'), (2, 'egon', 'b')]
# 当zip中的容器类型的元素个数不相同时,得到的结果的元素的个数为最少元素的容器类型数据的元素个数


l = [1,2,3,4,5,6]
print(list(filter(lambda x:x != 3,l)))  # [1, 2, 4, 5, 6] 基于for循环
# 按照条件过滤掉不满足条件的元素,返回满足条件的元素


l = ['jason','egon','nick','tank']
print(sorted(l,reverse=True))  # ['tank', 'nick', 'jason', 'egon']
# 当l中的元素是字符串的时候,比较每个字符串的首字符的ascii码值
# 当l中元素都是数字时,按照数字的大小做比较
# 当reverse的值为True时为从左往右,从小到大
# 当reverse的值为False时为从左往右,从大到小


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