文章目录
python有很多高效的语法,使用一行代码可以搞定很多逻辑,本文列举了部分,本文是基于: win10+Python 3.6.5
多重循环
比如有多重嵌套循环:
ret = []
for i in range(10):
for j in range(10):
ret.append(i + j)
一行代码搞定:
ret = [i + j for i in range(10) for j in range(10)]
扩展:
# 产生的列表的每个元素是一个包含两个元素的元组
ret = [(i, j) for i in range(10) for j in range(10)]
# 实际就是
ret = []
for i in range(10):
for j in range(10):
ret.append((i, j))
ret = [(i, j) for i in range(10) for j in range(i + 1)]
# 嗯,3重嵌套也是可以改写的
ret = [(i, j, k) for i in range(2) for j in range(2) for k in range(2)]
当然上面的操作都是使用了列表推导式
,产生的结果都是放入了内存, 要节约内存,更加高效的写法,是使用生成器表达式
,很简单就是把上面的[]
更改为()
即可,但是使用的使用要注意:
ret = [(i, j) for i in range(10) for j in range(10)] # 这是推导式
# 求长度的时候我们可以直接使用
len(ret)
ret = ((i, j) for i in range(10) for j in range(10)) # 这是推导式
# 求长度就不能直接使用len了,但是可以使用下面的方式替换
len(list(ret)) # 也就是强制转换为了列表
# 你也可以使用下面的方式
sum(1 for _ in ret)
# 当然这里还有陷阱,如果你重复执行两次上面的语句,你会发现第二次结果是0
# 这里仅限于python3的朋友,python2没有这个问题
当然,上面的使用还是稍微低级了一点,其实我们不应该在代码里面出现太多的
for
循环,至少在python这门语言中,for
循环其实是一个不小的灾难,比如ret = ((i, j) for i in range(10) for j in range(10))
这个行代码,我们出现了两个for
循环,其实我们还可以(也应该)使用下面的方式,更为直观明了的表达我们的代码要做什么:
from itertools import product
ret = product(range(10), repeat=2)
持续更新中。。。。