Python 程序设计讲义(50):Python 的可迭代对象与迭代器

发布于:2025-08-05 ⋅ 阅读:(13) ⋅ 点赞:(0)

Python 程序设计讲义(50):Python 的可迭代对象与迭代器

一、可迭代对象(Iterable)

列表、元组、字符串、集合、字典可以用for ... in进行遍历。

表面上看,只要可以用for ... in进行遍历的对象就是可迭代对象。那么列表、元组、字符串、集合、字典都是可迭代对象。

实际上,如果一个对象实现了__iter__方法,那么这个对象就是可迭代对象。

以列表为例:

help(list)  # 查看list所拥有的方法

程序运行结果如下:
Help on class list in module builtins:

class list(object)
 |  list(iterable=(), /)
 |
......
 |  __iter__(self, /)
 |      Implement iter(self).
.......

我们还可以使用Python的内置函数isinstance()来判断一个对象是否属于可迭代对象。

代码如下:

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()来判断一个对象是否属于迭代器。

代码如下:

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()函数获得一个迭代器。

代码如下:

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()函数的语法格式如下:

enumerate(iterable, start=0)

说明:

(1)第一个参数表示可迭代对象,第二个参数表示下标的开始值,默认为0

(2)使用list()tuple()set()dict()函数可以将可迭代对象转换为列表、元组、集合与字典。

例如:

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')]
{}

上面的程序可以修改为:

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()函数的语法格式如下:

zip(iter1[,iter2[,...]])

说明:

zip()函数将多个可迭代对象对应的元素打包成一个一个的元组。因此,zip对象的元素是元组。

例如:

(1)指定一个参数

注意:如果zip()函数只有一个参数,则zip对象不能转换为字典。

代码如下:

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对象可以转换为字典。

代码如下:

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对象不能转换为字典。

代码如下:

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()函数的语法如下:

map(func, *iterables)

说明:

func函数的参数个数必须和*iterables参数中可迭代对象的个数一致。运行时,先依次取出每个可迭代对象的第一个元素,作为函数的实参,得到一个返回值作为map对象的第一个元素。再依次取出每个可迭代对象的第二个元组,作为函数的实参,得到的返回值作为map对象的第二个元素。以此类推。

例如:

(1)func是类型名

代码如下:

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是函数名

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()函数的语法格式如下:

filter(func|None, iterable)

例如:

(1)第一个参数为None的情况

代码如下:

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)第一个参数为一个函数

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]

网站公告

今日签到

点亮在社区的每一天
去签到