0
点赞
收藏
分享

微信扫一扫

【Python】可迭代对象与迭代器

可迭代对象(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]

举报

相关推荐

0 条评论