前言

python的生成式在一些类型相互转换的时候可以写出十分优雅的代码,如列表转换成另一个列表、字典、或元组,并且代码的执行效率也比使用for...in...循环高。

系列文章

列表生成式

列表生成式即生成列表的生成式,写法简单而优雅,可以将多行代码融合成一行。主要的作用是将其他对象转换成列表或对原来的列表进行过滤。

列表生成式的代码效率是高于多行循环结构的,原因是将原本多行代码融合一行,解释加快。

# 列表转换列表
ls = [1,2,4,6]
ls1 = [x**2 for x in ls]
print(ls1)
结果:[1,4,16,36]
# 也可以这样
list(x**2 for x in range(10)) # 对列表过滤,返回true的才会保留到列表
ls = [1,2,4,6]
ls1 = [x**2 for x in ls if x > 3]
print(ls1)
结果:[16, 36] # 多条件过滤
ls = [1,2,4,6]
ls1 = [x**2 if x > 2 else x**3 for x in ls]
print(ls1)
结果:[1, 8, 16, 36] # 多重循环
ls = [1,2,4,6]
ls1 = [x**y if x > 2 else x**3 for x in ls for y in ls]
print(ls1)
结果:[1, 1, 1, 1, 8, 8, 8, 8, 4, 16, 256, 4096, 6, 36, 1296, 46656]

生成器生成式

在涉及到需要遍历列表而不是针对列表的某个值操作时,使用生成器代替列表可以减少内存的消耗。

ls = [1,2,4,6]
ls1 = (x**2 for x in ls)
print(ls1)
结果:<generator object <genexpr> at 0x0000021B21DED150> # 当然我们也可以这样
def gener(l):
for x in l:
yield x**2
# 只不过定义结构偏重型,当操作复杂的时候才采用 # 通过for..in取数据不需要处理StopIteration
for i in ls1:
pass # next()方法需要处理StopIteration
while True:
try:
print(next(ls1))
except StopIteration:
pass

字典生成式

字典生成式在一些需要列表或元组转化成字典的场合可以写出很优雅的代码。

# dict()可以接受类似列表生成式的写法,前提是ls至少是二维可迭代对象,否则报错
ls = [('name1','xiao'),('name2','wang')]
dict_ls = dict(x for x in ls)
print(dict_ls)
结果:{'name1': 'xiao', 'name2': 'wang'} # 也可以针对zip使用
d = dict(zip([1,2],[3,4,]))
print(d)
# 结果
{1: 3, 2: 4} # 直接和列表生成式相似的写法
d = {x:y for x,y in enumerate(range(10))}

集合生成式

按照列表生成式类似的写法我们可以写集合生成式。

print(set(i for i in range(5)))
print({i for i in range(5)})
print(frozenset(i for i in range(5))) # 结果
{0, 1, 2, 3, 4}
{0, 1, 2, 3, 4}
frozenset({0, 1, 2, 3, 4})

元组生成式

由于()这个类似列表生成式的形式被生成器占用了,所有元组生成式使用tuple()来进行。


ls = [('name1',['1','2']),('name2','wang')]
dict_ls = tuple(x for x in ls)
print(dict_ls)
结果:(('name1', ['1', '2']), ('name2', 'wang'))

条件表达式代码压缩

对于一些如果代码不算长的if...else...的判断情况,可以将代码写在一行,显得非常的优雅。

x = 1 if 1>0 else None

参考

最新文章

  1. android-plugmgr源代码分析
  2. Java ConcurrentHashMap Example and Iterator--转
  3. How to upgrade Subversion on OSX
  4. Spark Streaming、HDFS结合Spark JDBC External DataSouces处理案例
  5. 神奇的 echo 命令
  6. js之阻止事件冒泡(待修改)和阻止默认事件
  7. .net 调用C++类库
  8. input中id和name属性的区别。
  9. vim使用大全
  10. SetTimer and CreateWaitableTimer的例子(静态函数设置为回调函数,瑞士的网页,有点意思)
  11. [AngularJS] ngPluralize
  12. OrderAction
  13. wamp出现问题#1045 - Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO)的解决方法
  14. 新到的Mac配置Java开发环境
  15. response.getWriter().write()产生乱码
  16. Day 1 上午
  17. Mac新手入门使用教程 - Finder 技巧
  18. C#压缩解压文件
  19. Generative Adversarial Nets[content]
  20. Js/如何操作div下面的span元素或者是img之类的标签元素

热门文章

  1. C语言的指针的基本语法
  2. H5学习之旅-H5的布局(10)
  3. 关于jQuery中的trigger和triggerHandler方法的使用
  4. AngularJS进阶(二十八)解决AngualrJS页面刷新导致异常显示问题
  5. [面试算法题]有序列表删除节点-leetcode学习之旅(4)
  6. AngularJS进阶(二十四)AngularJS与单选框及多选框的双向动态绑定
  7. 页面缓存js问题解决
  8. django-debug-tools 使用
  9. linux下的系统垃圾清理
  10. ABAP Open SQL 分页查询