Python 程序设计讲义(50):Python 的可迭代对象与迭代器
目录
- [Python 程序设计讲义(50):Python 的可迭代对象与迭代器](#Python 程序设计讲义(50):Python 的可迭代对象与迭代器)
一、可迭代对象(Iterable)
列表、元组、字符串、集合、字典可以用for ... in进行遍历。
表面上看,只要可以用for ... in进行遍历的对象就是可迭代对象。那么列表、元组、字符串、集合、字典都是可迭代对象。
实际上,如果一个对象实现了__iter__方法,那么这个对象就是可迭代对象。
以列表为例:
            
            
              python
              
              
            
          
          help(list)  # 查看list所拥有的方法
程序运行结果如下:
Help on class list in module builtins:
class list(object)
 |  list(iterable=(), /)
 |
......
 |  __iter__(self, /)
 |      Implement iter(self).
.......我们还可以使用Python的内置函数isinstance()来判断一个对象是否属于可迭代对象。
代码如下:
            
            
              python
              
              
            
          
          from collections.abc import Iterable
obj1=[1,2,3]  #列表
obj2=(4,5,6)  #元组
obj3={1,2,3}  #集合
obj4={1:"党员",2:"团员"}  #字典
obj5=range(3)
print(isinstance(obj1,Iterable))
print(isinstance(obj2,Iterable))
print(isinstance(obj3,Iterable))
print(isinstance(obj4,Iterable))
程序运行结果如下:
True
True
True
True
True二、迭代器(Iterator)
实现了__iter__方法和__next__方法,并且可以通过__next__方法不断返回下一个值的对象称为迭代器。迭代器可以通过内置函数next()访问下一个元素。
列表、元组、字符串、集合、字典实现了__iter__方法,但并未实现__next__方法,因此这些对象都不是迭代器。
可以使用Python的内置函数isinstance()来判断一个对象是否属于迭代器。
代码如下:
            
            
              python
              
              
            
          
          from collections.abc import Iterator
obj1=[1,2,3]  #列表
obj2=(4,5,6)  #元组
obj3={1,2,3}  #集合
obj4={1:"党员",2:"团员"}  #字典
obj5=range(3)
print(isinstance(obj1,Iterator))
print(isinstance(obj2,Iterator))
print(isinstance(obj3,Iterator))
print(isinstance(obj4,Iterator))
print(isinstance(obj5,Iterator))
程序运行结果如下:
False
False
False
False
False虽然列表、元组、字符串、集合、字典都是可迭代对象而不是迭代器。但可以通过iter()函数获得一个迭代器。
代码如下:
            
            
              python
              
              
            
          
          from collections.abc import Iterator
list=[1,2,3]
iter1=iter(list)
print(iter1)
print(next(iter1))
print(next(iter1))
print(next(iter1))
程序运行结果如下:
<list_iterator object at 0x0000022E1F06D2A0>
1
2
3三、可迭代对象相关的内置函数
1、enumerate()函数
enumerate()函数返回包含下标和值的 enumerate对象。 enumerate对象是一个可迭代对象,也是一个迭代器对象。
enumerate()函数的语法格式如下:
            
            
              python
              
              
            
          
          enumerate(iterable, start=0)说明:
(1)第一个参数表示可迭代对象,第二个参数表示下标的开始值,默认为0。
(2)使用list()、tuple()、set()、dict()函数可以将可迭代对象转换为列表、元组、集合与字典。
例如:
            
            
              python
              
              
            
          
          l1=["zhang","wang","li","zhao","liu"]
enum1=enumerate(l1)
print(enum1)
print(type(enum1))
print(list(enum1))
enum1=enumerate(l1,101)
print(enum1)
print(list(enum1))
 #说明:可迭代对象转换为其他类型的可迭代对象,其实就是把可迭代对象的内容取出来,然后转换。
 #转换之后,可迭代对象的内容就清空了。
print(dict(enum1)) #可迭代对象里面已经没有内容了,显示一个空字典
程序运行结果如下:
<enumerate object at 0x000001C05EC4DF80>
<class 'enumerate'>
[(0, 'zhang'), (1, 'wang'), (2, 'li'), (3, 'zhao'), (4, 'liu')]
<enumerate object at 0x000001C05E75D710>
[(101, 'zhang'), (102, 'wang'), (103, 'li'), (104, 'zhao'), (105, 'liu')]
{}上面的程序可以修改为:
            
            
              python
              
              
            
          
          l1=["zhang","wang","li","zhao","liu"]
enum1=enumerate(l1)
print(enum1)
print(type(enum1))
print(list(enum1))
print(enumerate(l1,101))
print(list(enumerate(l1,101)))
print(dict(enumerate(l1,101)))
print(set(enumerate(l1,101)))
print(tuple(enumerate(l1,101)))
程序运行结果如下:
<enumerate object at 0x000001FD7833DF80>
<class 'enumerate'>
[(0, 'zhang'), (1, 'wang'), (2, 'li'), (3, 'zhao'), (4, 'liu')]
<enumerate object at 0x000001FD77E4D710>
[(101, 'zhang'), (102, 'wang'), (103, 'li'), (104, 'zhao'), (105, 'liu')]
{101: 'zhang', 102: 'wang', 103: 'li', 104: 'zhao', 105: 'liu'}
{(103, 'li'), (105, 'liu'), (101, 'zhang'), (104, 'zhao'), (102, 'wang')}
((101, 'zhang'), (102, 'wang'), (103, 'li'), (104, 'zhao'), (105, 'liu'))2、zip()函数
zip()函数可以将多个迭代器对象,或者可迭代对象中的元素压缩在一起,返回一个zip对象。zip对象是一个可迭代对象,也是一个迭代器对象。
zip()函数的语法格式如下:
            
            
              python
              
              
            
          
          zip(iter1[,iter2[,...]])说明:
zip()函数将多个可迭代对象对应的元素打包成一个一个的元组。因此,zip对象的元素是元组。
例如:
(1)指定一个参数
注意:如果zip()函数只有一个参数,则zip对象不能转换为字典。
代码如下:
            
            
              python
              
              
            
          
          l1=["zhang","wang","li","zhao","liu"]
z1=zip(l1)
print(z1)
print(type(z1))
print(list(z1))
程序运行结果如下:
<zip object at 0x000002425751D0C0>
<class 'zip'>
[('zhang',), ('wang',), ('li',), ('zhao',), ('liu',)](2)指定两个参数
如果zip()函数包含两个参数,则zip对象可以转换为字典。
代码如下:
            
            
              python
              
              
            
          
          t1=(101,102,103,104,105)
l1=["zhang","wang","li","zhao","liu"]
z1=zip(t1,l1)
print(z1)
print(type(z1))
print(dict(z1))
程序运行结果如下:
<zip object at 0x00000255C5FCD000>
<class 'zip'>
{101: 'zhang', 102: 'wang', 103: 'li', 104: 'zhao', 105: 'liu'}(3)指定多个参数
注意:如果zip()函数不是两个参数,则zip对象不能转换为字典。
代码如下:
            
            
              python
              
              
            
          
          t1=(101,102,103,104,105)
l1=["zhang","wang","li","zhao","liu"]
l2=[25,22,23,21,25]
z1=zip(t1,l1,l2)
print(z1)
print(type(z1))
print(list(z1))
程序运行结果如下:
<zip object at 0x0000016D79FCD0C0>
<class 'zip'>
[(101, 'zhang', 25), (102, 'wang', 22), (103, 'li', 23), (104, 'zhao', 21), (105, 'liu', 25)]3、map()函数
map()函数把一个函数依次映射到可迭代对象的每一个元素,返回一个map对象。
map对象既是一个可迭代对象,也是一个迭代器。
map()函数的语法如下:
            
            
              python
              
              
            
          
          map(func, *iterables)说明:
func函数的参数个数必须和*iterables参数中可迭代对象的个数一致。运行时,先依次取出每个可迭代对象的第一个元素,作为函数的实参,得到一个返回值作为map对象的第一个元素。再依次取出每个可迭代对象的第二个元组,作为函数的实参,得到的返回值作为map对象的第二个元素。以此类推。
例如:
(1)func是类型名
代码如下:
            
            
              python
              
              
            
          
          t1=(10.1,10,3.75,115,38)
m1=map(int,t1)
m2=map(float,t1)
print(m1)
print(type(m1))
print(list(m1))
print(list(m2))
程序运行结果如下:
<map object at 0x0000017854099E40>
<class 'map'>
[10, 10, 3, 115, 38]
[10.1, 10.0, 3.75, 115.0, 38.0](2)func是函数名
            
            
              python
              
              
            
          
          def func1(x,y):
    return x**2+y**2
t1=[1,2,3,4,5]
t2=[11,12,13,14,15]
m1=map(func1,t1,t2)
print(m1)
print(type(m1))
print(list(m1))
程序运行结果如下:
<map object at 0x000001AE88779ED0>
<class 'map'>
[122, 148, 178, 212, 250]4、filter()函数
filter()函数把一个带有一个参数的函数作用到一个可迭代对象上,返回一个filter对象。
filter对象中的元素由可迭代对象中使得函数返回值为True的元素组成。如果指定函数为None,则返回可迭代对象中等价于True的元素。
filter()函数的语法格式如下:
            
            
              python
              
              
            
          
          filter(func|None, iterable)例如:
(1)第一个参数为None的情况
代码如下:
            
            
              python
              
              
            
          
          t1=[18.75,2,0,4,5,0.0]
f1=filter(None,t1)
print(f1)
print(type(f1))
print(list(f1))
程序运行结果如下:
<filter object at 0x0000011B7E24D300>
<class 'filter'>
[18.75, 2, 4, 5](2)第一个参数为一个函数
            
            
              python
              
              
            
          
          def func1(x):
    return x%2==0
r1=range(10)
f1=filter(func1,r1)  #把所有的偶数添加到filter对象中。
print(f1)
print(type(f1))
print(list(f1))
程序运行结果如下:
<filter object at 0x000002ADA9B49D50>
<class 'filter'>
[0, 2, 4, 6, 8]