递归函数及匿名函数配合内置函数的使用

一:递归函数

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

递归必须要有两个明确的阶段:

递推:一层一层递归调用下去,强调每进入下一层递归问题的规模都必须有所减少

回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推

开始一层一层回溯

递归的精髓在于通过不断地重复逼近一个最终的结果

例子:用递归实现列表二分法查找元素

有一个从小到大排列的整型数字列表

nums=[1,3,7,11,22,34,55,78,111,115,137,149,246,371]

def search(search_num,nums):

print(nums)

if len(nums) == 0:

print('not exists')

return

mid_index=len(nums) // 2

if search_num > nums[mid_index]:

# in the right

nums=nums[mid_index+1:]

search(search_num,nums)

elif search_num < nums[mid_index]:

# in the left

nums=nums[:mid_index]

search(search_num,nums)

else:

print('find it')

search(31,nums)

二:匿名函数

1:# 有名函数:基于函数名重复使用

2:# 匿名函数:没有绑定名字的下场是用一次就回收了

# f=lambda x,y:x+y

# print(f)

# print(f(1,2))

三:常用内置函数配合lambda函数的使用 #max min map filter sorted

salaries={

'egon':3000,

'alex':100000000,

'wupeiqi':10000,

'yuanhao':2000

}

# max的工作原理

#1 首先将可迭代对象变成迭代器对象

#2 res=next(可迭代器对象),将res当作参数传给key指定的函数,然后将该函数的返回值当作判断依据

# def func(k):

# return salaries[k]

# print(max(salaries,key=func)) #next(iter_s)

#'egon', v1=func('egon')

#'alex', v2=func('alex')

#'wupeiqi', v3=func('wupeiqi')

#'yuanhao', v4=func('yuanhao')

res=max(salaries , key=lambda key:salaties[key])#配合lambda函数使用将薪资最高的人取出来

print(res)

print(min(salaries,key=lambda k:salaries[k])) #next(iter_s) #取出薪资最低的人原理与max一样

# salaries={

# 'egon':3000,

# 'alex':100000000,

# 'wupeiqi':10000,

# 'yuanhao':2000

# }

# print(sorted(salaries,key=lambda k:salaries[k],reverse=True))#将字典里的人物按照薪资进行排序,reverse可以控制 排序方式,顺序或者倒序。

# map的工作原理

#1 首先将可迭代对象变成迭代器对象

#2 res=next(可迭代器对象),将res当作参数传给第一个参数指定的函数,然后将该函数的返回值当作map的结果之一

# aaa=map(lambda x:x+"_SB",names)

# print(aaa)

# print(list(aaa))

# filter的工作原理#过滤函数

#1 首先将可迭代对象变成迭代器对象

#2 res=next(可迭代器对象),将res当作参数传给第一个参数指定的函数,然后filter会判断函数的返回值的真假,如果为真则留 下res

names=['alexSB','egon','wxxSB','OLDBOYSB']

# print([name for name in names if name.endswith('SB')])#列表推到式取出以SB结尾的名字

aaa=filter(lambda x:x.endswith('SB'),names)#使用过滤函数取出以SB结尾的名字

print(aaa) #迭代器对象

print(list(aaa))

四:其他需要掌握的内置函数:

1,bytes

# res='你好'.encode('utf-8')#将unicode字符转成字节类型

# print(res)

# res=bytes('你好',encoding='utf-8')#直接用bytes可以转换

# print(res)

2,chr 参考ascii表将数字转成字符,ord将字符转换成对应的数字

# 参考ASCII表将数字转成对应的字符

# print(chr(65))

# print(chr(90))

# 参考ASCII表将字符转成对应的数字

# print(ord('A'))

3,divmod 求商和余数

# print(divmod(10,3))#打印结果为3余1

4,enumerate 枚举

# l=['a','b','c']

# for k ,item in enumerate(l):

# print(k,item)

5, eval 把字符串中的表达式拿出来运行一下

# l='[1,2,3]'

# l1=eval(l)#将列表形式的字符串取出来,拿到一个列表,可以依靠索引取值,多用于从文件中取出列表,字典之类的 数据类型

# print(l1,type(l1))

# print(l1[0])

6,pow

# print(pow(3,2,2)) #与 (3 ** 2) % 2类似,先平方再求余

7,round 四舍五入

# print(round(3.3)) #结果为3

#print(round(3.5))#结果为4

8,sum求和函数

# print(sum(range(101))) #1到100的值

9,—import— 用来导入以字符串形式输入的模块

module=input('请输入你要导入的模块名>>: ').strip() #module='asdfsadf'

m=__import__(module)

print(m.time())

五:其他需要了解的内置函数

1, # print(abs(-13)) #求绝对值的方法

2, # print(all([1,2,3,])) #全部为True则为真

3, # print(all([])) #空的可迭代对象为真

4, # print(any([0,None,'',1])) #有一个为True则为True

5, # print(any([0,None,'',0])) #False

6, # print(any([])) #空列表为假

7, # print(bin(3)) #11 #十进制转换成二进制

8, # print(oct(9)) #11 #十进制转成八进制

9, # print(hex(17)) #11 #十进制转成十六进制

10,# print(callable(len)) #函数是否能被调用

11, # import time

12, # print(dir(time)) #列举出所有:time.名字

13, # s=frozenset({1,2,3}) # 不可变集合

14, # s1=set({1,2,3}) # 可变集合

15, # # print(globals()) #查看全局变量

16, # # print(locals()) #查看局部变量

17, # hash([1,2,3]) #是否可以被hash

18, # def func():

# """

# 文档注释

# :return:

# """

# pass

# print(help(func)) #help函数查看一个函数的帮助文档

19, # l=['a','b','c','d','e']

# s=slice(1,4,2) #类似于先定义一个切片方式,以后可以方便连续使用

# print(l[1:4:2])

# print(l[s])

20,# print(vars())#返回对象object的属性和属性值的字典对象,如果没有参数,就打印当前调用位置的属性和属性值 类似 locals()。

递归函数及匿名函数配合内置函数的使用


分享到:


相關文章: