一、列表推导式
1.通过列表推导式我们可以快速得到一个需要的列表
例如:生成一个0~10的列表ls
>>> ls = [x for x in range(11)]
>>> ls
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2.那如果我们只想要打印奇数或者偶数呢?
我们可以在后面加上条件
例如:生成一个0~10间所有偶数或奇数的列表ls
>>> ls = [x for x in range(11) if x%2 == 0]
>>> ls
[0, 2, 4, 6, 8, 10]
>>> ls = [x for x in range(11) if x%2 != 0]
>>> ls
[1, 3, 5, 7, 9]
3.我们也可以用循环去嵌套循环
>>> ls = [i*j for i in range(3) for j in range(5)]
>>> ls
[0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 2, 4, 6, 8]
>>> ls = [i+j for i in range(3) for j in range(5)]
>>> ls
[0, 1, 2, 3, 4, 1, 2, 3, 4, 5, 2, 3, 4, 5, 6]
注意:我们在用列表推导式的时候,如果生成的列表元素特别多的时候,空间浪费就会很大,一定要注意空间浪费问题 ,那么我们就可以用到列表生成器
二、列表生成器
与列表推导式写法上的区别:将最外层的“ [ ] ”换成“ ( ) ”
另外,要注意的是列表生成器返回的是一个对象
>>> ls = (i for i in range(6))
>>> ls
<generator object <genexpr> at 0x00000285E7F52660>
如果我们想要拿到列表生成器中的元素,需要借助全局函数next(对象)
我们可以把它当作一个指针,一直往下走,不会回退,直至抛出异常
>>> ls = (i for i in range(6))
>>> ls
<generator object <genexpr> at 0x00000285E7F52660>
>>> next(ls)
0
>>> next(ls)
1
>>> next(ls)
2
>>> next(ls)
3
>>> next(ls)
4
>>> next(ls)
5
>>> next(ls)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
这个时候我们再来遍历ls中的元素并打印,发现为空的,说明被next()取完了
>>> for i in ls:
... print(i)
...
>>>
那我们现在新建一个列表ls2,并去遍历一下它
>>> ls2 = (x for x in range(6))
>>> ls2
<generator object <genexpr> at 0x00000285E7F527B0>
>>> for i in ls2:
... print(i)
...
0
1
2
3
4
5
>>>
三、将函数转换为生成器
方法:调用yield关键字
yield关键字的作用:具有return的功能,能够返回函数的值
当一个函数出现yield关键字的时候,那么这个函数在被调用执行的过程中,返回的是一个对象(生成器),需要借助next()方法进行获取相对应的值
接下来我们用斐波那契数列当作示例
ls = []
def f(num):
first, second = 1, 1
index = 0
while index < num:
yield first
first, second = second, first + second
index += 1
if __name__ == '__main__':
res = f2(10)
print(next(res))
print(next(res))
print(next(res))
print(next(res))
print(next(res))
# 打印结果为:
# 1
# 1
# 2
# 3
# 5
注意:yeild关键字不仅具有和return相似的返回功能,还可以记住上一次的位置,执行的时候从上一次结束的位置开始执行