一:递归函数
函数递归调用(是一种特殊的嵌套调用):在调用一个函数的过程中,又直接或间接地调用了该函数本身
递归必须要有两个明确的阶段:
递推:一层一层递归调用下去,强调每进入下一层递归问题的规模都必须有所减少
回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推
开始一层一层回溯
递归的精髓在于通过不断地重复逼近一个最终的结果
例子:用递归实现列表二分法查找元素
有一个从小到大排列的整型数字列表
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
# in the right
nums=nums
search(search_num,nums)
elif search_num < nums
# 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
# 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
print(res)
print(min(salaries,key=lambda k:salaries
# salaries={
# 'egon':3000,
# 'alex':100000000,
# 'wupeiqi':10000,
# 'yuanhao':2000
# }
# print(sorted(salaries,key=lambda k:salaries
# 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(
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)
20,# print(vars())#返回对象object的属性和属性值的字典对象,如果没有参数,就打印当前调用位置的属性和属性值 类似 locals()。