Python-迭代和迭代器

目录:https://www.jianshu.com/p/863c446364a8

一、迭代

1、迭代:

在Python中,如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Iteration)。

2、可迭代对象:

(1)、定义

字面意思:可以进行循环更新的一个实实在在的值。

专业角度:内部含有'__iter__'方法的对象。

我们之前学过的可迭代对象有:列表、字符串、元组、字典,集合、range、文件。

(2)、获取对象的所有方法并且以字符串的形式表现:dir()

st1="python"

li1=[1,2,3]

print(dir(st1))              #这是将会运行出st1所有的方法

print(dir(li))

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

st1="python"

print('__iter__' in dir(st1))    #判断st1是否为可迭代对象

print('__iter__' in dir(range(10)))      #判断range(10)是否为可迭代对象

运行结果为:

True

True    #当对象为可迭代对象是返回True

或者

from collections import Iterable  #判断之前需导入内置库

s='hello'

print(isinstance(s,Iterable))       #判断是不是可迭代对象

运行结果为:

True

(4)、可迭代对象的优缺点

优点:

1、存储的数据直接能显示,比较直观。

2、拥有的方法比较多,操作方便。

缺点:

1、占用内存

2、不能直接通过for循环,不能直接取值(索引,key)

二、迭代器

1、定义:

内部含有'__iter__'方法并且含有'__next__'方法的对象就是迭代器。

2、判断是否为迭代器:

'__iter__'and '__next__'在不在dir(对象)(我们之前学过的迭代器只有文件)

f=open("1.txt","r")

print('__iter__'in dir(f)and '__next__'in dir(f))

运行结果为:

True

3、可迭代对象可以转换为迭代器

st1="python"

obj=iter(st1)     #将st1转换为迭代器

print(obj)           #输出的结果是字符串迭代器对象的地址

运行结果为: 

##当st1为迭代器时就可以用'__next__'方法了

print(next(obj))  #注意这时是把obj作为一个迭代器,并不是st1,st1还是可迭代对象。

运行结果为:

p    #运行一次next方法就输出一次字符,直到字符串中所有字符全部输出时,再

次运行就会报错。

print(next(obj)) 

print(next(obj)) 

print(next(obj)) 

print(next(obj)) 

print(next(obj))      #这时字符全部输出

print(next(obj))  #这时在print时就会报错

报错为:

print(next(obj))

StopIteration

4、遍历可迭代对象和遍历迭代器的区别:

#可迭代对象

li=[1,2,3,4,5,6,7,,8,9,10]

count=0

for i in li:

    if count ==4:

        break

    else:

        print(i)

    count +=1

count=0

for i in li:

    if count ==6:

break

else:

print(i)

    count +=1

运行结果为:

1 2 3 4 1 2 3 4 5 6

#迭代器

li=[1,2,3,4,5,6,7,,8,9,10]

obj=iter(li)

for i in range(4):

    print(next(obj))

for i in range(6):

    print(next(obj))

运行结果为:

1

2

3

4

5

6

7

8

9

10

当我们遍历可迭代对象时,每一次循环都会开头遍历。而当我们遍历迭代器时,会接着上次执行到的位置再次执行。

5、迭代器的优缺点:

优点:
1、节省内存

2.、惰性机制,next一次,去一个值。

缺点:

1、速度慢

2、不走回头路

6、迭代器和可迭代对象的对比:

可迭代对象是一个操作方法比较多,比较直观,存储数据相对少的一个数据集。

当你侧重于对于数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。

迭代器是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。

当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。

7、while模拟for的内部循环机制:

   for循环的循环对象一定要是可迭代对象,但是这不意味着可迭代对象就可以取值,因为for循环的内部机制是:将可迭代对象转换成迭代器,然后利用next进行取值,最后利用异常处理处理StopIteration抛出的异常。

l1 = [1, 2, 3, 4, 5, 6]

# 1 将可迭代对象转化成迭代器

obj = iter(l1)

# 2,利用while循环,next进行取值

while 1:

    # 3,利用异常处理终止循环

    try:

        print(next(obj))

    except StopIteration:

        break


你可能感兴趣的:(Python-迭代和迭代器)