『Python基础』推导式

Python中的推导式

什么是推导式?
推导式,就是设置了一定条件的一个python表达式,可以根据表达式自动推导生成对应的python对象。
通常情况下根据生成对象的不同,推导式区分为:

  • 列表推导式
  • 集合推导式
  • 字典推导式

(1)列表推导式

列表推导式 是利用其它列表创建新列表的一种方式,
工作原理类似for循环,即可对得到的元素进行转换或者筛选。
列表推导式的基本格式:

变量名 = [表达式 for 变量 in 列表] 或者
变量名 = [表达式 for 变量 in 列表 if 条件]

执行流程:
遍历出列表中的内容给变量,表达式根据变量值进行逻辑运算。
或者遍历列表中的内容给变量,然后进行判断,符合的值再给表达式。

练习1:将lst中每一个元素进行平方后放到一个新列表中

# 第一种方式:
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
lst_new = [i * i for i in lst]
print(lst_new)
# [1, 4, 9, 16, 25, 36, 49, 64, 81]

# 第二种方式: 函数
def square(num):
	return num * num
new_lst = [square(i) for i in lst]
print(new_lst)

练习2:将一个嵌套列表转换成一个一维列表。

lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 转换成:lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 使用列表推导式
new_lst = [i for lst1 in lst for i in lst1]
print(new_lst)

# 使用普通嵌套for循环
for lst1 in lst:
	for i in lst1:
		print(i)

练习3:列表lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]求出1/4/7 和 1/5/9

lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 使用for循环
# 1 4 7
for i in range(len(lst)):
	print(lst[i][0])

# 1 5 9
for i in range(len(lst)):
	print(lst[i][i])

# 使用列表推导式
lst1 = [lst[i][0] for i in range(len(lst))]
print(lst1)

lst2 = [lst[i][i] for i in range(len(lst))]
print(lst2)

(2)字典推导式

字典推导式就是列表推导式思想的延续,语法差不多,只不过产生的是字典
字典推导式:
变量名 = {…}
练习:将字典中的keyvalue进行调换。

dic = {"a": 10, "b": 11}
# 普通方式
new_dic = {}
for key, value in dic.items():
	new_dic[value] = key
print(new_dic)
# {10: "a", 11: "b"}

# 字典推导式
new_dic = {value: key for key, value in dic.items()}
print(new_dic)

练习:

str1 = ("ABC")
str2 = ("123")
dic = {k:v for k, v in zip(list1, list2)}
print(dic)
# {'A': '1', 'B': '2', 'C': '3'}

zip()用于将可迭代的对象作为参数,将对象中对应的元素打包成一个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同

(3)集合推导式(集合自带去重功能)

集合推导式跟列表推导式相似,唯一区别在于用{}代替[]

L = [1, 1, 1, 2, 2, 2, 3, 4, 5, 6, 7]
set = {i for i in L}
{1, 2, 3, 4, 5, 6, 7}

练习:计算列表中每个值的平方,自带去重功能

squared = {x**2 for x in [1, -1, 2]}
print(squared)

(4)为什么要用推导式?

为什么要用推导式?

推导式可以包含基本的处理条件和循环结构,并且可以让循环结构进行嵌套完成复杂的操作,能在代码的语法上对原来繁琐的代码进行优化,同时提高了代码的可读性,所以我们使用推导式。

什么时候使用推导式?

如果要按照条件生成少量数据的列表/集合/字典,可以使用推导式进行操作,将数据生成后存储在程序的变量中,但是一旦涉及到大量数据的操作~禁止使用推导式!
原因:推导式最终的结果是列表,列表底层的实现是顺序表,顺序表就是数组,数组中的数据一旦生成赋值给变量就会常驻内存,如果列表中存储少量数据~对于程序的运行没有什么太大障碍,如果一旦数据过多就会导致内存大量消耗【按照条件使用推导式生成了1KW整数数据 -> 程序崩溃】

推导式:[核心:推导式的处理步骤]

  • 确定来源数据、确定目标数据
  • 查找来源数据和目标数据存在的规律【肯定存在】
  • 编码:获取所有可能的数据:获取数据一般使用循环结构
  • 编码:通过条件过滤符合条件的数据:过滤数据肯定使用选择结构
  • 最终的表达式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值