灵虚御风
醉饮千觞不知愁,忘川来生空余恨!

导航

 
""""""
"""1.迭代器对象 __iter__"""
"""
什么是迭代器
迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果
迭代器:迭代取值的工具

为什么要用
迭代器给你提供了一种不依赖于索引取值的方式

如何用
"""
# 不算 因为只是简单的重复
# n = 0
# while True:
# print(n)


# 重复 + 每次迭代都是基于上一次的结果而来的
# l = [1,2,3,4]
# s = 'hello'
# n = 0
# while n < len(s):
# print(s[n])
# n += 1
"""
需要迭代取值的数据类型
字符串
列表
元组
字典
集合
"""

# 可迭代对象
# 只有内置有__iter__方法的都叫做可迭代对象
"""
补充:针对双下线开头双下划线结尾的方法
推荐读:双下+方法名

基本数据类型中
是可迭代对象的有
str list tuple dict set
文件对象(执行内置的__iter__之后还是本身 没有任何变化):文件对象本身就是迭代器对象

"""
n = 1
f = 1.1
s = 'hello'
l = [1, 2, 34, ]
t = (1, 2, 34)
s1 = {1, 2, 3, 4}
d = {'name': 'jason'}
f1 = open('13.迭代器,生成器,常用内置方法', 'w+', encoding='utf-8')

#
# res = s.__iter__() # res = iter(s)
#
# print(s.__len__()) # 简化成了len(s)
# res1 = l.__iter__() # res1 = iter(l)
# res2 = f1.__iter__() # res2 = iter(f1)
# print(res,res1,res2)
# print(f1)

# 可迭代对象执行内置的__iter__方法得到就是该对象的迭代器对象

"""2.迭代器取值 __next__"""
"""
迭代器对象
1.内置有__iter__方法
2.内置有__next__方法
ps:迭代器一定是可迭代对象
而可迭代对象不一定是迭代器对象
"""



# l = [1,2,3,4]
# # 生成一个迭代器对象
# iter_l = l.__iter__()
#
# # 迭代器取值 调用__next__
# print(iter_l.__next__())
# print(iter_l.__next__())
# print(iter_l.__next__())
# print(iter_l.__next__())
# print(iter_l.__next__()) # 如果取完了 直接报错


# d = {'name':'jason','password':'123','hobby':'泡m'}
# # 将可迭代对象d转换成迭代器对象
# iter_d = d.__iter__()
# # 迭代器对象的取值 必须用__next__
# print(iter_d.__next__())
# print(iter_d.__next__())
# print(iter_d.__next__())
# print(iter_d.__next__()) # 取完了 报错StopIteration

f11 = open('13.迭代器,生成器,常用内置方法','r',encoding='utf-8')
# 调用f1内置的__iter__方法
# iter_f = f11.__iter__()
# print(iter_f is f11)
"""
迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身(******)
"""
# print(f1 is f1.__iter__().__iter__().__iter__().__iter__())
"""
问:__iter__方法就是用来帮我们生成迭代器对象
而文件对象本身就是迭代器对象,为什么还内置有__iter__方法???
"""


d1 = {'name':'jason','password':'123','hobby':'泡m'}
# iter_d1 = d1.__iter__()


# print(d1.__iter__().__next__())
# print(d1.__iter__().__next__())
# print(d1.__iter__().__next__())

# print(iter_d1.__next__())
# print(iter_d1.__next__())
# print(iter_d1.__next__())
# print(iter_d1.__next__())

# 异常处理
# while True:
# try:
# print(iter_d.__next__())
# except StopIteration:
# # print('老母猪生不动了')
# break


# f = open('13.迭代器,生成器,常用内置方法','r',encoding='utf-8')
# iter_f = f.__iter__()
# print(iter_f.__next__())
# print(iter_f.__next__())
# print(iter_f.__next__())
# print(iter_f.__next__())
# print(iter_f.__next__())

"""
迭代器取值的特点
1.只能往后依次取 不能后退

"""


"""3.for循环的本质"""
d2 = {'name': 'jason', 'password': '123', 'hobby': '泡m'}
# for i in d2:
# print(i)
# for循环后面的in关键 跟的是一个可迭代对象
"""
for循环内部的本质
1.将in后面的对象调用__iter__转换成迭代器对象
2.调用__next__迭代取值
3.内部有异常捕获StopIteration,当__next__报这个错 自动结束循环
"""
# for i in 1:
# pass
# iter(1)


"""
可迭代对象:内置有__iter__方法的
迭代器对象:既内置有__iter__也内置有__next__方法

迭代取值:
优点
1.不依赖于索引取值
2.内存中永远只占一份空间,不会导致内存溢出

缺点
1.不能够获取指定的元素
2.取完之后会报StopIteration错

"""
# l = [1,2,3,4]
# res = map(lambda x:x+1,l)
# print(map(lambda x:x+1,l))
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())

l1 = [1, 2, 3, 4, 5]
l2 = ['a', 'b', 'c']
print(zip(l1, l2))
posted on 2022-03-24 15:56  没有如果,只看将来  阅读(16)  评论(0编辑  收藏  举报