目录
递归函数
函数的递归:函数在调用阶段直接或间接的又调用自身
# 补充知识
import sys
print(sys.getrecursionlimit()) # 查看python中最大递归次数,不是很准确
sys.setrecursionlimit(2000) #可以自定义最大递归次数
# 实现递归调用,但是函数会无限制的递归下去,python解释器中有最大递归次数
def func(n):
print('from func',n)
func(n+1) # 查看递归调用次数
func(1)
# 实现了递归调用,但是函数会无限制递归下去。
def index():
print('from index')
login()
def login():
print('from login')
index()
login()
递归的两个阶段
1,回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降。
直到有一个最终的结束条件。
2.递推:一次次往回推导的过程。
age(5) = age(4) + 2
age(4) = age(3) + 2
age(3) = age(2) + 2
age(1) = 18
age(n) = age(n-1) + 2 # n > 1
age(1) = 18 # n = 1
# 使用递归函数实现找出第一个人的年龄
def age(n):
if n == 1:
return 18
return age(n-1)+2
res = age(5)
print(res)
# 将列表中的数字依次打印出来(循环的层数是你必须要考虑的的点)
s = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]
def get_num(l):
for i in l:
if type(i) is int:
print(i)
else:
get_num(i)
get_num(s)
递归函数不要考虑循环的次数,只需要把握结束的条件即可。
# 补全函数语法的两种方式,一种是pass,一种是...。推荐使用pass
def index():
# pass
...
利用递归实现二分法
算法:解决问题的高效率的方法
# 利用for循环找出num在列表中是否存在
l = [1,3,5,12,67,58,125,145,156,178,203,234,367,278,342,422]
num = 342
for i in l:
if i ==num:
print(f'find it {i}')
else:
print('没找到')
二分法
二分法:容器类型里面的数字必须有大小顺序
l = [1,3,5,12,67,58,125,145,156,178,203,234,367,278,342,422]
target_num = 666
def get_num(l,target_num):
# 不在列表中
if not l:
print('你给的工资 这个任务怕是没法做')
return
# 获取列表中间的索引
middle_index = len(l)//2
print(l)
# 判断target_num跟middle_index对应的数字的大小
if target_num > l[middle_index]:
# 切取列表右半部分
num_right = l[middle_index+1:]
# 递归使用get_num函数
get_num(num_right,target_num)
elif target_num < l[middle_index]:
# 切取列表左半部分
num_left = l[:middle_index]
# 再递归调用get_num函数
get_num(num_left,target_num)
else:
print(f'find it {target_num}')
get_num(l,target_num)
三元表达式
# 三元表达式固定表达式,可以连续多个三元表达式
# 值1 if 条件 else 值2
# 条件成立 值1
# 条件不成立 值2
x = 99999
y = 999393993
res = x if x > y else y
print(res) # 999393993
x = 1
y = 2
m = 3
n = 4
res = x if x > y else (m if m > n else n)
print(res)
is_free = input('请输入是否免费(y/n)')
is_free = '免费' if is_free == 'y'else '收费'
print(is_free)
username = input('username>>>>:')
res = 'NB'if username == 'jaosn' else '垃圾'
print(res)
列表生成式
l = ['tank','nick','oscar','sean']
l1 = []
for name in l:
l1.append(f'{name}_sb')
# l1.append('name_sb') # 不推荐使用
print(l1) # ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']
列表生成式
l = ['tank','nick','oscar','sean']
res = [f'{name}_DSB' for name in l ]
print(res) # ['tank_DSB', 'nick_DSB', 'oscar_DSB', 'sean_DSB']
l = ['tank_DSB', 'nick_DSB', 'oscar_DSB', 'sean_DSB','jason']
res = [name for name in l if name.endswith('_DSB')]
print(res) # ['tank_DSB', 'nick_DSB', 'oscar_DSB', 'sean_DSB']
# 先for循环依次取出列表里面的每一个元素
# 然后交由if判断,条件成立才会交给for循环前面的代码
# 如果条件不成立,当前的元素,直接舍弃
字典生成式
# 生成字典
l1 = ['name','password','hobby']
l2 = ['jason','123','DBJ','egon']
d = {}
for i,j in enumerate(l1):
d[j] = l2[i]
print(d) # {'name': 'jason', 'password': '123', 'hobby': 'DBJ'}
# 字典生成式
l1 = ['jason','123','read']
d = {i:j for i,j in enumerate(l1) if j!='123'}
print(d) # {0: 'jason', 2: 'read'}
# 字典生成式中可以加if判断,条件成立,就会添加到字典中,否则就不会添加
# 集合生成式
res ={i for i in range(10) if i!=4}
print(res) # {0, 1, 2, 3, 5, 6, 7, 8, 9}
# # 这样写不是元组生成式 而是生成器表达式
res1 = (i for i in range(10) if i!=4)
print(res1) # <generator object <genexpr> at 0x05B81230> 就是一只老母鸡
for i in res1:
print(i) # 取出的鸡蛋 0,1,2,3,,5,6,7,8,9
匿名函数
匿名函数:没有名字的函数
匿名函数的特点:临时存在,用完就没了。
# 匿名函数lambda
res = (lambda x,y:x+y)(1,3)
print(res) # 4
# 不是匿名函数
func = lambda x,y:x+y
print(func(1,3)) # 4
# lambda x,y:x+y
# :左边的相当于函数的形参
# :右边的相当于函数的返回值
匿名函数通常不会单独使用,是配合内置函数一起使用。
常用的内置函数
1,max(l,key=),min(l,key=)函数
l = [1,2,3,4,5]
print(max(l)) # 内部是基于for循环的
A-Z在ascii码中的序号是65-90
a-z在ascii码中的序号是977-122
d = {
'egon':30000,
'jason':888888,
'nick':3000,
'tank':1500,
}
def index(name):
return d[name]
# 比较薪资,返回人名
print(max(d,key=lambda name:d[name])) # jason
# lambda name:d[name] 将名字当做参数传入,返回的是以名字取到的薪资,比较的是薪资大小,最终返回的是人名
print(min(d,key=lambda name:d[name])) # tank
map(func,iter)映射,将新的值与原来的值一一对应替换
l = [1,2,3,4,5,6]
print(list('hello'))
print(list(map(lambda x:x+5,l))) # [6, 7, 8, 9, 10, 11]
zip(iter1,...) 拉链函数
l1 = [1,2]
l2 = ['jason','nick','tank']
l3 = ['a','b','c']
print(list(zip(l1,l2,l3))) # [(1, 'jason', 'a'), (2, 'nick', 'b')]
zip()拉链函数,可以用来生成字典,
filter() 过滤
l = [1,2,3,4,5,6]
print(list(filter(lambda x:x!=3,l))) # [1, 2, 4, 5, 6]
sorted() 排序
l = ['jason','egon','nick','tank']
print(sorted(l,reverse=True)) # ['tank', 'nick', 'jason', 'egon']
reduce() 缩减为一个值
from functools import reduce
l = [1,2,3,4,5,6]
print(reduce(lambda x,y:x+y,l,19))
# 当初始值不存在的情况下,按照下面的规律
# 第一次先获取两个元素 相加
# 之后每次获取一个与上一次相加的结果再相加