python函数 | 迭代器

 

python 一切皆对象, 能被for循环的对象就是可迭代对象。

迭代器: f1文件句柄

 

dir打印该对象的所有操作方法

s = 'python'
print(dir(s))

执行输出:

复制代码
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
复制代码

一、可迭代对象

对象内部含有__iter__方法就是可迭代对象,例如 str、list、dict、tuple、set、range()

 查看某个对象是否是可迭代对象,有2种方式

  •   print('__iter__' in dir(对象))

 

  •   from collections import Iterable

         print(isinstance(对象,Iterable))

 

第一种:

s = 'python'
print('__iter__' in dir(s))
执行输出:True

第二种:

from collections import Iterable

l = [1, 2, 3, 4]
print(isinstance(l, Iterable))           # True

二、迭代器

对象内部含有__iter____next__方法就是迭代器,文件句柄就是迭代器。

 

1. 可迭代对象转化成迭代器:可迭代对象.__iter__() --->迭代器

l1 = [1,2,3]
l1_obj = l1.__iter__()                                   # 迭代器
print(l1_obj)             # 表示它是一个列表迭代器对象

 

2. 判断方法是否是迭代器的方法

①print('__iter__' in dir(对象))

  print('__next__' in dir(对象))

两个都必须是True, 这种方法居多

 

② from collection import Iterator

    print(isinstance(对象,Iterator))

 

方法1:

with open('a', encoding='utf-8') as f1:
    print('__iter__'in dir(f1))
    print('__next__'in dir(f1))

 

方法2:

from collections import Iterator
print(isinstance(f1,Iterator))         # True

 

例:

l1 = [1,2,3]
l1_obj = l1.__iter__()              # 转换为迭代器
print('__iter__' in  dir(l1_obj))          
print('__next__' in  dir(l1_obj)) 
执行输出:从结果中,可以看出l1_obj是同时含有__iter__和__next__的对象,所以它是迭代器
True
True 

3. 迭代器使用__next__()获取一个值

l1 = [1,2,3]
l1_obj = l1.__iter__()          # 迭代器
print(l1_obj.__next__())         # 获取一个元素
print(l1_obj.__next__())
print(l1_obj.__next__())
print(l1_obj.__next__())

多取了一个,就会报错,因为列表只有3个元素

s1 = 'sadda'
ite1 = iter(s1)
while 1:
    try:
        print(ite1.__next__())

    except StopIteration:
        break

面试题:使用whlie循环去遍历一个有限对象

l2 = [1, 2, 3, 4, 5, 6, 7, 8]
l2_obj = l2.__iter__()                     #1.将可迭代对象转化成迭代器
while True:
    try:
        i = l2_obj.__next__()                 #内部使用__next__方法取值
        print(i)

    except Exception:                     #运用了异常处理去处理报错
        break 

 

for循环的内部运行机制

① 将可迭代对象转化为迭代器

② 调用__next__方法取值

③ 利用异常处理机制停止报错

l1 = [1,2,3]
l1_obj = l1.__iter__()  # 转换为迭代器
for i in l1_obj:
    print(i) 
执行输出:for循环的内部机制,就是用__next__方法执行的。为什么没有报错呢?它内部有异常处理机制
1
2
3

三、迭代器的好处

1)节省内存空间。迭代器最大的好处好的程序员,会在内存优化方面考虑,比如迭代器。

2)满足惰性机制。

3)不能反复取值,不可逆。不可逆,表示,已经取过的值,不能再次取,它只能取下一个。

 

总结:

1.什么是可迭代对象,什么是迭代器

仅含有__iter__方法的对象,就是可迭代对象 包含__iter__和__next__方法的对象,就是迭代器

 

2.可迭代对象如何转化成迭代器

转化成迭代器:可迭代对象.__iter__() 

例如

l1 = [1,2,3]
l1_obj = l1.__iter__()

 

3.迭代器如何取值 

迭代器使用__next__()方法

你可能感兴趣的:(python函数 | 迭代器)