星号表达式很重要,你知道这个名词之后,可以通过 google 学到更多细节。或者,就留个印象也是很好的,因为在函数章节我们还要提到它。
介绍一下列表推导式和 zip()
考虑下面这样一个需求:
小学生
中学生
zip 就是拉链,顾名思义,这个函数能够像拉链一样把两个列表一一对应起来,我们就不需要专门生成一个位置变量,而可以直接迭代他们的值了
大学生
上面给 c 赋值的这个语法叫做列表推导式(list comprehension),它和第二种语法做的事情一模一样,只不过把生成列表与循环向列表赋值放在了一行里面完成!我们将在下一章结合 if 详细讨论列表推导式。但是这里,你可以看到,同一件事情,其实有很多不同的方式去完成。一般来说,我们都喜欢最简洁和优美的写法,也就是第三种!
学习建议:正确的名词 + Google 是最好的学习方式
很多时候,只要知道一个名词,剩下的事情,请教 google 就可以了!这里限于篇幅(懒),我没有详细展开上面提到的诸多名词,但既然你知道他们大概是什么了,你可以轻而易举的从 google 中获取更多他们的说明,以及精心设计的案例!
>>> a = [1, 2, 3]
>>> for i in a:
... print(i)
...
1
2
3
>>> a = '123'
>>> for i in a:
... print(i)
...
1
2
3
>>> a = 123
>>> for i in a:
... # 这里会打印出 1,2,3 呢?还是会打印出 1 到 123 呢?
... print(i)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
# 答案是出错了!int 是不可迭代的。
# 通过 hasattr() 查看某个类型是否具有名为 __iter__ 的方法
>>> hasattr(list, '__iter__')
True
>>> hasattr(str, '__iter__')
True
# int 没有 __iter__ 方法,所以 for 循环 int 就出错了
>>> hasattr(int, '__iter__')
False
# 把列表中三个元素分别分给三个变量
>>> a = [1, 2, 3, 4, 5]
>>> x1, *x2, x3 = a
# 将三个等长列表中的每一个数相加,得到一个新的列表
>>> a = [1, 2, 3]
>>> b = [3, 4, 5]
# 目标
>>> c = [4, 6, 8]
# 你会怎么做?
>>> a = [1, 2, 3]
>>> b = [3, 4, 5]
>>>
>>> c = []
>>>
>>> for pos in range(0, 3):
... i, j = a[pos], b[pos]
... # i 和 j 之所以能同时获得,原理也和上面的 list unpack 一样!
... cur_sum = i + j
... c.append(cur_sum)
>>> c
[4, 6, 8]
>>> a = [1, 2, 3]
>>> b = [3, 4, 5]
>>> c = []
>>>
>>> for i, j in zip(a, b):
... # i 和 j 是一对来自 a 和 b 中相同位置的值,如(1, 3)(2, 4) (3, 5)
... cur_sum = i + j
... c.append(cur_sum)
>>> c
[4, 6, 8]
>>> a = [1, 2, 3]
>>> b = [3, 4, 5]
>>> c = [i + j for i, j in zip(a, b)]
>>> c
[4, 6, 8]
# 😎