python的递归函数

今日所得

  函数递归

  算法之二分法

  三元表达式

  列表生成式

  字典生成式

  匿名函数

  常用的内置函数

 

函数的递归

  是指在函数加括号调用的时候,会再次调用到自身的函数

  不过需要一个条件来判断是否停止继续调用

#举个例子
def func():
    print('from func')
    func()  # 当函数执行到这一步时又一次调用了函数自身
func()

  上面这个列子实际是一个无限循环的,但是函数不应该无限循环下去,因为每一次调用函数都会产生一个属于它的名称空间,如果无限循环下去,那么就会尝试内存溢出的问题,于是python中有了一个递归层数的限制。

#我们通过改变上面的程序来查看这个限制是多少:
def func(n):
      print('from func',n)  # 将n的值打印出来
      func(n+1)  # 每次递归让n加一

func(1)  # 从1开始
"""
函数递归的深度为1000,但是不精准一般为998或者997左右
可以通过代码和模块来修改递归深度
"""
import sys
print(sys.getrecursionlimit())  
sys.setrecursionlimit(2000)

 

  递归分为两个阶段

  1.回溯:就是一次一次的调用自身的函数,但是调用的前提是每一次函数执行完毕之后,就会朝着最终答案向前一步,直到得到这个答案,达到结束函数的条件

  2.递推:就是向回一步一步的反向推导出答案的过程

  

 

  算法二分法:可以高效的从一个列表中找出你需要的元素是否在列表中

  内部原理是使用函数的递归,从中间将列表一分为二,变成两个列表

  判断你所需的元素与列表的中间值的大小,再从剩下的两个列表中找

                ****************前提是列表要有顺序*****************

 

  三元表达式

  是用来判断两个元素是否满足条件,满足条件则输出那个数

  

res = x if x > y else y
# 如果if后面的条件成立返回if前面的值 否则返回else后面的值
"""
三元表达式固定表达式
    值1 if 条件 else 值2
        条件成立 值1
        条件不成立 值2
"""

 

 

列表生成式

  能够快速简单的对一个列表里的所有元素进行操作

  列表生成式的内部原理:使用for循环先将列表里的元素一一拿出,交由if条件语句进行判断

  如果满足if则会交给for之前的代码进行处理,如果不满足则会直接舍弃这个元素

 

 

匿名函数

  所谓匿名函数,见名知意就是没有名字的函数

  匿名函数的特点,执行完就自动销毁了,只是临时使用

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

常用内置函数

  map  zip  filter  sorted  reduce

# map 映射
l = [1,2,3,4,5,6]
# print(list('hello'))
print(list(map(lambda x:x+5,l)))  # 基于for循环


# zip 拉链  # 基于for循环
l1 = [1,2,]
l2 = ['jason','egon','tank']  # 有几个元素能对应上就组合几个元素
l3 = ['a','b','c']
print(list(zip(l1,l2,l3)))


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



# sorted  排序 将元素从小到大依次排序
# reverse 反转将列表里的元素反过来排
l = ['jason','egon','nick','tank']
print(sorted(l,reverse=True))



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