一:递归函数
递归函数:函数在运行过程中 直接或者间接的调用了自身
官网表示:python默认的最大递归深度为1000次
框架 查看递归最大次数
import sys
获取递归的限制
print(sys.getrecursionlimit())
修改递归限制次数
print(sys.setrecursionlimit(2000))
定义一个
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) = 18
1.递推
一层层往下推导答案(每次递归之后复杂度相较于上一次一定要有所下降)
2.回溯
依据最后的结论往后推导出最初需要的答案
代码运行
定义一个函数 参数用n表示
def get_age(n):
判断n是否等于1
if n == 1:
返回18
return 18
返回值 调用函数
return get_age(n - 1) + 2
打印 调用函数
print(get_age(3))
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]]
打印出列表中每一个元素(列表除外)
1.循环该列表 获取列表内每一个元素
2.判断该元素是否是数字 如果是数字 则直接打印
3.如果是列表 则循环该列表 获取列表内每一个元素
4.判断该元素是否是数字 如果是数字 则直接打印
5.如果是列表 则循环该列表 获取列表内每一个元素
6.判断该元素是否是数字 如果是数字 则直接打印
7.如果是列表 则循环该列表 获取列表内每一个元素
就是循环 是数字就打印 是列表在做循环
def get_num(l):
for i in l:
if type(i) is int:
print(i)
else:
# 也是for循环 然后判断
get_num(i)
get_num(l)
举例:在列表内元素循环完后
for i in []:
print(i,'懵逼了!')
![image](https://i-blog.csdnimg.cn/blog_migrate/484cb39ecca13096f2d51c1a3e4428f5.webp?x-image-process=image/format,png)
二:算法之二分法
什么是算法?
解决问题的高效方法
(二分法能够使用的场景 数据集必须有顺序(正序 倒序))
l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]
第一种方式 直接for循环从左往右依次查找
第二种方式 二分法
'''
二分法能够使用的场景 数据集必须有顺序(正序 倒序)
'''
统计l多少个数 取整一分为二
print(len(l)//2)
定义函数
def my_partner(targat_num,l): # target_num=321 l=l
if len(l) == 0:
print('不好意思我尽力了')
return
先获取中间位置索引值
middle_index = len(l) // 2 # 8 # 1除2=0.5 取整=0
判断中间索引对应的值比目标值大还是小
if targat_num > l[middle_index]:
说明要找的元素只可能出现在列表的右侧 索引取值
l_right = l[middle_index + 1:] # l[9:]
print(l_right)
my_partner(targat_num, l_right)
elif targat_num < l[middle_index]:
说明要找的元素只可能出现在列表的左侧 顾头不顾尾取零
l_left = l[:middle_index] # l[0:1]
print(l_left)
my_partner(targat_num, l_left)
else:
print('找到了', targat_num)
my_partner(321, l)
![image](https://i-blog.csdnimg.cn/blog_migrate/dce8e02c571c125be80eec1a00971c2a.webp?x-image-process=image/format,png)
三:三元表达式
当功能需求仅仅是二选一的情况下 那么推荐使用三元表达式
当遇到二选一情况
def my_max(a, b):
if a > b:
return a
else:
return b
'''
当功能需求仅仅是二选一的情况下 那么推荐使用三元表达式
'''
三元表达式
def my_max(a, b):
# if else 在一行用
return a if a > b else b
'''
条件成立采用if前面的值 if 条件 else 条件不成立采用else后面的值
'''
方法1
res = '干饭' if 1 > 2 else '不干饭'
print(res)
'''三元表达式尽量不要嵌套使用 python建议简洁'''
方法2
res = '干饭' if 10 > 20 else ('不管饭' if 2 > 5 else '写的啥!')
举例:
收费系统
传统操作
is_free = input('电影是否收费(y/n):').strip()
if is_free == 'y':
print('收费')
else:
print('免费')
三元表达式 实现
print('收费' if is_free == 'y' else '免费')
三元表达式
username = input('username:')
res = 'NB' if username = 'jason' else 'SB'
print(res)
![image](https://i-blog.csdnimg.cn/blog_migrate/73709928b6762af114ef14214c06aaa6.webp?x-image-process=image/format,png)
四:列表生成式
列表的生成式
name_list = ['jason', 'kevin', 'tony', 'jerry']
给列表中所有的人名加上_DSB后缀
'''传统做法'''
1.定义一个空列表
new_list = []
2.for 循环老列表
for name in name_list:
3.生成新的名字
new_name = '%s_DSB' % name
4.添加到新的列表中
new_list.append(new_name)
print(new_list)
"列表生成式"
列表生成式 肯定是列表 先执行for循环 然后在处理
res = ['%s_DSB' % name for name in name_list]
print(res)
name_list = ['jason', 'kevin', 'tony', 'jerry']
将列表中所有的人名后面加上_DSB 但是jason除外
'''传统做法'''
# 1.定义一个空列表
new_list = []
2.for循环老列表
for name in name_list:
3.生成新的名字
if name == 'jason':
new_list.append(name)
else:
new_name = '%s_DSB' % name
4.添加到新的列表中
new_list.append(new_name)
print(new_list)
列表生成式
res = ['%s_DSB' % name for name in name_list if name !='jason'] # 后面不支持再写else了
print(res)
![image](https://i-blog.csdnimg.cn/blog_migrate/9d03af2e120298a52ba16b364bca34fe.webp?x-image-process=image/format,png)
五:字典生成式
字典生成式
l1 = ['naem', 'age', 'habby']
l2 = ['jason', 18, 'read']
现在想让上面两个列表合成一个字典 l1变成k l2变成v
定义一个空字典
nwe_dict = {}
循环 将统计的数值取出
for i in range(len(l1)):
nwe_dict[l1[i]] = l2[i]
print(nwe_dict)
即打印元素 又打印索引值
count = 0
for i in l1:
print(count, i)
count += 1
枚举
'''
enumerate(l1)
针对方法使用for循环取值 每次会产生两个结果
第一个是从0开始的数字
第二个是被循环对象里面的元素
还可以通过start参数控制起始位置
'''
l1 = ['naem', 'age', 'habby']
当给循环传值的时候enumerate会传给i,j两个元素 (索引值,元素)、
索引起始位置可以调的 start=1
取索引值
for i, j in enumerate(l1, start=1):
print(i, j)
字典生成式
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))
![image](https://i-blog.csdnimg.cn/blog_migrate/013de411a48015e9eb0c9242c8559d90.webp?x-image-process=image/format,png)
六:匿名函数
匿名函数:没有名字的函数
"""
语法格式
lambda 形参:返回值
"""
print(lambda x:x**2)
def index():
pass
print(index)
print((lambda x: x ** 2)(2))
res = lambda x: x ** 2
print(res(2))
'''匿名函数一般不会单独使用 都是配合其他函数一起使用'''
map() 映射
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
def index(n):
return n ** 2
print(list(map(lambda x:x**2, l)))