ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

递归函数、列表/字典生成式、二分法、匿名函数

2021-11-18 19:02:13  阅读:141  来源: 互联网

标签:index name 递归函数 生成式 list 列表 二分法 num print


目录
一、递归函数
二、算法之二分法
三、三元表达式
四、列表生成式
五、其他生成式
六、匿名函数

一、递归函数

递归:函数在运行过程中,直接或者间接调用了自身。
官网表示python的最大递归深度1000,可以修改,但是没有实际意义。
递归两个阶段:1.递推:一层层往下推导答案(每次递推后的复杂度都比上一层降低);2.回溯:根据最后的答案往下推导出最初想要的答案。

# 1.直接调用自身:停不下来,一直执行到python的最大递归深度然后报错
def index():
	print('哈哈哈')
	index()
index()

image

# 2.间接调用自身:停不下来,一直执行到python的最大递归深度然后报错
def func():
	print('哈哈哈')
	index()
def index():
	print('嘿嘿嘿')
	func()
index()

image

# 3.修改递归深度为2000:用 sys.setrecursionlimit()括号内放需要的深度。修改了也没有啥实际意义
import sys
print(sys.getrecursionlimit())
res = sys.setrecursionlimit(2000)
print(res)

count = 1  # 定义一个计数器
def index():
	global count  # 修改全局变量
	count += 1  # 每次加1
	print(count)  # 打印计数
	index()  # 直接调用自身
index()  # 调用

image

# 4.递推函数小练习:把下面列表里的每个元素都打印出来,不打印列表
list1 = [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, ]]]]]]]]]]]]]]
# 思路:循环列表取值,然后判断是否数字,如果数字直接打印,如果不是继续循环新列表取数再判断是否数字,如果是打印如果不是再继续循环新列表。。。
# 循环可以用for或者用函数,但是如果用for实现的话数太多需要循环写很多次,所以选择用函数实现
# 4.1 定义函数,循环取值
def get_num(list1):
	for i in list1:
		# 4.2 判断是否数字,用类型关键字即可,如果是直接打印
		if type(i) is int:
			print(i)
			# 4.3 如果不是数字那就只能是列表了,继续循环
		else:
			get_num(i)
# 4.4 调用函数
get_num(list1)

image

二、算法之二分法

算法:解决问题的高效方法。
二分法:算法中最简单的,连入门级都算不上。二分法又称为折半法,一般用于数据量大中查找值,要求数据集必须是有序的。通俗的说就是把数据集一分为二,再一分为二再一分为二一直分到最后一个数据再判断。

l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]
'''
	思路:找到列表的中间位置的数据跟查找值进行比较,如果一样就直接打印找到了,如果大了就在左半边,如果小了就在右半边。
		用函数进行循环二分操作,然后找到最后空列表还没找到的话,就不存在直接打印找不到。
	'''
	# 定义函数
	def index(target_num, l):
		# 判断列表是否空的,空的就打印找不到
		if len(l) == 0:
			print('没找到')
			return
		# 如果不是空的就执行以下二分操作,先找中间值
		m_num = len(l) // 2
		# 与查找值比较,然后继续循环二分操作
		if l[m_num] > target_num:
			l_l = l[:m_num]
			print(l_l)
			index(target_num, l_l)
		elif l[m_num] < target_num:
			l_r = l[m_num + 1:]
			print(l_r)
			index(target_num, l_r)
		else:
			print('找到了%s' % target_num)
	index(1, l)  #  查找值1

image

三、三元表达式

三元表达式是python为我们提供的简化代码的一种解决方案。一般用于两个功能二选一的情况。三元表达式尽量不要嵌套使用。
结构:条件成立采用if前面的值 if 条件 else 条件不成立采用后面的值

def index(a, b):
	if a > b:
		return a
	return b
# 语法格式:条件成立采用if前面的值 if条件 else 条件不成立采用else后面的值
# 以上用三元表达式可以写成:
def index(a, b):
	return a if a > b else  b  

image

# 三元表达式嵌套
def index(a, b):
	res = '干饭' if a > b else ('不管饭' if a > b else '啥')
	print(res)
index(1, 8)

is_free = input('是否免费y/n:').strip()
if is_free == 'y':
	print('免费')
else:
	print('收费')

# 使用三元表达式
is_free = input('是否免费y/n:').strip()
print('免费') if is_free == 'y' else print('收费')

image

四、列表生成式

列表生成式是python给我们提供的一种简化代码的解决方案,用于快速生成列表。

name_list = ['jason', 'kevin', 'tony', 'jerry']
# 给列表中所有的人名加上_DSB后缀

'''传统做法'''
# 思路:定义一个空列表,用for循环取数然后加上后缀再放到空列表里面去,最后打印出来
new_list = []
for name in name_list:
	name1 = '%s_DSB' % name
	new_list.append(name1)
print(new_list)

'''列表生成式'''
res = ['%s_DSB' % name for name in name_list]
print(res)

image

name_list = ['jason', 'kevin', 'tony', 'jerry']
# 除了jason外,给列表中所有的人名加上_DSB后缀
'''传统做法'''
# 思路:定义一个空列表,用for循环取数判断是不是jason,如果是就跳过,如果不是然后加上后缀再放到空列表里面去,最后打印出来
name_list1 = []
for name in name_list:
	if name == 'jason':
		continue
	else:
		name2 = '%s_DSB' % name
		name_list1.append(name2)
print(name_list1)

'''列表生成式'''
res2 = ['%s_DSB' % name for name in name_list if name != 'jason']
print(res2)

image

五、其他生成式

1.字典表达式

name_list = ['jason', 'kevin', 'tony', 'jerry']
res = {i: j for i, j in enumerate(name_list, start=1) if j != 'jason'}  # 开始计数位置1
print(res)

2.集合表达式

res1 = {i for i, j in enumerate(name_list)}
print(res1, type(res1))

image

3.枚举:

l1 = ['name', 'age', 'hobby']
l2 = ['jason', 18, 'read']

# 1.把两个列表的元素按照从左到右组织成字典
new_dict = {}
for i in range(len(l1)):
	new_dict[l1[i]] = l2[i]
print(new_dict)

# 2. 枚举enumerate()的用法
count = 0
for i in l1:
	print(count, i)
	count += 1
# 可以写成:
for i, j in enumerate(l1, start=1):  # start=1即从1开始
	print(i, j)

image

六、匿名函数

匿名函数即没有名字的函数,一般不会独立使用,都是配合其他函数使用。
语法格式:limbda 形参:返回值

print(lambda x: x**2)  # x是形参,x**2是返回值 打印空函数就是打印内存地址

print((lambda x: x ** 2)(2))  # 传参x =2进匿名函数,返回值2的平方为4
# 分开写的格式:
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)))

image

标签:index,name,递归函数,生成式,list,列表,二分法,num,print
来源: https://www.cnblogs.com/90s-blog/p/15572662.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有