Python-16
@(Python)
一、函数递归
1. 什么是函数递归
- 函数递归,就是函数的递归调用,是一种特殊的嵌套调用,在调用一个函数时,直接或间接的调用了自己
① 递归必须要有两个阶段
- 递推阶段:先一层一层递归调用下去, 每进入下一层递归,问题的规模必须减少
- 回溯阶段:得到结果后,再一层一层回溯
补充说明:
- 递归必须要有一个明确的结束条件,在满足该条件时结束递推,并开始回溯
- 只有下一层递归结束,上一层才能结束
- 递归不是单独的重复,根据问题的的规模,每进入下一层递归,问题的规模必须减少
- 递归的目的在于,通过不断的重复,来接近一个最终的结果
② 直接调用自己


- 说明:Python中有递归优化,达到一定层数就终止掉,避免无限制占用内存
③ 间接调用自己

- 取出下面列表中的数字
x_list=[1,[2,[3,[4,[5,[6,[7,[8,[9,[10]]]]]]]]]]

④ 递归层数更改(了解)
- 查看递归的层数限制,使用
import sys模块

- 更改递归层数(了解)

2. 递归的二分法应用
- 如下,有从小到大排列的整型数字列表
- 要求:输入数字,判断这个数字是否在这个列表中
① 一般方法
nums=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
search_num=10
for item in nums:
if item == search_num:
print('find it')
break
else:
print('not exist')
② 递归+二分法的方法
- 二分法:就是将列表不断的从中间分成两份,缩小查找的范围
- 利用列表切片,不断的切列表

number_list=[1,2,3,4,5,6,7,8,9,10,11,12,13,14]
def number(search_number,number_list):
if len(number_list) == 0: # 如果==1,那么list_mid_index+1就不能加1
print('number is not exist')
return
list_mid_index=len(number_list)//2
if search_number > number_list[list_mid_index]:
number_list=number_list[list_mid_index+1:]
number(search_number,number_list)
elif search_number < number_list[list_mid_index]:
number_list=number_list[:list_mid_index]
number(search_number,number_list)
else:
print('find it')
number(1,number_list)
二、匿名函数
- 匿名函数是没有绑定函数名字的函数
- 匿名函数一般不单独使用,一般配合
max min map sorted filter内置函数使用- 匿名函数一般使用一次就不用了
1. 匿名函数的格式
lambda x,y:x+y,在没有调用前,就是内存地址- 匿名函数写在一行,
lambda表示匿名函数x+y相当于return x+y
2. max()+匿名函数
max(可迭代对象)求最大值
salaries={
'egon':3000,
'alex':10000000,
'wupeiqi':10000,
'yuanhao':2000
}
取出这个字典中,工资最高的信息
① max()的工作原理

max的返回值不可改,比如传入的是字典,那返回值就是字典的key;传入的是列表,返回的就是元素- 因此,
max取出的是字典的key,统计的是key字符串的个数最多的- 虽然
max的返回值不可改,但是改变max的比较依据
② 普通使用方式
使用格式:
max(salaries,key=func)
- ①
max(a)首先将迭代对象a变为迭代器对象- ② 运行
next,将可迭代器对象a当做参数传给key后面的函数func,func()函数处理后,得到的返回值就是比较依据- ③
max()根据这个返回值做比较,最后的结果是和字典对应的key

③ 配合匿名函数使用

补充说明:
key=func表示指定max的比较依据是func的返回值,这个func函数,可以是自定义的匿名函数- 将
max结果,当做参数传给key后面的函数,将这个函数返回值当做比较依据
3. min()+匿名函数
min(可迭代对象)求最小值

4. sorted()+匿名函数
sorted()默认将列表中内容,按从小到大顺序排列sorted()不改变原值,重新赋值会开辟新内容空间

sorted(列表,reverse=True)从大到小顺序排列

① 配合匿名函数使用
salaries={
'egon':3000,
'alex':10000000,
'wupeiqi':10000,
'yuanhao':2000
}
按照工资从低到高,显示人名
按照工资从高到低,显示人名
- 如果不改变对比依据,默认会以
key作为对比依据

- 按照工资从低到高,显示人名:
sorted(salaries,key=lambda k:salaries[k])

- 按照工资从高到低,显示人名:
sorted(salaries,key=lambdak:salaries[k],reverse=True)

5. map()+匿名函数
① map()的工作原理
使用格式:
map(lambda,names)
- ①
map(lambda,names)首先将迭代对象names变为迭代器对象- ② 运行
next,将可迭代器对象names当做参数传给前面的匿名函数lambda,匿名函数lambda的返回值当做map的结果- 将
names中的值,按照lambda中的规则,映射成新的值
names=['a','b','c','d','e','f']
print(map(lambda x:x+'_it',names))
x_list=map(lambda x:x+'_it',names)
print(list(x_list))

6. filter()+匿名函数
① filter()的工作原理
使用格式:
filter(lambda,names)
- ①
filter(lambda,names)首先将迭代对象names变为迭代器对象- ② 运行
next,将可迭代器对象names当做参数传给前面的匿名函数lambda,filter会判断匿名函数lambda的返回值的真假,如果为真就留下
② 配合匿名函数使用
filter(lambda x:x.endswith('tesla'),names)留下以tesle结尾的元素

7. 其他调用方式:


三、内置函数

1. 需要掌握的
① bytes()
- 编译为二进制
2. 了解的
① abs()
- 将负数转成正数

② all()
- 只要有一个值不为真,全部都不为真;空为真

③ any()
- 只要有一个布尔值为真,都为真;空为
False

④ callable()
- 判断是否为可以被调用的

⑤ chr()
- 根据
ASCII编码表,将数字转成对应的字符
⑤ ord()
- 根据
ASCII编码表,将字符转成对应的数字

⑥ dir()
dir可以查看内置方法可以调哪些功能

⑦ divmod()
divmod处理结果为元组形式(商,余数)- 用途:页面的分页显示

⑧ enumerate()
- 取出列表索引

⑨ eval()
- 将字符窜的表达式提取出来
- 可以将字符串类型的列表、字典转化成列表、字典

⑩ frozenset()

⑪ globals和locals
globals查看全局命名空间的变量 ;locals查看局部的命名空间的变量


⑫ hash()
- 判断是否为可哈希
⑬ help()
- 查看一个函数的注释

⑭ pow()
pow(3,2,2)表示(3**2%2,3的2次方,除2后取余数

⑮ round()
- 四舍五入

⑯ slice()
- 类似于列表的分片,
slice(1,5,2),1表示起始位置,5结束位置,2表示步长

⑰ sum()
sum()求和

⑱ import()
__import__('字符串')表示以字符串的格式导入模块import表示导入模块



