6:Python迭代对象与迭代器

1 :Python历史与特点
2:Python的模块、包与库
3:Python输入输出
5:Python详解数据结构
6:Python迭代对象与迭代器
7:Python推导式与序列解包

可迭代(Iterable)对象

表面是:只要可以用 for…in…进行遍历的对象就是可迭代对象
实际上:一个对象实现了__iter__方法,那么这个对象就是可迭代(Iterable)对象。
我们还可以通过调用Python内置函数isinstance()来判断一个对象是否属于可迭代(Iterable)对象。

>>> 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)
True
>>> isinstance(123,Iterable)
False

迭代器(Iterator)

集合实现了__iter__方法,但并未实现__next__方法,这些对象均不能称为迭代器(Iterator)。
 我们还是可以通过调用Python内置函数isinstance()来判断一个对象是否属于迭代器(Iterator)。

>>> 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

无迭代器获取迭代器

虽然列表、元组、字符串、字典、集合都是可迭代(Iterable)对象而不是迭代器(Iterator),但可以通过iter()函数获得一个迭代器(Iterator)。

>>> 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'

相关内置函数

1. enumerate()

格式:enumerate(iterable, start=0)
功能:enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。第1个参数表示可迭代(Iterable)对象,第2个参数表示下标的开始值,默认从0开始。

>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))       # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
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)
功能:map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

>>>def square(x) :            # 计算平方数
...     return x ** 2
... 
>>> map(square, [1,2,3,4,5])   # 计算列表各个元素的平方
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函数
[1, 4, 9, 16, 25]
 
# 提供了两个列表,对相同位置的列表数据进行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]
4. filter()

格式:filter(function or None, iterable)
功能:filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

def is_odd(n):
    return n % 2 == 1
 
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(newlist)

猜你喜欢

转载自blog.csdn.net/qq_42146775/article/details/106530890