VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > python入门教程 >
  • Python高级编程之推导式合集,学会了后别人一看就是大神

一个简单的列子

现在有个需求,已知列表a=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求你把列表里的每个值加1,你怎么实现?

二逼青年版

生成一个新列表b,遍历列表a,把每个值加1后存在b里,最后再把a=b

复制代码

"""
当然在学习Python的道路上肯定会困难,没有好的学习资料,怎么去学习呢?
学习Python中有不明白推荐加入交流Q群号:928946953
群里有志同道合的小伙伴,互帮互助, 群里有不错的视频学习教程和PDF!
还有大牛解答!
"""

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = []
for i in a:
    b.append(i+1)
b = a
print(a)
print(b)
#Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
复制代码

 

Python

 

这样二B的原因不言而喻,生成了新列表,浪费了内存空间

普通青年版

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for index,i in enumerate(a):
    a[index] +=1
print(a)
#Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

Python

 

毫无新意

略屌青年版

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a = map(lambda x:x+1, a)
print(a)
#Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

Python

 

运用了lambda匿名函数,稍微有那么一点点味了~~~

装逼青年版

a = [i+1 for i in range(10)]
print(a)
#Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

Python

 

这样的写法就叫做列表生成式,有什么用呢?难道只是为了装B吗?

列表推导式

我想你应该知道,编写这样的代码很痛苦

Python高级编程之推导式合集,学会了后别人一看就是大神

 

复制代码
ls = []
for i in ls:
    if i % 2 ==0:
        ls.append(i)
print(i)
#Output: [0, 2, 4, 6, 8]
复制代码

 

Python

复制

这种写法或许用于C语言不错,但在Python中,运行速度很慢,因为解释器在每次循环的时候都要判断序列中的哪一部分需要修改,需要用计数器来跟踪需要处理的元素,而且每次遍历因为append()方法还要额外执行查询函数

而列表推导式就能解决这些问题,它可以使用编排好的功能对上述语法的一部分进行自动化处理

ls = [i for i in range(9) if i % 2 ==0]
print(i)
#Output: [0, 2, 4, 6, 8]

 

Python

 

很明显,列表推导式不仅更加高效,也更加简短,涉及的语法元素也更少,在大型程序中,也能出现更少的错误

基本语法

我们来具体分析上面给出的例子

ls = [i for i in range(9) if i % 2 ==0]

 

我们将列表推导式写在一个方括号内,因为它最终构建的是一个列表
列表推导式主要由三部分构成:

  1. for循环头部 for i in range(9)
    判断条件 if i % 2 ==0
    循环变量 i
    是不是非常Ease 非常Amazing!

     

工作原理

Python在执行列表推导式时,会对可迭代对象 ls 进行迭代,将每一次迭代的值赋给循环变量 i ,然后经过if判断,最终

由这些结果构成了新的列表,也就是列表推导式所返回的值

只要支持 for 循环进行迭代的对象,都可以对它使用列表推导式

字典推导式

字典推导式和列表推导式使用方法类似,只是用的是大括号。
字典推导式更多的是用于key和value的对调,合并大小写对应的value值

合并大小写对应的value值

复制代码
dt = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
dt_sum = { k.lower(): dt.get(k.lower(), 0) + dt.get(k.upper(), 0) 
           for k in dt.keys() if k.lower() in ['a','b'] }
           #lower()大写字母变小写  upper()小写字母变大写
           #dict.get() 函数返回指定键的值,如果值不在字典中返回默认值
           #dict.keys() 返回字典所有的key,是一个可迭代对象
    
print (dt_sum)
#Output: {'a': 17, 'b': 34}
复制代码

 

Python

 

快速更换key和value

dt = {'a': 10, 'b': 34}
dt_change = {v: k for k, v in dt.items()}
#items() 函数以列表返回可遍历的(键, 值) 元组数组
print(dt_change)
#Output: {10: 'a', 34: 'b'}
dt = {'a': 10, 'b': 34}
dt_change = {v: k for k, v in dt.items()}
#items() 函数以列表返回可遍历的(键, 值) 元组数组
print(dt_change)
#Output: {10: 'a', 34: 'b'}

 

Python

 

集合推导式

如果你想去除重复数据,那么就可以使用集合推导式

sl = {i**2 for i in range(-2, 3)}
print(sl)
#Output: {0, 1, 4}

 

Python
 

总结

推导式看起来不符合常规,是因为它在方括号内部使用for循环,但是它却起到了让代码更加简洁的作用,尤其是它可以通过“判断条件”来决定什么情况下插入新的值

推导式可以帮助我们把一个序列或者其他可迭代类型中的元素过滤或是加工,然后形成列表、字典、元组。Python内置的filter和map函数组合起来也能达到这一效果,但是可读性上打了不小折扣

如果你想使用更短的代码,实现相同的功能,上面所述的三种推导式你必须得掌握

出处:https://www.cnblogs.com/pythonQqun200160592/p/15168925.html


相关教程