Python 程序设计讲义(50):Python 的可迭代对象与迭代器
Python 程序设计讲义(50):Python 的可迭代对象与迭代器
目录
- Python 程序设计讲义(50):Python 的可迭代对象与迭代器
- 一、可迭代对象(Iterable)
- 二、迭代器(Iterator)
- 三、可迭代对象相关的内置函数
- 1、enumerate()函数
- 2、`zip()`函数
- 3、map()函数
- 4、`filter()`函数
一、可迭代对象(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]