可迭代对象(Iterable)
- 可迭代对象:可以实现iter方法,可以用for…in…进行遍历的对象
- 可以通过调用python内置对象函数isinstance()来判断一个对象是否属于可迭代对象
>>> from collections.abc import Iterable
>>> isinstance(['abc',1,8.5],Iterable)
True
>>> isinstance(('abc',1,8.5),Iterable)
True
>>> isinstance({1:'one',2:'two'},Iterable)
True
>>> isinstance({'one','two'},Iterable)
True
>>> isinstance('abcdefg',Iterable)
True
>>> isinstance(range(10),Iterable) //range对象是可迭代的
True
>>> isinstance(123,Iterable) //一个数字是不可迭代的
False
迭代器(Iterator)
- 迭代器:实现了iteration方法和next方法,并且可以通过next方法不断返回下一个值的对象
- 迭代器可以通过内置函数next()访问下一个元素
- 可以通过调用python内置函数isinstance()来判断一个对象是否属于迭代器
>>> from collections.abc import Iterator
>>> isinstance([],Iterator)
False
>>> isinstance((),Iterator)
False
>>> isinstance({1:'one',2:'two'},Iterator)
False
>>> isinstance({'one','two'},Iterator)
False
>>> isinstance('abcdefg',Iterator)
False
>>> isinstance(range(10),Iterator)
False
>>> isinstance(123,Iterator)
False
(注意:列表,元组,字符串,字典,集合实现了iter方法,但并未实现next方法,这些对象均不能成为迭代器,但可以通过iter()函数获取一个迭代器)
>>> from collections.abc import Iterator
>>> vehicle=['train','bus','car','ship']
>>> v=iter(vehicle)
>>> type(v)
<class 'list_iterator'>
>>> isinstance(v,Iterator) #是否迭代器(Iterator)
True
>>> v.__next__()
'train'
>>> v.__next__() #返回下一个值
'bus'
>>> next(v) #通过内置函数next()访问下一个值
'car'
>>> v.__next__()
'ship'
>>> v.__next__() #没有下一个元素了,触发迭代停止StopIteration异常
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
v.__next__()
StopIteration
相关内置函数
1.enumerate()
- 格式:enumerate(iterable, start=0)
- 功能:返回下标和值的enumerate对象。第1个参数表示可迭代(Iterable)对象,第2个参数表示下标的开始值,默认从0开始。
- enumerate对象是一个可迭代(Iterable)对象也是一个迭代器(Iterator)对象。
>>> vehicle=['train','bus','car','ship']
>>> vv1=enumerate(vehicle)
>>> type(vv1)
<class 'enumerate'>
>>> from collections.abc import Iterator
>>> isinstance(vv1,Iterator)
True
>>> list(vv1) #enumerate对象vv1转换为列表
[(0, 'train'), (1, 'bus'), (2, 'car'), (3, 'ship')]
>>> vv2=enumerate(vehicle,1) #
>>> type(vv2)
<class 'enumerate'>
>>> isinstance(vv2,Iterator)
True
>>> tuple(vv2) #enumerate对象vv2转换为元组
((1, 'train'), (2, 'bus'), (3, 'car'), (4, 'ship'))
>>> vv2.__next__() #没有下一个元素了,触发迭代停止StopIteration异常
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
vv2.__next__()
StopIteration
>>> vv2=enumerate(vehicle,1) #下标从1开始
>>> vv2.__next__() #返回下一个值
(1, 'train')
>>> vv2.__next__()
(2, 'bus')
>>> vv2.__next__()
(3, 'car')
>>> vv2.__next__()
(4, 'ship')
>>> for i in enumerate(vehicle): #遍历enumerate对象中的元素
print(i,end=' ')
(0, 'train') (1, 'bus') (2, 'car') (3, 'ship')
>>> for i,x in enumerate(vehicle):
print(i,x,end=' ') #遍历enumerate对象元素的下标和值
0 train 1 bus 2 car 3 ship
>>> vv1=enumerate(vehicle)
>>> dict(vv1) #enumerate对象vv1转换为字典
{0: 'train', 1: 'bus', 2: 'car', 3: 'ship'}
>>> vv1=enumerate(vehicle)
>>> set(vv1) #enumerate对象vv1转换为集合
{(3, 'ship'), (2, 'car'), (0, 'train'), (1, 'bus')}
- list()、tuple()、dict()、set()函数能将可迭代(Iterable)对象转换为列表、元组、字典、集合。
>>> stu={'no':1802005,'name':'Lily','sex':'Female'}
>>> list(enumerate(stu))
[(0, 'no'), (1, 'name'), (2, 'sex')]
>>> list(enumerate(stu.keys()))
[(0, 'no'), (1, 'name'), (2, 'sex')]
>>> list(enumerate(stu.values()))
[(0, 1802005), (1, 'Lily'), (2, 'Female')]
>>> list(enumerate(stu.items()))
[(0, ('no', 1802005)), (1, ('name', 'Lily')), (2, ('sex', 'Female'))]
2.zip()
- 格式:zip(iter1 [,iter2 […]])
- 功能:将多个迭代器(Iterator)对象(或者可迭代(Iterable)对象)中的元素压缩到一起,返回一个zip对象。
- zip对象既是一个可迭代(Iterable)对象也是一个迭代器(Iterator)对象。
>>> vehicle=['train','bus','car','ship']
>>> vv1=zip('abcd',vehicle)
>>> list(vv1)
[('a', 'train'), ('b', 'bus'), ('c', 'car'), ('d', 'ship')]
>>> ('b', 'bus') in zip('abcd',vehicle)
True
>>> ('b', 'car') in zip('abcd',vehicle)
False
>>> vv2=zip('abcd',enumerate(vehicle))
>>> list(vv2)
[('a', (0, 'train')), ('b', (1, 'bus')), ('c', (2, 'car')), ('d', (3, 'ship'))]
>>> vv3=zip(range(2),vehicle) #不同长短,匹配完短的结束
>>> list(vv3)
[(0, 'train'), (1, 'bus')]
>>> list(zip(vehicle))
[('train',), ('bus',), ('car',), ('ship',)]
3.map()
- 格式:map(func, *iterables)
- 功能:把一个函数func依次映射到可迭代(Iterable)对象的每个元素上,返回一个map对象。
- map对象既是一个可迭代(Iterable)对象也是一个迭代器(Iterator)对象。
>>> aa=['1','5.6','7.8','9']
>>> bb1=map(float,aa)
>>> bb1
<map object at 0x0000000002F76400>
>>> list(bb1)
[1.0, 5.6, 7.8, 9.0]
>>> list(map(str,range(5)))
['0', '1', '2', '3', '4']
>>> def cc(x,y):
return x**2+y**2
>>> list(map(cc,[1,2],(2,3)))
[5, 13]
>>> list(map(lambda x,y:x**2+y**2,[1,2],(2,3))) #也可以用lambda函数
[5, 13]
4. filter()
- 格式:filter(function or None, iterable)
- 功能:把一个带有一个参数的函数function作用到一个可迭代(Iterable)对象上,返回一个filter对象,filter对象中的元素由可迭代(Iterable)对象中使得函数function返回值为True的那些元素组成;如果指定函数为None,则返回可迭代(Iterable)对象中等价于True的元素。
- filter对象既是一个可迭代(Iterable)对象也是一个迭代器(Iterator)对象。
>>> aa=[5,6,-9,-56,-309,206]
>>> def func(x): #定义函数,x为奇数返回True,否则返回False
return x%2!=0
>>> bb=filter(func,aa)
>>> type(bb) #bb是一个filter对象
<class 'filter'>
>>> list(bb)
[5, -9, -309]