Python3之迭代器和生成器

本文介绍了Python3中的可迭代对象、迭代器和生成器。可迭代对象包含"__iter__"方法,如字符串、列表等。迭代器需同时拥有"__iter__"和"__next__"方法,可通过iter()和next()进行操作。生成器是返回迭代器的函数,使用yield实现暂停和恢复执行。StopIteration异常用于标记迭代结束。
摘要由CSDN通过智能技术生成

一、可迭代对象

1、可迭代对象

内部含有"__iter__"方法的对象,即为可迭代对象。字符串、列表、元组、集合、字典、range都是可迭代对象

2、获取对象的所有方法

通过dir(对象)来获取一个对象的所有方法

3、判断一个对象是否是可迭代对象

"__iter__" in dir(对象),判断一个对象是否是可迭代对象

"""
一、可迭代对象
1、创建一个对象,如列表
2、打印出对象的所有方法
3、判断对象是否是可迭代对象
"""
list_A = ['Kobe' , 'Curry']
# 打印list_A的所有方法
print("list_A的所有方法为 :" , dir(list_A))
# 判断list_A对象是否为一个可迭代对象
print("list_A是否为一个可迭代对象:" , ('__iter__' in dir(list_A)))
list_A的所有方法为 : ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
list_A是否为一个可迭代对象: True

二、迭代器

1、定义

内部含有"__iter__"方法和"__next__"方法的对象

2、判断一个对象是否是迭代器

"__iter__" in dir(对象) and "__next__" in dir(对象) ,判断一个对象是否是迭代器

3、迭代器基本方法

迭代器有两个基本方法:iter() 和 next()

a、可使用iter()方法将可迭代对象(字符串、列表、元组、集合、字典、range)转换为迭代器(即创建迭代器)

b、可使用for循环遍历迭代器

c、next()函数实现for循环,完成迭代器遍历

"""
二、迭代器
1、创建一个可迭代对象
2、iter()方法创建迭代器对象
3、使用for循环遍历迭代器
4、使用while和next()方法输出迭代器
"""
listA = [1 ,2 ,3 , 4 , 5]
# iter()方法创建迭代器
it = iter(listA)

# 使用next()方法输出迭代器元素
print("使用next()方法输出迭代器元素:" , next(it))

# 使用for循环遍历迭代器元素
for i in it:
    print( i , end = ' ')

# 使用while和next()方法输出迭代器
import sys
listB = [1 ,2 ,3 ]
it_B = iter(listB)
while True:
    try:
        print(next(it_B) , end= ' ')
    except:
        sys.exit()

 4、创建迭代器

将类作为迭代器使用,需要在类中实现__iter__()和__next__()两个方法;

__iter__() 方法返回一个特殊的迭代器对象, 该迭代器对象实现了 __next__() 方法并通过 StopIteration 异常表明迭代的完成;

__next__() 方法会返回下一个迭代器对象

5、StopIteration

StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中可以通过设置在完成指定循环次数后触发 StopIteration 异常来结束迭代

class Odd_number:

    # 定义__iter__()方法,迭代器赋初始值
    def __iter__(value):
        value.a = 1
        return value

    # 定义__next__()方法,实现迭代器中元素循环增加,超过20时停止迭代
    def __next__(value):
        while value.a <=20:
            x = value.a
            value.a +=1
            if value.a %2 ==0:
                continue
            else:
                return x
        else:
            raise StopIteration

# 类实例化
num = Odd_number()
# 创建迭代器
it = iter(num)
# 定义一个列表listA,用于储存输出的元素
listA = list()
for i in it:
    listA.append(i)
print("输出的列表元素为:" , listA)
输出的列表元素为: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

三、生成器

 python3中,使用了 yield(产量) 的函数被称为生成器(generator);

生成器是一个返回类型为迭代器的函数,只能用于迭代操作,即生成器就是一个迭代器;

调用一个生成器函数,返回的是一个迭代器对象;

调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行;

"""
三、生成器
"""
# 使用 yield 实现斐波那契数列
import sys
def fibonacci(n,w=0): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n):
            return
        yield a
        a, b = b, a + b
        print('%d,%d' % (a,b))
        counter += 1
f = fibonacci(10,0) # f 是一个迭代器,由生成器返回生成

while True:
    try:
        print (next(f), end=" ")
    except :
        sys.exit()
0 1,1
1 1,2
1 2,3
2 3,5
3 5,8
5 8,13
8 13,21
13 21,34
21 34,55
34 55,89
55 89,144
"""
三、生成器
"""
# 使用 yield 实现斐波那契数列
import sys
def fibonacci(n,w=0): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n):
            return
     #  yield a
        a, b = b, a + b
        print('%d,%d' % (a,b))
        counter += 1
f = fibonacci(10,0) # f 是一个迭代器,由生成器返回生成

while True:
    try:
        print (next(f), end=" ")
    except :
        sys.exit()
1,1
1,2
2,3
3,5
5,8
8,13
13,21
21,34
34,55
55,89
89,144

参考文档:https://www.cnblogs.com/wj-1314/p/8490822.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值