温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

python迭代、可迭代、迭代器举例分析

发布时间:2021-11-25 13:40:01 来源:亿速云 阅读:156 作者:iii 栏目:互联网科技

这篇文章主要讲解了“python迭代、可迭代、迭代器举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python迭代、可迭代、迭代器举例分析”吧!

下面我们通过斐波那契数列类的案例来详细了解迭代器、生成器。

class Fib(object):
    # count表示生成斐波那契数列的个数
    def __init__(self, count):
        self.count = count
        # 保存前两个值
        self.x = 0
        self.y = 1
        # 记录生成数列的下标
        self.index = 0

    # 声明Fib类是可迭代的
    def __iter__(self):
        return self

    # 生成下一个数
    def __next__(self):
        if self.index < self.count:
            result = self.x
            self.x, self.y = self.y, self.x + self.y
            self.index += 1
            return result
        else:
            raise StopIteration


# 创建迭代器
fib = Fib(6)
# 获取迭代器下一个值
print(next(fib))

# 遍历迭代器其余的值
for value in fib:
    print(value)
    
print(fib)
ll = (i for i in range(10))
print(ll)

out:
0
1
1
2
3
5
<__main__.Fib object at 0x000001E493DF5700>
<generator object <genexpr> at 0x000001E493936430>

迭代器(iterator)

迭代器指有__iter__方法的函数或类运行或创建实例后生成的命名空间。打印迭代器显示的就是某某对象在内存某处,迭代器实质是一个内存地址,通过特定的方法访问该地址可以获得相应的数据。

紧接着前面的代码,测试下列代码。

fib1 = Fib(6)
fib2 = Fib(5)
print(fib1)
print(fib2)

out:
<__main__.Fib object at 0x000001AD3E445700>
<__main__.Fib object at 0x000001AD3E48A4F0>

可以看到fib1和fib2虽然内部代码相同,但由于它们的参数不同所以它们有不同的命名空间,那么它们就是不同的迭代器。

生成器(generator)

生成器指获取迭代器内部数据的方法或函数。注意方法和函数本身不是生成器,只有执行后有命名空间且可以返回值的才是生成器。

def even(n):  # 定义一个返回值是偶数的生成器,值范围在0至n之间
    i = 0
    while i <= n:
        if i % 2 == 0:
            yield i
        i += 1


print('__iter__' in dir(even))
print('__next__' in dir(even))

num = even(5)

print('__iter__' in dir(num))
print('__next__' in dir(num))

out:
False
False
True
True

生成器有2种:

  1. 通过__next__方法return返回值。例子是上面的Fib类。

  2. 通过yield或yield from语句返回值。例子是上面的even函数。有yield或yield from语句的函数在执行后会自动生成__iter__方法和__next__方法。

感谢各位的阅读,以上就是“python迭代、可迭代、迭代器举例分析”的内容了,经过本文的学习后,相信大家对python迭代、可迭代、迭代器举例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI