Fork me on GitHub

函数递归和一些常用的内置函数

一、函数的递归

 1、定义: 函数在调用阶段直接或间接的又调用自身

    2、形式

 def func(n):
#     print('from func',n)
#     func(n+1)
#
# func(1)

#可以返回998行

3、import sys 模块

获取的递归的限制不是很精确

import sys
# print(sys.getrecursionlimit())  # 不是很精确

还可以通过 sys.setrecursionlimit(2000)
来修改递归的次数,但是这样是没有意义的,不应该无限制的递归下去

4、递归的应用场景

  分为另两个阶段

          1、回溯:就是一次次重复的过程,但是这个重复的过程建立在每一个重复             问题的复杂程度应该下降,直到有一个最终的结束条件

          2、递推:一次次往回推导的过程

5、应用

1、猜年龄游戏

‘’’
age(5) = age(4) + 2 age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 18
‘’’
# 已知age(1),求age(5),由上式,可以总结出 当 n >1时 age(n) = age(n-1)+2
当n= 1时 age(1)= 18

#代码
def age(n):
     if n == 1:  # 必须要有结束条件
         return 18
     return age(n-1) + 2
res = age(5)
print(res)
#

 

2、将列表的数字打印出来

l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13]]]]]]]]]]]]]  #将列表中的数字依次答应出来

#第一种方式 用for 循环可以写,但是如果层数太多的话 代码就会冗余。
for i in l:  推导思路
     if type(i) is int:
         print(i)
     else:
         for item in i:
             if type(item) is int:
                 print(item)
             else:
                 for j in item:
                     if type(item) is int:
                         print(item)
                     else:
             ...

#第二种方式,用递归函数写
def get_num(l):
     for i in l:
         if type(i) is int:
             print(i)
         else:
             get_num(i)

# get_num(l)
l1 = []
for i in l1:
     print(i)
#递归函数不要考虑循环的次数 只需要把握结束的条件即可

3、算法之二分法

算法的定义:解决问题的高效率的方法

二分法的定义:就是先找到容器类型中的中间值,然后拿需要比的值和中间值比较。大于中间值就选右边,小于就取左边。然后继续取中间值,直到取到为止。且容器类型里面的数字必须有大小顺序。

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)

 

四、三元表达式

应用场景  :

    当某个条件成立做一件事情,不成立做另一件事情。

形式

  

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

固定格式:
        值1 if 条件 else 值2
            条件成立 值1
            条件不成立 值2

使用规范

    三元表达式的应用场景只推荐只有两种的情况的可能下,因为写太多就不容易看清楚     

 

五、列表生成式

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

 

 

六、字典生成式

和列表生成式差不多,就是把中括号改成大括号

res = {i for i in range(10) if i != 4}
print(res)
res1 = (i for i in range(10) if i != 4)  # 这样写不是元组生成式 而是生成器表达式

 

 

七、匿名函数

定义:没有名字的函数

特点:临时存在用完就没了

关键字:lambda

def my_sum(x,y):
    return x + y

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



# :左边的相当于函数的形参
# :右边的相当于函数的返回值
# 匿名函数通常不会单独使用,是配合内置函数一起使用

 

八、常用的内置函数

max map zip

max 求最大值

map 会根据提供的函数对指定序列做映射。

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

zip  将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

filter     用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

 

posted @ 2019-07-13 00:50  杂货店的音乐  阅读(215)  评论(0)    收藏  举报