列表推导式和列表生成器

一、列表推导式

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相似的返回功能,还可以记住上一次的位置,执行的时候从上一次结束的位置开始执行

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值