递归函数 | 算法(二分法) | 三元表达式
内容概要
- 递归函数
- 算法(二分法)
- 三元表达式
- 列表生成式
- 字典生成式
- 匿名函数
递归函数
-
递归
函数在运行过成中,直接或间接调用自身 -
官方表示:python默认的最大递归深度为1000次
-
修改递归次数
import sys
print(sys.getrecursionlimit())
print(sys.setrecursionlimit(2000))c = 1
def index():
global c
print(c)
c += 1
print('sss index')
index()index()
-
递推
一层层往下推导答案(每次递归之后复制度相较于上一次一定要有所下降) -
回溯
依据最后的结论往后推导出最初需要的答案
递归一定要有结束条件 -
练习推导年龄
def age(a):
if a == 1:
return 18
return age(a - 1) + 2print(age(5))
-
练习打印出列表中的所有数字
l1 = [1, [2, [3, [4, [5, [6, [7, [8, [9]]]]]]]]]def s(l1):
for i in l1:
if type(i) is int:
print(i)
else:
s(i)s(l1)
算法之二分法
-
lis = [11, 22, 33, 66, 99, 123, 234, 456, 678]
def index(s, lis):
if len(lis) == 0: # 列表里没有这个数
print('不好意思没找到')
return
a = len(lis) // 2 # 找到中间的索引值
if s > lis[a]: # 判断中间索引值比目标值大还是小
lis_right = lis[a + 1:] # 如果目标值大说明要找的值在右侧
print(lis_right)
index(s, lis_right)
elif s < lis[a]:
lis_left = lis[:a] # 如果目标值小说明要找的值在左侧
print(lis_left)
index(s, lis_left)
else:
print('找到了', s)
index(456, lis)
三元表达式
-
def index(a, b):
if a > b:
return a
return bprint(index(2, 4))
-
如果功能需求只是二选一的情况下,推荐使用三元表达式
-
def index(a, b):
return a if a > b else bprint(index(5, 3))
-
条件成立采用if前面的值,条件不成立采用else后面的值
三元表达式尽量不要嵌套使用 -
username = input('user: ').strip()
print('帅' if username == 'aaa' else '丑')
列表生成式
-
传统方法给列表里的名字加后缀
l1 = ['sss', 'aaa', 'ccc']
l2 = []
for name in l1:
new_name = '%s_hhh' % name
l2.append(new_name)
print(l2)
-
列表生成式
l1 = ['sss', 'aaa', 'ccc']
print(list('%s_hhh' % name for name in l1))
字典生成式
-
l1 = ['name', 'age', 'hobby']
l2 = ['sss', 18, 'music']
dic = {} # 定义一个空字典
for i in range(len(l1)): # for循环三列表l1,l1的长度是3
dic[l1[i]] = l2[i] # 字典索引等于l2的索引,字典没有键值对,所以新增键值对
print(dic) # 打印字典c = 0
for i in l1:
print(c, i)
c += 1
-
枚举
enumerate(l1)
针对该方法使用for循环取值,每次会产生两个结果
第一个是从0开始的数字
第二个是被循环对象里的元素
还可以通过start参数控制起始位置 -
l1 = ['name', 'age', 'hobby']
l2 = ['sss', 18, 'music']
res = {k: l2[i] for i, k in enumerate(l1)}
print(res)
匿名函数
-
匿名函数
没有名字的函数 -
语法格式
lambda 形参:返回值 -
print((lambda x: x ** 2)(6))
-
匿名函数一般不会单独使用,都是配合其他函数使用
map() 映射
l1 = [2, 3, 4, 5, 6]
print(list(map(lambda x: x ** 2, l1)))