函数递归、二分法、三元表达式、列表表达式、字典表达式、匿名函数以及常用内置函数

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

递归就是一个重复的过程,自己调用自己:

写一个死循环

def bar():
    print('from bar')
    foo()
def foo():
    print('from foo')
    bar()
bar()
#代码报错。超过系统最大深度

写一个简单的递归:

 def bar():
     print('from bar')
     foo()

 def foo():
     print('from foo')
     bar()

 

递归的应用场景:

只知道最后一个人的年龄,依次推测年龄

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

写出递归的一个总结:明确递归的概念,递归就是自己调用自己。先写一个基本的循环,然后再明确一个结束的条件。

查看系统默认内递归的最大层数:

import sys
print(sys.getrecursionlimit())#大概在998左右

手动指定递归的最大深度:

sys.setrecursionlimit(3000)

手动通过递归函数查看最大深度:

def func1(n):
    print('from func1',n)
    func1(n+1)
func1(1)

 循环打印取出嵌套列表中的值

l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]
l1=[]
def num(l):
    for i in l:
        if type(i) is int:
            l1.append(i)
        else:
            num(i)
num(l)
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

两种函数顶替的方式:

1.pas 2....(英文状态下的三个省略号)

def index():
    pass
index
def index():
    ...
index

总结:

递归必须要有两个明确的阶段:
递推:一层一层递归调用下去,强调每进入下一层递归问题的规模都必须有所减少
回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推
开始一层一层回溯
递归的精髓在于通过不断地重复逼近一个最终的结果

二、二分查找算法

二分查找算法 必须处理有序的列表

三、三元表达式:就是一个简写形式

三元表达式仅应用于:
1、条件成立返回 一个值
2、条件不成立返回 一个值
res=x if x > y else y
print(res)

三元表达式前的引导:

def max(x,y):
    if x>y:
        return x
    else:
        return y
res=max(10,20)
print(res)

三元表达式为:res= x if x>y else y

def max2(x,y):
    return x if x>y else y
print(max2(10,11))

四、列表生成式

和三元表达式一样都是个简写的过程

首先,给一个列表中的每个值加上‘_sb’的字样

看看无列表生成式的样子:方法1 

l=['wuxi','sll','zdq','abc']
a=[]
for i in l:
    a.append('%s_sb'%i)
print(a)

先定义一个空列表。然后循环取值,将通用格式:i_sb用格式化输入的方式写入新的列表

方法2:

a.append(i+'_sb')

列表生成式是如何简写的

l=['wuxi','sll','zdq','abc']
res=['%s_DSB'%name for name in l ]
print(res)
#把循环出来的每一个值赋值给前面的name

列表生成器挑选后缀是_NB的人。注意for后面的name和赋值的name是同一个。

l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB']
res=[name for name in l if name.endswith('_sb')]
print(res)

 

 注意,加IF判断的列表生成式不支持加else的情况

五、字典生成式

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

顾名思义就是生成字典。在案例中将两个列表的值一一对应放入字典中。

思路:将两个列表中的值取出来,再存入字典。

for循环取值l1的值,然而还需取l2的值,想到enumerate的作用是for循环取值的同时可以打印对应的索引,而该索引也可以用在l2上,最后通过d[k]=value的形式为字典赋值

d={}
for j,k in enumerate(l1):
    d[k]=l2[i]
print(d)

字典生成式

res={i,j for i,j in enumerate(l1)}

print(res)

字典生成式排除列表的某一项

res={i:j for i,j in enumerate(l1) if j !='name'}
print(res)

但此时的字典和以前不一样。

六、匿名函数

没有名字的函数。用于临时使用,用完就清除

一般函数形式:(写一个相加函数)

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

用匿名函数来写:

与列表、字典生成式相同,都需要一个变量来接收返回值
lamdba函数的写法是写成一行
res=(lamdba x,y :x+y)
print(res)
匿名函数的执行代码
执行lamdba函数只需在后面加括号以及参数即可
res=(lamdba x,y :x+y)(10,20)#别忘了lamdba也是函数,加括号就可以调用
print(res)

也就是说,平时函数怎么写,匿名写法也是一样,知识写成一行,调用写在后面即可

 注意:匿名函数需要和内置函数一同使用。

补充一个知识点:A—Z(65,90),A的arsic码最小

a—z(97,122)a的arsic码最小。通过如下方法可以查询

下面就是一些内置函数。

七、内置函数

 map映射

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

 

zip拉链

filter过滤。从列表中获取值,再过滤

sorted排序。

reduce

 

posted @ 2019-07-12 21:30  xg1321  阅读(241)  评论(0编辑  收藏  举报