最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

Python迭代器是啥?

来源:博客园

迭代器:迭代的工具。迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的。如计算机中的迭代开发,就是基于软件的上一个版本更新。以下代码就不是迭代,它只是单纯的重复

while True:    print("*"*10)

一、可迭代对象

python中一切皆对象,如


(资料图片)

x = 1name = "nick"lis = [1, 2]tup = (1, 2)dic = {"name": "nick"}s1 = {"a", "b"}def func():    passf = open("49w.txt", "w", encoding="utf-8)

对于这一切的对象中,但凡有__iter__方法的对象,都是可迭代对象。

# x = 1.__iter__  # SyntaxError: invalid syntax# 以下都是可迭代的对象name = "nick".__iter__lis = [1, 2].__iter__tup = (1, 2).__iter__dic = {"name": "nick"}.__iter__s1 = {"a", "b"}.__iter__f = open("49w.txt", "w", encoding="utf-8")f.__iter__f.close()

总结

可迭代的对象:Python内置str、list、tuple、dict、set、file都是可迭代对象。

特点:

内置有__iter__方法的都叫可迭代的对象。

二、迭代器对象

只有字符串和列表都是依赖索引取值的,而其他的可迭代对象都是无法依赖索引取值的。因此我们得找到一个方法能让其他的可迭代对象不依赖索引取值。

在找到该方法前,首先我们给出迭代器对象的概念:可迭代的对象执行__iter__方法得到的返回值。并且可迭代对象会有一个__next__方法。

  • 不依赖索引的数据类型迭代取值
dic = {"a": 1, "b": 2, "c": 3}iter_dic = dic.__iter__()print(iter_dic.__next__())print(iter_dic.__next__())print(iter_dic.__next__())# print(iter_dic.__next__())  # StopIteration:

输出

abc
  • 依赖索引的数据类型迭代取值
lis = [1, 2, 3]iter_lis = lis.__iter__()print(iter_lis.__next__())print(iter_lis.__next__())print(iter_lis.__next__())# print(iter_lis.__next__())  # StopIteration:

输出

123

上述的方法是非常繁琐的,我们可以使用while循环精简下。其中使用的try...except...为异常处理模块,以后会详细讲解。

s = "hello"iter_s = s.__iter__()#学习中遇到问题没人解答?小编创建了一个Python学习交流群:489111204 while True:    try:        print(iter_s.__next__())    except StopIteration:        break

输出

hello

总结

迭代器对象:执行可迭代对象的__iter__方法,拿到的返回值就是迭代器对象。

特点:

  • 内置__next__方法,执行该方法会拿到迭代器对象中的一个值
  • 内置有__iter__方法,执行该方法会拿到迭代器本身
  • 文件本身就是迭代器对象。

缺点:

  • 取值麻烦,只能一个一个取,并且只能往后取,值取了就没了
  • 无法使用len()方法获取长度

三、for循环原理

for循环称为迭代器循环,in后必须是可迭代的对象。

lis = [1, 2, 3]for i in lis:    print(i)

输出

123

因为迭代器使用__iter__后还是迭代器本身,因此for循环不用考虑in后的对象是可迭代对象还是迭代器对象。

由于对可迭代对象使用__iter__方法后变成一个迭代器对象,这个迭代器对象只是占用了一小块内存空间,他只有使用__next__后才会吐出一个一个值。如lis = [1,2,3,4,5,...]相当于一个一个鸡蛋,而lis = [1,2,3,4,5,...].__iter__相当于一只老母鸡,如果你需要蛋,只需要__next__即可。

print(range(10))  # range(0, 10)

关键词: 一个一个 数据类型