函数补充和生成式
函数补充和生成式
递归函数
""" 递归:函数在运行过程中 直接或者间接的调用了自身 """
官网表示:python默认的最大递归深度为1000次
impor sys
print(sys.getrecursionlimit())
print(sys.set.recursionlimit(2000))
count = 1
def index():
global count
count += 1
print(count)
print('form index')
index()
index()
def func():
print('form func')
ount()
def ount():
print('form ount')
func()
ount()
"""
递归
1.递推
一层层往下推导答案(每次递推之后复制度相比较于上一次一定要有所下降)
2.回溯
依据最后的结论往后推导出最初需要的答案
递归一定要有结束条件
"""
伪代码:可能无法执行 但是可以表示逻辑
age(5) = age(4) + 2
age(4) = age(3) + 2
age(3) = age(2)+ 2
age(2)= age(1)+ 2
age = 18
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,]]]]]]]]]]]]]]
# 打印出列表中每一个元素(列表除外)
# 1.循环该列表 获取列表内每一个元素
# 2.判断该元素是否是数字 如果是数字 则直接打印
# 3.如果是列表 则循环该列表 获取列表内每一个元素
# 4.判断该元素是否是数字 如果是数字 则直接打印
# 5.如果是列表 则循环该列表 获取列表内每一个元素
# 6.判断该元素是否是数字 如果是数字 则直接打印
# 7.如果是列表 则循环该列表 获取列表内每一个元素
def count(l):
for i in l:
if type(i) is int:
print(i)
else:
count(i)
count(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
if target_num > l[middle_index]
list_l = l[middle_index + 1:]
print(list_l)
my_partner(target_num, list_l)
elif target_num < l[middle_index]:
left_l = l[:middle_index]
print(left_l)
my_partner(target_num,left_l)
else:
print('猜对了')
# 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 else b
"""
条件成立采用if前面的值 if 条件 else 条件不成立采用else后面的值
三元表达式尽量不要嵌套使用
"""
res = ('干饭') if 10 > 2 else ('不干饭')
print(res)
res1 = ('干饭') if 10 > 2 else ('不干饭' if 19 < 1 else '要不起')
print(res1)
res = input('电影票是否收费(n/y)>>>:').strip()
if res == 'n':
print('收费')
else:
print('不收费')
print('收费' if res == 'n' else '不收费')
username = input('username>>>:')
res = 'NB' if username == 'jason' else 'SB'
print(res)

列表生成式
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) '''列表生成式''' # res = ['%s_DSB' % name for name in name_list] # print(res) '''传统做法''' # 1.定义一个空列表 # new_list = [] # # 2.for循环老列表 # for name in name_list: # # 3.生成新的名字 # if name == 'jason': # continue # 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'] # print(res)

字典生成式
# l1 = ['name', 'age', 'hobby']
# l2 = ['jason', 18, 'read']
# new_dict = {}
# for i in range(len(l1)):
# new_dict[l1[i]] = l2[i]
# print(new_dict)
# count = 0
# for i in l1:
# print(count,i)
# count += 1
# 枚举
'''
enumerate(l1)
针对该方法使用for循环取值 每次会产生两个结果
第一个是从0开始的数字
第二个是被循环对象里面的元素
还可以通过start参数控制起始位置
'''
# 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))
# 迭代器
res2 = (i for i,j in enumerate(name_list))
print(res2)

匿名函数
# 匿名函数:没有名字的函数 """ 语法格式 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)))

浙公网安备 33010602011771号