截止到目前为止,python基础内容已经学习了50%左右,在学习编程过程当中,咱们不只要学习python语法,同时也须要学习如何把本身代码写的更美观,效率更高。python
推导式是从一个或者多个迭代器快速简洁地建立数据类型的一种方法,它将循环和条件判断结合,从而避免语法冗长的代码,提升代码运行效率。能熟练使用推导式也能够间接说明你已经超越了python初学者的水平。git
1github 2编程 3微信 4app 5ide 6学习 7测试 8spa |
''' value1:若是条件表达式condition成立,返回value1 ; 若是条件表达式不成立,返回value2 ; condition:条件表达式 Value2:若是条件表达式condition成立,返回value1 ; 若是条件表达式不成立,返回value2 ;
'''
value1 if condition else Value2 |
假若有这样一个须要:判断一个数字是奇数仍是偶数?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解忧 @Blog(我的博客地址): shuopython.com @WeChat Official Account(微信公众号):猿说python @Github:www.github.com
@File:python_list.py @Time:2019/9/30 20:45
@Motto:不积跬步无以致千里,不积小流无以成江海,程序人生的精彩须要坚持不懈地积累! """
# 新手代码 x = 10 if x%2 == 0: print("新手说:x是偶数") else: print("新手说:x是奇数")
# 老司机 x = 15 print("老司机说:x是偶数") if x%2 == 0 else print("老司机说:x是奇数") |
输出结果:
1 2 |
新手说:x是偶数 老司机说:x是奇数 |
观察上面代码能够看出来,选手一(新手)一共占用了5行代码,而选手二(老司机)完成一样一个功能仅仅只须要两行,这就是性价比,每每这就是职场上鉴别工做能力/升职加薪的细节。
列表推导式是条件推导式和循环一块儿配合使用,并返回一个列表,而且整个表达式须要在[]内,由于返回值也是列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
''' 语法一: 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] |
需求一:获取0~20的全部偶数而且乘以10,并返回全部计算以后的结果。示例代码以下:(使用列表推导式语法一实现)
1 2 3 4 5 6 7 8 9 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)) |
输出结果:
1 2 |
[0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200] <class 'list'> |
需求二:将0~20的偶数乘以10,奇数乘以100,并返回全部计算以后的结果。示例代码以下:(使用列表推导式语法二实现)
1 2 3 4 5 6 7 8 9 10 11 |
''' 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)) |
输出结果:
1 2 |
[0, 100, 20, 300, 40, 500, 60, 700, 80, 900, 100, 1100, 120, 1300, 140, 1500, 160, 1700, 180, 1900, 200] <class 'list'> |
可能有童鞋纳闷,我明明for循环就能实现的功能,为毛要用这鸟玩意推导式?
使用列表推导式的效率远远高于for循环,可能执行一句print(“helloworld”)对于cpu而已只须要0.0002秒,你可能感受不到差距,若是须要输出一亿次helloworld呢?每每细节以为成败!
假若有一个需求:将0~10000000(一亿)之内的全部整数存到列表中,对比一下列表推导式和for循环耗时状况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import time # 添加time模块,用于统计代码运行时间
#一共添加10000000次数据到列表中 total_num = 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)) |
输出结果:
1 2 |
使用列表推导式耗时:0.5455152988433838秒 使用普通for循环耗时:1.2068836688995361秒 |
输出结果很明显,实现通用的功能,列表推导式的效率整整高出普通for循环一倍。
最后舒适提醒:测试请把循环次数改小一点,毕竟刚开始不当心多加了几圈圈,电脑死机了!
1.注意在列表推导式书写的时候,全部表达式都必须在[]内部,由于返回值是列表list
2.列表推导式是python开发学习的知识点,多多联系,熟能生巧.