函数--补充
函数补充
目录- 函数补充
- 递归函数
- 算法二分法
- 三元表达式
- 列表生成式
- 字典生成式
- 匿名函数
- 常用内置函数
递归函数
函数在执行过程中直接或间接调用了本身
官方表示:python默认最大递归深度为1000次,但实际是997,998
'''
count = 1
def index():
global count
count +=1
print(count)
print('from index')
index()
index()
递归:
1.递推
一层层往下推导答案(每次递归之后复制都要相较与上一次要有所下降)
2.回溯
依据最后的结论往后推导出最初需要的答案
递归一定要有结束条件
'''
age(5) = age(4) + 2
age(4) = age(3) +2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 5
伪代码虽然无法运行,但是可以说清楚逻辑
def get_age(n):
if n == 1:
return 18
return get_age(n - 1) + 2
print(get_age(5))
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]]
def get_num(l):
for i in l:
if type(i) is int:
print(i)
else:
get_num(i)
get_num(l)
算法二分法
算法:解决问题的高效方法
# 什么是算法?
解决问题的高效方法
# 二分法(入门级别:还有一定距离)
l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]
# 第一种方式 直接for循环从左往右依次查找
# 第二种方式 二分法
"""
二分法能够使用的场景 数据集必须有序
"""
def my_partner(target_num, l): # target_num=321 l=l
if len(l) == 0:
print('不好意思 我尽力 没找到')
return
# 先获取中间位置索引值
middle_index = len(l) // 2 # 8
# 判断中间索引对应的值比目标值大还是小
if target_num > l[middle_index]:
# 说明要找的元素只可能出现在列表的右侧
l_right = l[middle_index + 1:] # l[9:]
print(l_right)
my_partner(target_num, l_right)
elif target_num < l[middle_index]:
# 说明要找的元素只可能出现在列表的左侧
l_left = l[:middle_index]
print(l_left)
my_partner(target_num, l_left)
else:
print('找到了', target_num)
# my_partner(444, l) 找不到 需要添加结束条件
# my_partner(11, l) # 要查找的元素在开头 那么还没有依次查找的效率高
三元表达式
def my_max(a,b)
if a > b:
return a
else:
return b
'''
当功能需求仅仅是二选一的情况下,推荐三元表达式
'''
def my_max(a,b)
return a if a > b esle b #条件成立采用if前面的值不成立采用后面的
三元表达式可以嵌套但不推荐
res = '吃饭' if 10 > 5 else '不吃'
print(res)
res = '吃饭' if 10 > 20 else ('不管' if 3 > 4 else 'gun' )
print(res)
列表生成式
给所有人的后缀加上
name_list = ['jason', 'tony', 'danny', 'kevin',']
res = ['%s_nb' % name for name in name_list]
print(res)
生成新的列表
res = ['%s_DSB' % name for name in name_list if name != 'jason']
print(res)
字典生成式
枚举
'''
enumerate(11)
针对该方法使用for循环取值,每次否会产生两个结果
第一个是从0 开始的数字
第二个是被循环对象里面的元素
还可以通过start参数控制起始位置
'''
name_list = ['jason', 'kevin', 'tony', 'jerry']
res = {i: j for i, j in enumerate(name_list) if j != 'jason'}
print(res)
res1 = {i for i,j in enumerate(name_list)}
print(res1,type(res1))
匿名函数
没有名字的函数
语法格式
? lambda 形参:返回值
print((lambda x:x**2)(2))
def index():
pass
print(index)
print((lambda x: x ** 2)(2))
res = lambda x: x**2
print(res(2))
'''匿名函数一般不会单独使用 都会配合其他函数起义使用'''
常用内置函数
1.map() 映射
l = [1, 2, 3, 4, 5, 6, 7, 8]
def index(n):
return n ** 2
print(list(map(lambda x:x**2, 1)))
l = [1, 2, 3, 4]
map(lambda x:x+1,1) #循环过去列表中的每个元素并传递给匿名函数
2.zip() 拉链
l = [11, 22, 33, 44, 55, 66, ]
name_list = ['jason', 'kvein', 'tony', 'jerry']
l1 = [1, 2, 3, 4, 5, 6, 7]
l2 = [8, 7, 6, 4, 3, 2, 1]
res = zip(l, name_list, l1, l2)
print(list(res))
3.max与min max求最大值 min 求最小值
l = [11, 22, 33, 44, 55]
print(max(1))
print(min(1))
d = {
'jason':3000,
'Kevin':123123,
'Ascar':1312342,
}
def index(key):
# return d[key]
# print(max(d,key=lambda key:d[key])) # for循环先取值 之后再比较大小
"""
A-Z 65-90
a-z 97-122
"""
# print(min(d,key=lambda key:d[key])) # jason
4.filrer 过滤
l = [11, 22, 33, 44, 55]
res = filter(lambda x:x > 30 ,1)
print(list(res)) #[33, 44, 55]
5.reduce 归总
from functools import reduce
d = [11, 22, 33, 44, 55, 66, 77, 88, 99]
res = reduce(lambda x, y: x + y, d)
res1 = reduce(lambda x, y: x + y, d, 100) # 还可以额外添加元素值
print(res)