码迷,mamicode.com
首页 > 编程语言 > 详细

Python 生成器

时间:2018-04-12 13:33:51      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:限制   str   lis   class   python 2   第一个   迭代   打印   返回   

列表生成式

a = [x for x in range(10)]
print(type(a))
print(a)

运行结果:
<class ‘list‘>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

再来一个例子:

a = [x*2 for x in range(10)]  # 先执行 x in range(10) 得出的每个值,再依次计算 x * 2 最后组成一个列表。

print(a)

运行结果:
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

生成器

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。如果列表元素可以按照某种算法推算出来,用到才创建,在 Python 中这种称为生成器:generator。就像厨师一样,用到了才做菜。
创建生成器方法一:

a = (x for x in range(4))
print(a)                    # 打印 a 的类型 generator object

print(a.__next__())         # 获取生成器的第一个值 __netx__() 这个特殊方法不建议使用
print(next(a))              # 获取生成器的下一个值, 等价于 a.__next__(); python 2.x 用 a.next() 方法
print(next(a))
print(next(a))

print(next(a))              # 当生成器的值取完后,会报 StopIteration 错误

运行结果:
<generator object <genexpr> at 0x000002249CCA1200>

0
1
2
3

StopIteration

创建生成器方法二:

def foo():
    print(‘ok‘)
    yield 1             # 返回一个 1

a = foo()
print(a)                # 打印类型
b = next(a)             # 获取返回值,执行 next(a)的时候执行了 print(‘ok‘)
print(b)

运行结果:
<generator object foo at 0x000001A5AE421200>
ok
1

使用 for 迭代生成器
注:可迭代对象是指拥有 iter 方法的对象。例如: 列表,元组,字典

a = (x for x in range(4))
for i in a:
    print(i)

运行结果:
0
1
2
3

斐波拉契数列

def fib(max):
    n, before, after = 0, 0, 1
    while n < max:
        print(after, end=‘ ‘)
        before, after = after, before + after         # 这里会优先计算出右边的表达式的结果:
                                                      # 第一次循环时 before, after = 1, 1
        n += 1

fib(5)

运行结果:
1 1 2 3 5 

Python 生成器

标签:限制   str   lis   class   python 2   第一个   迭代   打印   返回   

原文地址:https://www.cnblogs.com/klvchen/p/8805978.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!