一.什么是推导式
推导式是从一个或者多个迭代器快速简洁地创建数据类型的一种方法,它将循环和条件判断结合,从而避免语法冗长的代码,提高代码运行效率。
二.条件推导式
1.语法
'''
value1:如果条件表达式condition成立,返回value1 ; 如果条件表达式不成立,返回value2 ;
condition:条件表达式
Value2:如果条件表达式condition成立,返回value1 ; 如果条件表达式不成立,返回value2 ;
'''
value1 if condition else Value2
2.实战练习
假如有这样一个需要:判断一个数字是奇数还是偶数?
#新手代码
import random
x = random.randint(1,100)
if x%2 == 0:
print('新手说:',x,'是一个偶数')
else:
print('新手说:',x,'是一个奇数')
#老司机代码
y = random.randint(1,100)
print('老司机说:',y,'是一个偶数') if y%2==0 else print('老司机说:',y,'是一个奇数')
三.列表推导式
列表推导式是条件推导式和循环一起配合使用,并返回一个列表,并且整个表达式需要在[]内,因为返回值也是列表。
1.语法
'''
语法一:
exp1:在for循环中,如果x的值满足条件表达式condition(即条件表达式成立),返回exp1;条件表达式不成立则不返回
x:for循环中变量
data:一个序列(比如:列表/元组/字符串等)
condition:条件表达式
'''
[exp1 for x in data if condition]
'''
语法二:
exp1:在for循环中,如果x的值满足条件表达式condition(即条件表达式成立),返回exp1;条件表达式不成立则返回exp2
condition:条件表达式
exp2:在for循环中,如果x的值满足条件表达式condition(即条件表达式成立),返回exp1;条件表达式不成立则返回exp2
x:for循环中变量
data:个序列(比如:列表/元组/字符串等)
'''
[exp1 if condition else exp2 for x in data]
2.实战练习
需求一:获取0~20的所有偶数并且乘以10,并返回所有计算之后的结果。示例代码如下:(使用列表推导式语法一实现)
'''
1.因为是获取0~20,包括20,所以使用range(0,21)
2.x*10 等价 语法一中的exp1
3.x%2 == 0 等价 语法一中的条件表达式condition
4.range(0,21) 等价 语法一中的data(序列)
'''
list1 = [x * 10 for x in range(0, 21) if x % 2 == 0]
print(list1)
print(type(list1))
输出结果:
[0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200]
<class 'list'>
需求二:将0~20的偶数乘以10,奇数乘以100,并返回所有计算之后的结果。示例代码如下:(使用列表推导式语法二实现)
'''
1.因为是获取0~20,包括20,所以使用range(0,21)
2.x*10 等价 语法二中的exp1
3.x*100 等价 语法二中的exp2
4.x%2 == 0 等价 语法二中的条件表达式condition
5.range(0,21) 等价 语法一中的data(序列)
'''
list2 = [x * 10 if x % 2 == 0 else x * 100 for x in range(0, 21)]
print(list2)
print(type(list2))
输出结果:
[0, 100, 20, 300, 40, 500, 60, 700, 80, 900, 100, 1100, 120, 1300, 140, 1500, 160, 1700, 180, 1900, 200]
<class 'list'>
3.效率对比
可能有童鞋纳闷,我明明for循环就能实现的功能,为毛要用这鸟玩意推导式?
使用列表推导式的效率远远高于for循环,可能执行一句print(“helloworld”)对于cpu而已只需要0.0002秒,你可能感觉不到差距,如果需要输出一亿次helloworld呢?往往细节觉得成败!
假如有一个需求:将0~10000000(一亿)以内的所有整数存到列表中,对比一下列表推导式和for循环耗时情况:
import time
# 添加time模块,用于统计代码运行时间
total_num = 10000000
# 一共添加10000000次数据到列表中
# 使用列表推导式
start_time = time.time()
list1 = [x for x in range(0, total_num)]
# 列表推导式
end_time = time.time()
print("使用列表推导式耗时:{}秒".format(end_time - start_time))
# 使用普通for循环
start_time = time.time()
list2 = list()
for x in range(0, total_num): # for循环
list2.append(x)
end_time = time.time()
print("使用普通for循环耗时:{}秒".format(end_time - start_time))
输出结果:
使用列表推导式耗时:0.8692595958709717秒
使用普通for循环耗时:2.0871689319610596秒
输出结果很明显,实现通用的功能,列表推导式的效率整整高出普通for循环一倍。
四.重点总结
1.注意在列表推导式书写的时候,所有表达式都必须在[]内部,因为返回值是列表list
2.列表推导式是python开发学习的知识点,多多联系,熟能生巧.
转载自:猿说Python » python列表推导式
链接地址:https://www.shuopython.com/archives/1149
温馨提示:文章内容系作者个人观点,不代表欢迎来到地球村对观点赞同或支持。
版权声明:本文为转载文章,来源于 猿说Python ,版权归原作者所有,欢迎分享本文,转载请保留出处!
发表评论