加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

了解 Python迭代器和生成器

发布时间:2021-11-12 09:45:02 所属栏目:PHP教程 来源:互联网
导读:Python迭代器和生成器都是访问集合元素的一种方式。 一、迭代器 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 字符串,列表或元组对象都可用于创建迭代器。 1、迭

Python迭代器和生成器都是访问集合元素的一种方式。
 
一、迭代器
 
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
字符串,列表或元组对象都可用于创建迭代器。
 
1、迭代器有两个基本的方法:
iter() 创建迭代器对象
next() 输出迭代器的下一个元素
 
from collections.abc import Iterator
 
s = '123'
it1 = iter(s)
print(isinstance(it1, Iterator)) #判断一个对象是否迭代器对象,输出:True
print(next(it1)) #输出:1
print(next(it1)) #输出:2
print(next(it1)) #输出:3
#print(next(it1)) #超出范围会运行报错StopIteration
 
li = [1,2,3]
it2 = iter(li)
print(next(it2)) #输出:1
print(next(it2)) #输出:2
print(next(it2)) #输出:3
 
it3 = iter(li)
#用list可将迭代器转换为列表
print(list(it3))
 
关于 Python迭代器和生成器
 
2、迭代器遍历的两种方式:for、while
 
import sys
 
s = '123'
it1 = iter(s)
for i in it1:
    print(i)
 
 
li = [1,2,3]
it2 = iter(li)
while True:
    try:
        print(next(it2))
    except StopIteration:
        sys.exit()
 
关于 Python迭代器和生成器
 
3、把一个类作为迭代器使用:在类中实现__iter__()与 __next__() 方法
 
# 斐波那契数列
class Fibs:
    def __init__(self):
        self.a = 0
        self.b = 1
    def __next__(self):
        self.a,self.b = self.b, self.a+self.b
        return self.a
    def __iter__(self):
        return self
 
fibs = Fibs()
for f in fibs:
    if f > 1000:
        print(f)
        break
 
关于 Python迭代器和生成器
 
二、生成器
 
生成器是一种特殊的迭代器,使用了 yield 的函数被称为生成器,即生成器是一个返回迭代器的函数,只能用于迭代操作。
 
1、创建生成器
 
# 生成器函数
def Fibs(n):
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n):
            return
        yield a
        a, b = b, a + b
        counter += 1
 
 
f = Fibs(6) # f是一个迭代器
print(next(f))
print(next(f))
print(next(f))    #可以用next
print(f.__next__()) #也可以用__next__
print(f.__next__())
print(f.__next__())
print(f.__next__())
 
'''输出:
0
1
1
2
3
5
8
'''
for f in Fibs(6):
    print(f)
'''输出:
0
1
1
2
3
5
8
'''
 
关于 Python迭代器和生成器
 
2、生成器表达式
 
生成器表达式与列表推导式类似,不同之处是最外层的[]换成(),不立即执行循环,而是返回一个生成器。
 
r = (i*2 for i in range(5))
print(next(r))
print(next(r))
print(next(r))
print(next(r))
print(next(r))
 
'''输出:
0
2
4
6
8
'''
 
''' 也可以遍历
for i in r:
    print(i)
'''
 
 
r2 = sum(i*2 for i in range(5))
print(r2)
 
'''输出:
20
'''
 
 

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读