概述
1 写在最前
首先明确一点,在Python中:
- 迭代器(Iterator)是一个可迭代(Iterable)对象
- 可迭代对象不一定是迭代器
2 迭代器与可迭代对象
- 迭代器:定义并实现了
__iter__()
和__next__()
方法的对象,可以使用var.__next__()
或next(var)
访问下一个元素。 - 可迭代对象:简而言之,就是可以用
for ... in ...
循环遍历的对象。
在Python中,列表,元组,字符串,字典,集合都是可迭代对象,但是它们都不是迭代器。 原因是,上述对象都内置了__iter__()
方法,但是都未内置__next__()
方法。
from typing import Iterable, Iterator
print(isinstance([], Iterable)) # True
print(isinstance((), Iterable)) # True
print(isinstance("", Iterable)) # True
print(isinstance(dict(), Iterable)) # True
print(isinstance(set(), Iterable)) # True
print(isinstance([], Iterator)) # False
print(isinstance((), Iterator)) # False
print(isinstance("", Iterator)) # False
print(isinstance(dict(), Iterator)) # False
print(isinstance(set(), Iterator)) # False
但是可以使用var__iter__()
或iter(var)
来获取一个迭代器:
from typing import Iterator
nums = [i for i in range(10)]
print(isinstance(nums, Iterator)) # False
nums_iter1 = nums.__iter__()
nums_iter2 = iter(nums)
print(isinstance(nums_iter1, Iterator)) # True
print(isinstance(nums_iter2, Iterator)) # True
3 itertools库——迭代器
3.1 排列组合迭代器
3.1.1 product( )——笛卡尔积
与嵌套的for
循环类似:
import itertools
for i in itertools.product('ABC', '123'):
print(i)
输出结果:
('A', '1')
('A', '2')
('A', '3')
('B', '1')
('B', '2')
('B', '3')
('C', '1')
('C', '2')
('C', '3')
3.1.2 permutations( )——排列
for i in itertools.permutations('ABC', 2): # 2 是排列的长度
print(i)
输出结果:
('A', 'B')
('A', 'C')
('B', 'A')
('B', 'C')
('C', 'A')
('C', 'B')
3.1.3 combinations( )——组合
for i in itertools.combinations('ABC', 2): # 2是组合的长度
print(i)
输出结果:
('A', 'B')
('A', 'C')
('B', 'C')
3.1.4 combinations_with_replacement( )——元素可重复组合
for i in itertools.combinations_with_replacement('ABC', 2): # 2是组合的长度
print(i)
输出结果:
('A', 'A')
('A', 'B')
('A', 'C')
('B', 'B')
('B', 'C')
('C', 'C')
3.2 无穷迭代器
3.2.1 count( )——计数
my_count = itertools.count(start=100, step=2)
3.2.2 cycle( )——循环
my_cycle = itertools.cycle("ABC")
3.2.3 repeat( )——重复
my_repeat = itertools.repeat('A', 3)
3.3 拉链
3.3.1 zip( )——短拉链
长度不一时,执行到最短的对象处,就停止:
from typing import Iterator
my_zip = zip("ABC", "123456")
print(isinstance(my_zip, Iterator))
for i in my_zip:
print(i)
输出结果:
True
('A', '1')
('B', '2')
('C', '3')
3.3.2 zip_longest( )——长拉链
长度不一时,执行到最长的对象处才停止,缺省元素用None或指定字符替代:
from typing import Iterator
my_zip_longest = itertools.zip_longest("ABC", "123456", fillvalue = "#")
print(isinstance(my_zip_longest, Iterator))
for i in my_zip_longest:
print(i)
输出结果:
True
('A', '1')
('B', '2')
('C', '3')
('#', '4')
('#', '5')
('#', '6')
3.4 枚举与锁链
3.4.1 enumerate( )——枚举
产出由两个元素组成的元组,结构是(index, item)
,其中index
从start
开始,item
从可迭代对象中取:
for i in enumerate("ABCDEFG", start=1):
print(i)
输出结果:
(1, 'A')
(2, 'B')
(3, 'C')
(4, 'D')
(5, 'E')
(6, 'F')
(7, 'G')
3.4.2 chain( )——锁链
把一组迭代对象串联起来,形成一个更大的迭代器:
for i in itertools.chain('ABC', [1, 2, 3]):
print(i)
输出结果:
A
B
C
1
2
3
3.5 其他
其他使用方式参见Python官方文档:https://docs.python.org/3/library/itertools.html
最后
以上就是俭朴黄豆为你收集整理的Python三大器——迭代器的全部内容,希望文章能够帮你解决Python三大器——迭代器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复