我是靠谱客的博主 精明摩托,最近开发中收集的这篇文章主要介绍Python中的迭代器(Iterator)与生成器(Generator)生成器(Generator)迭代器(Iterator)小练习,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文主要是基于廖雪峰网站上的解释加上自己的一些理解写的,顺带做了个小练习
代码基于Python 3.7

主要内容

  • 生成器(Generator)
    • 创建方法
  • 迭代器(Iterator)
    • 可迭代对象(Iterable)
  • 小练习

生成器(Generator)

生成器基于这样的思想:它保存某种机制,使生成器可以一边循环一遍获取元素。可以理解为,它保留了某种算法,我们可以通过这个算法源源不断地产生我们需要的元素。

创建方法

主要有两种:
1、通过列表生成式产生,区别就在于我们用圆括号而不是方括号包裹列表产生式。

#列表
[x for x in range(10)]
#生成器对象
(x for x in range(10))

2、通过yield关键字
这种方法用于函数之中。这也是很有特色的一个特性,出现yield关键字的函数可以称为一个生成器函数,这样的函数有一个特点,被next()方法调用的时候,每一次调用都会停留在yield的位置,yield后面跟随的值是本次迭代产生的值,而下一次next()的调用又从yield的下个语句开始执行。
当然作为函数,生成器函数同样具有返回值,只不过这个返回值仅在引发StopIteration后才能得到(当然前提是我们的迭代不是一个无限的迭代)。

这个StopIteration异常是我们不停调用next()直到迭代结束才会抛出。
前面提到的函数的返回值藏在StopIteration.value里,下面是一个小例子:

def Generator(n):
    for i in range(n):
        yield 2*i 
    return "迭代完毕"
"""
捕捉异常,获取函数返回值
"""
g = Generator(5)
while True:
    try:
        i = next(g)
        print(i)
    except StopIteration as s:
        print(s.value)
        break
#函数输出
0
2
4
6
8
迭代完毕

迭代器(Iterator)

网站上给出了迭代器的一个定义,能够被next()方法调用的对象就是一个迭代器,所以,每一个生成器都是迭代器。

可迭代对象(Iterable)

可迭代对象有一个粗略的定义,能够使用for循环获取元素的对象就是一个可迭代对象
但是可迭代对象不一定是一个迭代器,像list/dict/tuple都是可迭代对象,但使用next()方法调用是会报错的。但是可迭代对象也可以转换为一个迭代器,方法很简单,只需要iter()方法,就可以将一个可迭代对象转换为迭代器。

小练习

编写一个生成器函数,生成杨辉三角。
杨辉三角形如:
杨辉三角
要求每次迭代以列表形式输出一行

def triangle():
    n = 1
    pre = []
    tmp = [1]
    while True:
        for i in range(n):
            if n==1:
                break
            if i!=n-1 and i-1>=0 :
                tmp.append(pre[i - 1] + pre[i])
            elif i==n-1:
                tmp.append(1)
        yield tmp        
        n += 1
        pre = tmp
        tmp = [1]
    return "Finish"
"""
测试
"""
count = 0
gen = triangle()
for l in gen:
    print (l)
    count+=1
    if count == 10:
        break
"""
运行结果
"""
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

顺带一提,我写的这个杨辉三角就无法看到它的返回值(目前所知)

最后

以上就是精明摩托为你收集整理的Python中的迭代器(Iterator)与生成器(Generator)生成器(Generator)迭代器(Iterator)小练习的全部内容,希望文章能够帮你解决Python中的迭代器(Iterator)与生成器(Generator)生成器(Generator)迭代器(Iterator)小练习所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部