参加了CSDN的5月学习挑战,做到这个编程语言简史题目,对其中的写法有些好奇,遂进行了一下深入的学习。
B选项这个写法很让我好奇。
if __name__ == '__main__':
languages = ...
years = ...
[print(languages[i], ':', years[i]) for i in range(0, len(languages))]
这里打印一句使用的是列表推导式,一种轻量级循环写法。
经学习,这种写法实际得到的会是一个新的数组,有点类似于Java的stream.map的写法。这里面因为默认languages和years等长,所以i遍历一个就可以了。
如果两个甚至多个循环长度不等。如下,只需要将对应变量赋予不同范围即可,可以看出有几个for循环,就会嵌套基层,所以使用时还是应该考虑清楚范围和算法是否合理。毕竟3阶以上遍历的数量会增加的很恐怖。
print([(x, y) for x in range(3) for y in range(2)])
# output:
# [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
有意思的是,这种列表推导式还可以加入一些行为,比如选项中的print,它意味着每循环一次便进行一次print操作。
[print(x, y) for x in range(3) for y in range(2)]
# output:
# 0 0
# 0 1
# 1 0
# 1 1
# 2 0
# 2 1
甚至,他还可以加入判断语句进行过滤,好方便,下面的代码,就是对x属于(0,1),y属于(0,1,2…9)的两个数组(for x in range(2) for y in range(10)
)行遍历相加(x + y
),遍历相加的条件时y能整除3( if y % 3 == 0]
)
print([x + y for x in range(2) for y in range(10) if y % 3 == 0])
# output:
# [0, 3, 6, 9, 1, 4, 7, 10]