本站消息

站长简介/公众号


站长简介:逗比程序员,理工宅男,前每日优鲜python全栈开发工程师,利用周末时间开发出本站,欢迎关注我的微信公众号:幽默盒子,一个专注于搞笑,分享快乐的公众号

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2020-10(57)

2020-11(18)

Python-11-生成器

发布于2019-08-07 10:59     阅读(232)     评论(0)     点赞(2)     收藏(0)



一、定义

可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用__iter__方法),所以生成器就是一种迭代器。

二、生成器的两种形式

1. 生成器函数

使用yield代替return返回结果,yield语句一次返回一个结果,返回一个结果后,挂起函数的状态,下次从yield的位置继续执行。

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'


f = fib(10)
print(next(f))
print(next(f))
print(next(f))
print(next(f))
# 函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
def odd():
    print('step 1')
    yield 1
    print('step 2')
    yield(3)
    print('step 3')
    yield(5)

>>> o = odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> next(o)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
def test():
    print('开始啦')
    first = yield 1
    print('第一次', first)
    yield 2
    print('第二次')
    yield 3
    print('第三次')
# yield 1相当于return,控制的是函数的返回值
# yield可以接收send传过来的值

t = test()
res = t.__next__()
print(res)

t.send('hello')

2. 生成器表达式

# 三元表达式
name = 'alex'
res = 'SB' if name == 'alex' else '123'
print(res)

SB

# 列表解析
l1 = ['鸡蛋%s' % i for i in range(1, 10)]
l2 = ['鸡蛋%s' % i for i in range(1, 10) if i > 5]
# l3 = ['鸡蛋%s' % i for i in range(1, 10) if i > 5 else i] # 没有四元表达式
print(l1)
print(l2)

['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
['鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']

# 生成器表达式
g = ('鸡蛋%s' % i for i in range(1, 10) if i > 5)
print(next(g))
print(next(g))
print(next(g))
print(next(g))

鸡蛋6
鸡蛋7
鸡蛋8
鸡蛋9

三、特性

  • 延迟计算,一次产生一个数据,也就是说不会一次产生全部结果,对于大量数据的处理非常有用。

sum([x for x in range(1000000000)])  # 一次计算全部结果,占用大量内存
sum(x for x in range(1000000000))  # 一次计算一个结果,几乎不占内存
  • 有效提高代码可读性

  • 生成器只能遍历一次

 






所属网站分类: 技术文章 > 博客

作者:大将军

链接:https://www.pythonheidong.com/blog/article/10100/4e81529a026eb1944c52/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

2 0
收藏该文
已收藏

评论内容:(最多支持255个字符)