递归、匿名函数和列表、字典生成公式
递归、匿名函数及列表、字典生成式
1、递归函数
# 1,递归函数
#递归函数是在函数执行时直接或间接调用函数本身的函数。
''递归函数遵循以下两个原则
1.递归:一步一步推导出结论,每次距离想要的结果越近,就越不复杂。
2.回到:逐步返回推导得到的结果,直到得到需要的结果。
递归必须有一个结束条件。
'''
#练习1
#五个同学,第一个比第二个大2岁,第二个比第三个大2岁,以此类推。第五个同学20岁。询问第一个同学的年龄。
#首先定义一个函数。
# def get_age(n):
# #首先定义第五个同学20岁。
#如果n==5:
#返回20
# #从第一名开始,每个同学都比其他同学大两岁。
#返回get_age(n 1) 2
#
# res=get_age(1)
#打印(分辨率)
#练习2
#以相反的顺序打印列表中的每个元素。
list=[1,2,3,4,5,6]
计数=5
国防指数(a):
如果a 0:
返回
打印(列表[a])
a -=1
指数(a)
索引(计数)
#练习3计算年龄1
#年龄1=年龄2 1
#年龄2=年龄3 2
# 3岁=4岁3
# 4岁=5岁4
# 5岁=20岁
#寻找年龄1
def get_age(n,a):
如果n==5:
返回20
a=1
返回get_age(n 1,a) a
res=get_age(1,0)
打印(分辨率)
#练习4打印出以下列表中的每个值,形成一个新列表。
l=[1、[2、[3、[4、[5、[6、[7、[8、[9、[10、[11、[12、[13、[14、]]]]]]]]]
# #为接收元素定义一个空列表。
new_list=[]
#定义一个函数来打印列表中的每个元素。
def get_element(列表):
#首先遍历列表中的每个值。
对于列表:中的行
#确定元素的数据类型
如果类型(行)是int:
new_list.append(行)
else:
get_element(行)
返回新列表
res=get_element(l)
打印(分辨率)
#练习5生成斐波那契数列
#定义一个函数来生成斐波那契数列。
def feibo _齐纳(北):
如果n=1:
返回n
else:
返回(费博_齐纳(n-1)费博_齐纳(n-2))
#定义一个空列表来接受斐波那契数列。
feibo_list=[]
#获取用户想要生成的系列数量。
Numbers=input('输入要生成的系列数:')。strip() #删除用户输入的第一个和最后一个特殊字符。
#将用户输入转换为整数
数字=整数(数字)
#判断用户输入
如果号码是0:
#如果用户输入的值小于0,提示用户重新输入。
打印(“请输入正数”)
else:
#如果输入正数,请打印标题。
打印('斐波那契数列',end=' ')
#使用for循环获取斐波那契函数生成的数据
对于范围(数字):中的I
费博_list.append(费博_齐纳(I))
打印(feibo_list)
2、算法之二分法
#算法
#所谓算法是解决问题的有效方法。
“二分法”
二分法的使用
当我们在庞大的数据中找到我们想要的数据值时,我们使用二分法将整个数据分成两部分。
将左边的最大值与我们要找的值进行比较。如果大于我们要找的值,就把左边的部分分成两部分,以此类推。
二分法的前提是要搜索的数据源必须是有序的。
'''
#练习,用二分法从列表中找到我们想要的值。
digit_list=[12,23,34,45,56,67,78,89,90,123,234,345,567,789,899]
#从上面的列表中找到234
#首先定义一个函数,这样我们就可以找到我们想要的值。
def find_digit(l,n):
#首先确定列表是否为空。
如果
len(l) == 0:
print('列表为空')
return
middle_index = len(l)//2
if n l[middle_index]:
right_list = list(l[middle_index+1:])
print(right_list)
return find_digit(right_list,n)
elif n l[middle_index]:
left_list = list(l[:middle_index])
print(left_list)
return find_digit(left_list,n)
else:
print('找到了')
return n
res = find_digit(digit_list,234)
print(res)
3、三元表达式
# 三元表达式
# 所谓的三元表达式就是当结果是二选一的情况时,利用三元表达式可以大大减少代码量
# 语法结构
'''
if 条件成立时的结果 if 条件 else if条件不成立时返回的结果
'''
res = '欢迎光临' if int(input('请输入你的选择:')) == 1 else '欢迎下次再来'
print(res)
'''
三元表达式一般尽量不要嵌套,会让代码看起来很难理解
'''
print('欢迎光临') if int(input(':')) == 1 else print('下次再来哦')
4、列表、字典生成式
# 列表生成式
# 列表生成式是为了快速生成一个新的列表
name_list = ['jason', 'jenny', 'john', 'tony', 'tom']
# 现要求在列表里的每个元素后面加上'_nb',但是列表内元素顺序不变,且元素用列表存储
# 方法一:
# 建立一个空列表,把修改后的元素添加到空列表里
new_list = []
# for循环取列表的每一个索引
for i in range(len(name_list)):
# 把修改后的元素添加到列表里
new_list.append('%s_nb' % name_list[i])
# 打印列表
print(new_list)
# 方法二:
# 列表生成式
# 语法结构
'''
变量名 = [i,for i in 列表名 if 条件]
列表生成式的先后执行顺序是:
先循环从列表里取出一个元素,然后再根据if后面的条件判断,把取出的元素拿出来,
循环执行上面的步骤,直到把列表里的所有元素取完为止,然后把拿出来的元素用中括号括起来
!切记,列表生成式里不能加else判断语句,因为有for+else和if+else两种,解释器会混淆,所以,不能加else条件
'''
name_list = ['jason', 'jenny', 'john', 'tony', 'tom']
n = [f'{i}_nb' for i in name_list if i != 'jason']
print(n)
# 字典生成式
# 字典生成式是为了快速的生成一个字典
name_list = ['jason', 'jenny', 'john', 'tony', 'tom']
# 把上述列表加上对应的k值生成字典
# 方法一:
# 先建立一个空的字典,通过循环列表里的索引把元素添加到字典里
new_dic = {}
for i in range(len(name_list)):
# 把元素添加到字典里
new_dic[i] = name_list[i]
# 打印新的字典
print(new_dic)
# 方法二:枚举
# 字典生成式
# 语法结构
'''
enumerate(name_list)
针对该方法循环取值,每次都会产生两个结果
1、默认会从0开始生成数字
2、返回被循环列表里的值
变量名 = {k值:v值 for k v in enumerate(name_list)if 条件}
'''
name_list = ['jason', 'jenny', 'john', 'tony', 'tom']
new_dic = {k:v for k,v in enumerate(name_list) if v != 'jason'}
print(new_dic)
# 迭代器
tup = (i for i,j in enumerate(name_list))
print(tup)
5、匿名函数
# 匿名函数
# 所谓匿名函数就是没有名字的函数
# 语法结构
'''
lambda 形参:返回值
匿名函数一般不单独使用,常常是和其他函数连用
'''
res = lambda x: x**2
print(res)
l = [1,2,3,4,5,6,7,8,9]
# 把列表里的每一个值都平方后放进一个新的列表里
# 方法一:
new_list = []
def index(n):
for i in n:
new_list.append(i**2)
return new_list
res = index(l)
print(res) # [1, 4, 9, 16, 25, 36, 49, 64, 81]
# 方法二:
# 匿名函数
# 映射函数 map()
'''
映射函数把列表里的每一个值当成实参传给匿名函数,最后生成一个列表
'''
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(map(lambda x: x ** 2, l))) # [1, 4, 9, 16, 25, 36, 49, 64, 81]
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/103402.html