ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python学习笔记(7)迭代器和生成器

2021-08-07 15:32:51  阅读:179  来源: 互联网

标签:__ .__ 迭代 python self 生成器 iter next print


# 可迭代对象:
    # 类型中申明了一个__iter__方法,同时该方法返回一个迭代器对象
    # 能够用for循环的都是可迭代对象
    # 列表、元组、字典、集合都是可迭代对象

# 迭代器:
    # 类型中申明了一个__next__方法

# for循环原理
    # (1) 调用 in 后面对象的__iter__方法,获得一个迭代器对象iter
    # (2) 不断的调用迭代器对象iter的__next__方法将返回值赋值给给变量i,知道收到StopIteration退出循环

from typing import Counter


l = [1,2,3]
iter = l.__iter__()
print(iter.__next__())  # 1
print(iter.__next__())  # 2
print(iter.__next__())  # 3
#print(iter.__next__())  # 只有三个值,第四个报错:StopIteration

# 实现一个迭代器
l = [i for i in range(1,101)]
#print(l)
# 所有的数据都存在到列表内存中,若要存大量数据,内存不足
class MyIter(object):
    def __init__(self) -> None:
        self.n = 0
        self.max = 5
    
    def __iter__(self):
        return self

    def __next__(self):
        if self.n < self.max:
            self.n += 1
        else:
            raise StopIteration
        return self.n

obj = MyIter()
obj.__iter__()
obj.__next__()
print(obj.__next__())

for i in obj:
    print(i)

##################################################
# 可以拆开,将iter和next方法写在两个类里面
class Num5(object):
    def __iter__(self):
        return MyIter()

class MyIter(object):
    def __init__(self) -> None:
        self.n = 0
        self.max = 5

    def __next__(self):
        if self.n < self.max:
            self.n += 1
        else:
            raise StopIteration
        return self.n

obj = Num5()

for i in obj:
    print(i)
###############################################
# 生成器:
    # 生成器是一个特殊的迭代器

def getNum():
    count = 0
    while count < 5:
        count += 1
        yield count

l = getNum()  # 创建生成器对象
print(l.__next__())
print(l.__next__())
for i in l:
    print(i)

 

标签:__,.__,迭代,python,self,生成器,iter,next,print
来源: https://www.cnblogs.com/tortoise512/p/15112024.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有