python中的生成器

前言

列表推导式

列表推导式可以帮助我们快速得到一个我们需要的列表

得到一个1到20的列表

a = [x for x in range(1,21)]
print(a)

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

得到一个1到20内的偶数列表

a = [x for x in range(1,21) if x%2 == 0]
print(a)

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

得到九九乘法表

a = [x*y for x in range(1,10) for y in range(1,10)]
print(a)

[1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]

列表生成器

列表生成器的语法与列表推导式的语法很相似,只需要将[ ]换成()

语法:( i for i in range(1,10))

它返回的是对象

a = (i for i in range(1,7))
print(a)

<generator object <genexpr> at 0x0000013F8FB0DB30>

因此我们想要拿到其中的元素需要使用next()

next()相当于一个指针,并且不会回退直到抛出异常

a = (i for i in range(1,7))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))

1
2
3
4
5
6
Traceback (most recent call last):
  File "E:\PyCharm\python\text.py", line 8, in <module>
    print(next(a))
StopIteration

Process finished with exit code 1

生成器函数

普通函数:

#斐波那契数列
def febonacci(num):
    a = []
    index = 0
    first = 1
    second = 1
    while index < num:
        a.append(first)
        first,second = second,first+second
        index += 1
    print(a)

if __name__ ==  "__main__":
    febonacci(10)

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

生成器函数:

#斐波那契数列
def febonacci(num):
    index = 0
    first = 1
    second = 1
    while index < num:
        yield first
        first,second = second,first+second
        index += 1


if __name__ ==  "__main__":
    res = febonacci(10)
    i = 0
    while i < 10:
        i += 1
        print(next(res))

1
1
2
3
5
8
13
21
34
55

具有 yield 关键字的函数被直接调用的时候,函数本身不会被调用,而是将函数转换为生成器进行返回, 调用的时候需要使用next ()
yield 的作用
具有 return 的功能,返回函数值并且记住上一次的位置,再次执行的时候从上一次结束的位置开
生成器:当一个函数出现 yield 的时候,那么这个函数在被调用的过程中返回的是一个对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏大橙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值